| name | automation-validator |
| description | Validates automation workflow JSON before deployment for Power Automate, n8n, Make, Zapier and other platforms. Checks syntax, structure, best practices, and potential issues. Analyzes workflow JSON files for platform compliance, missing error handling, performance issues, and security concerns. Use when user wants to validate, review, or check a workflow before deployment/import. |
| allowed-tools | Read, Grep, Glob |
Automation Workflow Validator
Comprehensive pre-deployment validator for automation workflow JSON definitions across multiple platforms.
Supported Platforms
- Power Automate (Microsoft)
- n8n (Open-source)
- Make (formerly Integromat)
- Zapier
- Other JSON-based workflow platforms
Purpose
Validates automation workflows against:
- Syntax correctness - Valid JSON, proper structure
- Platform compliance - Schema, required fields, valid operations (platform-specific)
- Best practices - Error handling, performance, reliability
- Security - Hardcoded credentials, injection risks
- Documentation compliance - Connector/node limits, known constraints
When This Skill Activates
Triggers on:
- "Validate this workflow JSON"
- "Check this workflow JSON before deployment"
- "Review my workflow JSON for [platform]"
- "Is this flow ready to paste into Power Automate/n8n/Make?"
- "Validate my n8n workflow"
- "Lint this automation"
- "Pre-deployment check"
- Workflow JSON files - Any JSON with workflow/flow/automation context (examples: flow.json, workflow.json, scenario.json, automation.json, fixed_flow.json)
Validation Checklist
1. Syntax Validation
JSON Structure:
- Valid JSON syntax (balanced brackets, proper escaping)
- No trailing commas
- Proper string escaping for expressions
- No invalid characters
Power Automate Schema:
- Correct $schema URL
- Required root elements: definition, schemaVersion
- Parameters include $connections
- Valid contentVersion format
Structure:
{
"definition": {
"$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
"contentVersion": "1.0.0.0",
"parameters": { /* Required */ },
"triggers": { /* Required */ },
"actions": { /* Required */ },
"outputs": {}
},
"schemaVersion": "1.0.0.0"
}
2. Triggers Validation
Required Fields:
- At least one trigger defined
- Trigger has "type" field
- Trigger has "inputs" object
- Valid trigger types: Request, Recurrence, ApiConnection, etc.
Common Issues:
- Missing "kind" in Request triggers
- Invalid recurrence frequency
- Missing required parameters for ApiConnection triggers
Example Check:
// GOOD
"triggers": {
"manual": {
"type": "Request",
"kind": "Button", // Required for manual triggers
"inputs": {
"schema": {}
}
}
}
// BAD - missing kind
"triggers": {
"manual": {
"type": "Request",
"inputs": {}
}
}
3. Actions Validation
Required Fields:
- Each action has "type"
- Each action has "inputs"
- Each action has "runAfter" (or is first action)
- Valid action types
runAfter Chain:
- No orphaned actions (all connected to trigger)
- No circular dependencies
- runAfter references exist
- Proper status values: Succeeded, Failed, Skipped, TimedOut
GUID Validation:
- All GUIDs are valid format (if present)
- No duplicate GUIDs
- operationMetadataId unique per action
Example Check:
// GOOD
"actions": {
"Action_1": {
"type": "Compose",
"inputs": "test",
"runAfter": {} // First action
},
"Action_2": {
"type": "Compose",
"inputs": "test2",
"runAfter": {
"Action_1": ["Succeeded"] // References existing action
}
}
}
// BAD - Action_2 references non-existent action
"actions": {
"Action_2": {
"type": "Compose",
"inputs": "test",
"runAfter": {
"NonExistent": ["Succeeded"]
}
}
}
4. Expression Validation
Common Expression Errors:
- All expressions start with @
- Proper function syntax
- Valid function names
- Correct parameter counts
- Proper string quoting inside expressions
Check Patterns:
// GOOD
"@body('Get_Item')?['property']"
"@concat('Hello ', variables('Name'))"
"@if(equals(1, 1), 'true', 'false')"
// BAD
"body('Get_Item')['property']" // Missing @
"@concat(Hello, variables('Name'))" // Unquoted string
"@if(equals(1, 1) 'true', 'false')" // Missing comma
Safe Navigation:
- Use ?[] for optional properties
- Null checks for nullable values
- Default values with coalesce()
4.5. Data Structure Validation (NEW!)
CRITICAL CHECK: Verify data type consistency throughout flow
Array Type Consistency:
- Check Query/Filter actions for data type indicators
- Verify
item()vsitem()?['Property']usage consistency - Validate loop
items()usage matches source data structure - Ensure Select actions output correct structure
Pattern Detection:
// INCONSISTENT (BUG RISK):
// Filter uses:
"where": "@contains(item(), 'text')" // ← Array of strings
// But loop uses:
"value": "@items('Loop')?['PropertyName']" // ← Accessing property on string = ERROR
// CONSISTENT (CORRECT):
// Filter uses:
"where": "@contains(item(), 'text')" // ← Array of strings
// Loop uses:
"value": "@items('Loop')" // ← Direct string access = CORRECT
Validation Checks:
- All Query actions: Check if
whereusesitem()oritem()?['Prop'] - All Foreach loops: Verify
items()access matches source type - All Select actions: Verify mappings create expected structure
- Cross-reference: Filter → Loop → SetVariable consistency
Common Bugs to Detect:
// BUG PATTERN 1: Property access on primitives
{
"Filter": {
"where": "@contains(item(), 'value')" // String array
},
"Loop": {
"foreach": "@body('Filter')",
"actions": {
"BugAction": {
"value": "@items('Loop')?['Nom']" // ❌ ERROR: Can't access property on string
}
}
}
}
// BUG PATTERN 2: Empty Select mapping
{
"Select": {
"select": {
"Nom": "" // ❌ ERROR: Empty mapping creates useless output
}
}
}
// BUG PATTERN 3: Inconsistent data access
{
"Compose1": {
"inputs": "@item()?['Name']" // Expects objects
},
"Compose2": {
"inputs": "@item()" // Treats as primitives
}
// ❌ ERROR: Inconsistent - which is it?
}
Validation Actions:
- ⚠️ WARNING if data structure inconsistency detected
- ⚠️ WARNING if Select action has empty mappings
- ⚠️ WARNING if
item()usage is inconsistent across actions - ❌ ERROR if property access clearly mismatches source type
5. Best Practices Validation
Error Handling:
- Critical actions wrapped in Scope
- Scope has corresponding error handler
- Error handler uses "Configure run after"
- Proper handling of Failed, TimedOut states
Example:
"Scope_Main": {
"type": "Scope",
"actions": { /* critical actions */ }
},
"Handle_Errors": {
"type": "Compose",
"inputs": "Error occurred",
"runAfter": {
"Scope_Main": ["Failed", "TimedOut"]
}
}
Performance:
- Apply to each has concurrency configured for API calls
- Delays present in loops with API calls
- Filtering at source (not in Apply to each)
- Do until has timeout and count limits
Reliability:
- Retry policies for transient errors
- Idempotent operations where possible
- Proper timeout configuration
- Variable initialization at flow start
6. Security Validation
Critical Issues:
- No hardcoded passwords or API keys
- No hardcoded connection strings
- Credentials use secure parameters
- Sensitive data not logged in plain text
Check for:
// BAD - hardcoded credentials
"inputs": {
"authentication": {
"password": "MyPassword123", // SECURITY ISSUE
"username": "admin@contoso.com"
}
}
// GOOD - parameterized
"inputs": {
"authentication": {
"password": "@parameters('$connections')['connection']['password']",
"username": "@parameters('$connections')['connection']['username']"
}
}
Injection Risks:
- User input sanitized
- SQL queries parameterized
- Dynamic URLs validated
- File paths validated
7. Connector-Specific Validation
SharePoint:
- API calls respect 600/60s limit
- Delays present in loops
- List names don't contain periods
- Attachment size checks (90MB)
OneDrive:
- API calls respect 100/60s limit
- File size checks (50MB for triggers)
- Proper delays (3 seconds recommended)
HTTP:
- Timeout configured
- Retry policy for transient failures
- Authentication configured
- URL validation for user input
Control (Apply to each):
- Concurrency set for API operations
- Max 5000 items (default)
- Proper error handling inside loop
Do Until:
- Timeout configured
- Count limit configured
- Exit condition will eventually be true
8. Documentation Compliance
Reference PowerAutomateDocs:
- Actions use documented parameters
- Respect documented limitations
- Follow recommended patterns
- Match documented examples
Check against:
- PowerAutomateDocs/{Connector}/overview.md → Limitations
- PowerAutomateDocs/{Connector}/actions.md → Parameters
- PowerAutomateDocs/BuiltIn/ → Built-in connector patterns
Validation Output Format
# Power Automate Flow Validation Report
## Overall Status: ✅ PASS / ⚠️ WARNINGS / ❌ FAIL
---
## Syntax Validation
**Status**: ✅ Pass
- ✅ Valid JSON syntax
- ✅ Correct Power Automate schema
- ✅ All required root elements present
---
## Structure Validation
**Status**: ✅ Pass
### Triggers
- ✅ 1 trigger defined: "manual"
- ✅ Trigger type valid: Request
- ✅ Required fields present
### Actions
- ✅ 5 actions defined
- ✅ All actions have required fields
- ✅ runAfter chain valid (no orphans)
- ✅ No circular dependencies
---
## Best Practices
**Status**: ⚠️ Warnings
### Error Handling
- ⚠️ **Missing error handling** for "Get_Items" action
- Recommendation: Wrap in Scope with error handler
- Impact: Flow fails completely on error
### Performance
- ✅ Apply to each has concurrency configured
- ⚠️ **No delay in API loop**
- Recommendation: Add 1-second delay after "Get_Items"
- Impact: Risk of throttling (429 errors)
### Reliability
- ✅ Variables initialized
- ✅ Do until has timeout configured
---
## Security
**Status**: ✅ Pass
- ✅ No hardcoded credentials
- ✅ Using connection parameters
- ✅ No SQL injection risks
- ✅ Sensitive data properly handled
---
## Connector-Specific
**Status**: ⚠️ Warnings
### SharePoint (Get Items)
- ⚠️ **Throttling risk**: 100 iterations with no delays
- Limit: 600 calls/60 seconds
- Recommendation: Add 1-second delay or reduce concurrency
- Reference: PowerAutomateDocs/SharePoint/overview.md
- ✅ Attachment size checks present
- ✅ List names valid (no periods)
---
## Critical Issues: 0
## Warnings: 3
## Passed Checks: 28
---
## Recommendations (Priority Order)
### High Priority
1. **Add error handling for Get_Items**
```json
"Scope_GetItems": {
"type": "Scope",
"actions": {
"Get_Items": { /* existing action */ }
}
},
"Handle_Errors": {
"runAfter": {
"Scope_GetItems": ["Failed", "TimedOut"]
}
}
- Add delay to prevent throttling
"Delay": { "type": "Wait", "inputs": { "interval": { "count": 1, "unit": "Second" } }, "runAfter": { "Get_Items": ["Succeeded"] } }
Medium Priority
- Add timeout to HTTP action
- Current: No timeout (default 2 minutes)
- Recommended: Explicit timeout configuration
Ready for Deployment?
✅ YES - Flow is syntactically valid and can be pasted into Power Automate
⚠️ WITH WARNINGS - Flow will work but has performance/reliability risks
❌ NO - Critical issues must be fixed before deployment
Next Steps
- Review warnings above
- Apply high-priority recommendations
- Test with sample data
- Monitor first runs for issues
- Revisit validation after changes
Validation Metadata
- Validated: [timestamp]
- Flow Actions: 5
- Triggers: 1
- Connectors Used: SharePoint, Control
- Total Checks: 31
## Validation Levels
### Level 1: Syntax (Blocking)
**Must pass** - Flow won't paste into Power Automate
- Invalid JSON
- Missing required structure
- Invalid schema
### Level 2: Structure (Blocking)
**Must pass** - Flow won't run
- Invalid runAfter chains
- Missing action types
- Invalid expression syntax
### Level 3: Best Practices (Warnings)
**Should fix** - Flow runs but has risks
- Missing error handling
- No throttling mitigation
- Poor performance patterns
### Level 4: Optimization (Suggestions)
**Nice to have** - Improvements
- Better variable naming
- More efficient queries
- Enhanced logging
## Quick Validation Commands
For specific checks without full validation:
### Check Syntax Only
"Validate JSON syntax in workflow JSON"
### Check Best Practices Only
"Review best practices in this flow"
### Check Specific Connector
"Validate SharePoint usage in workflow JSON"
### Security Scan Only
"Security scan this Power Automate flow"
## Integration with Other Skills
**Before using workflow-builder**:
- Validate requirements are complete
- Check for known limitations
**After using automation-debugger**:
- Validate the fixed workflow JSON
- Ensure all issues resolved
- Verify no new issues introduced
**Before deployment**:
- Always run full validation
- Review warnings
- Document any accepted risks
## Common Validation Failures
### 1. Missing runAfter
```json
// FAIL
"actions": {
"Action_2": {
"type": "Compose",
"inputs": "test"
// Missing runAfter
}
}
Fix: Add "runAfter": {} for first action or reference predecessor
2. Invalid Expression
// FAIL
"inputs": "@body('Get_Item')['property']" // Will fail if property missing
Fix: "@body('Get_Item')?['property']" with safe navigation
3. No Error Handling
// FAIL
"Get_Items": { /* API call with no error handling */ }
Fix: Wrap in Scope with error handler
4. Throttling Risk
// FAIL
"Apply_to_each": {
"foreach": "@range(0, 1000)", // 1000 API calls
"runtimeConfiguration": {
"concurrency": {
"repetitions": 50 // 50 parallel
}
}
}
Fix: Reduce concurrency to 1, add delays
5. Missing Timeout
// FAIL
"Do_until": {
"expression": "@equals(variables('Done'), true)"
// No limit
}
Fix: Add "limit": {"count": 60, "timeout": "PT1H"}
Best Practices Enforcement
Enable strict mode for production flows:
- All errors must have handlers
- All loops must have limits
- All API calls must have delays
- All expressions must be safe
- No hardcoded values
- Full documentation compliance
Examples
User: "Validate my workflow JSON before I paste it"
Skill Response:
- Reads workflow JSON file
- Runs all validation checks
- Generates detailed report
- Highlights critical issues
- Provides fix recommendations
- Gives deployment readiness status
User: "Quick syntax check on my fixed workflow JSON"
Skill Response:
- Reads workflow JSON file
- Validates JSON syntax
- Checks platform-specific schema
- Confirms structure validity
- Returns pass/fail status
Supporting Files
See also:
- [Power Automate JSON Format](../../../PowerAutomateDocs/platform-specific format documentation) - Schema requirements
- Error Patterns - Common issues to check for
- Repository Guide - Full documentation standards
Version: 1.1 Last Updated: 2025-10-31
Changelog
Version 1.1 (2025-10-31)
Major Improvements:
- ✅ Added Section 4.5: Data Structure Validation (NEW!) - Validates data type consistency
- ✅ Detects property access on primitives (critical bug pattern)
- ✅ Validates Select action mappings for empty/incorrect values
- ✅ Checks Filter → Loop → SetVariable consistency
- ✅ Identifies
item()vsitem()?['Property']mismatches
New Validation Checks:
- Array type consistency validation
- Query/Filter pattern detection (
item()vsitem()?['Prop']) - Foreach loop data access validation
- Select action output structure verification
- Cross-action data flow consistency
Bug Patterns Now Detected:
- Property access on string primitives (
items('Loop')?['Prop']on string array) - Empty Select mappings (
"Nom": "") - Inconsistent data access patterns across actions
Impact:
- Catches critical structural bugs before deployment
- Prevents runtime errors from data type mismatches
- Reduces failed deployments due to data structure issues
- Complements automation-debugger for pre-deployment validation