Skip to content
Back to skills

Component Quality Validator

BSecurity

Validates that generated skills, agents, and hooks are production-ready before use. Scores components against quality criteria and grades them A-F. Triggers: validate component, quality check, production ready, component validation, skill quality, agent quality, hook quality, phase 6.5

  • 5 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added February 7, 2026
developmentgoshellbashexpresstestingdebuggingapisecuritydocumentation

Works with

  • claude code
  • api

Security analysis

B88/100
  • criticalPipes output to a shell interpreter

Pro shows the line behind each finding and how to fix it

Scanned February 12, 2026

npx -y skills add Wania-Kazmi/claude-code-autonomous-agent-workflow --skill component-quality-validator --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Component Quality Validator?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Component Quality Validator
[![Security: B — Skills Directory](https://www.skillsdirectory.com/api/skills/wania-kazmi-component-quality-validator/badge)](https://www.skillsdirectory.com/skills/wania-kazmi-component-quality-validator)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: component-quality-validator
description: |
  Validates that generated skills, agents, and hooks are production-ready before use.
  Scores components against quality criteria and grades them A-F.
  Triggers: validate component, quality check, production ready, component validation,
  skill quality, agent quality, hook quality, phase 6.5
version: 1.0.0
author: Claude Code
allowed-tools:
  - Read
  - Glob
  - Grep
  - Bash
---

# Component Quality Validator

Validates that generated skills, agents, and hooks are **production-ready** before use.

## Quality Philosophy

A component is only valuable if it:
1. **Works correctly** - Executes without errors
2. **Is discoverable** - Can be found when needed (semantic matching)
3. **Is actionable** - Provides clear, specific guidance
4. **Is maintainable** - Easy to update and extend
5. **Is efficient** - Doesn't waste tokens or time

---

## SKILL Quality Criteria

### Required Structure (30%)

```markdown
---
name: kebab-case-name        # REQUIRED: Valid kebab-case
description: |               # REQUIRED: Multi-line with triggers
  What this skill does.
  Triggers: keyword1, keyword2
version: 1.0.0               # REQUIRED: Semantic version
---

# Skill Title                # REQUIRED

## Workflow                  # REQUIRED: Step-by-step
## Code Templates            # REQUIRED: Copy-paste ready
## Validation                # REQUIRED: Success criteria
```

### Quality Checks

| Check | Weight | Pass Criteria |
|-------|--------|---------------|
| **Frontmatter Valid** | 10% | name, description, version present |
| **Name Kebab-Case** | 5% | Matches `/^[a-z][a-z0-9-]*[a-z0-9]$/` |
| **Description Has Triggers** | 10% | Contains "Triggers:" or trigger keywords |
| **Has Workflow Section** | 10% | `## Workflow` or `## Steps` exists |
| **Has Code Templates** | 15% | Contains fenced code blocks (min 2) |
| **Code Syntax Valid** | 15% | Code blocks parse without errors |
| **Has Validation Section** | 10% | `## Validation` or checklist exists |
| **Not Duplicate** | 10% | No existing skill with 80%+ similarity |
| **Token Efficient** | 10% | Under 2000 lines, under 50KB |
| **Has Examples** | 5% | Contains usage examples |

### Validation Script

```bash
#!/bin/bash
# validate-skill.sh <skill-path>

SKILL_PATH="$1"
SCORE=0
TOTAL=100

# Check file exists
if [ ! -f "$SKILL_PATH" ]; then
    echo "FAIL: Skill file not found"
    exit 1
fi

# Check frontmatter
if head -20 "$SKILL_PATH" | grep -q "^---"; then
    if grep -q "^name:" "$SKILL_PATH"; then
        SCORE=$((SCORE + 4))
    fi
    if grep -q "^description:" "$SKILL_PATH"; then
        SCORE=$((SCORE + 3))
    fi
    if grep -q "^version:" "$SKILL_PATH"; then
        SCORE=$((SCORE + 3))
    fi
fi

# Check name is kebab-case
NAME=$(grep "^name:" "$SKILL_PATH" | sed 's/name: *//')
if echo "$NAME" | grep -qE "^[a-z][a-z0-9-]*[a-z0-9]$"; then
    SCORE=$((SCORE + 5))
fi

# Check description has triggers
if grep -qi "trigger" "$SKILL_PATH"; then
    SCORE=$((SCORE + 10))
fi

# Check workflow section
if grep -qE "^## (Workflow|Steps|Process)" "$SKILL_PATH"; then
    SCORE=$((SCORE + 10))
fi

# Check code templates (min 2 code blocks)
CODE_BLOCKS=$(grep -c '```' "$SKILL_PATH")
if [ "$CODE_BLOCKS" -ge 4 ]; then  # 4 = 2 complete blocks (open + close)
    SCORE=$((SCORE + 15))
fi

# Check validation section
if grep -qE "^## (Validation|Verification|Checklist)" "$SKILL_PATH" || grep -q "\- \[ \]" "$SKILL_PATH"; then
    SCORE=$((SCORE + 10))
fi

# Check token efficiency
LINES=$(wc -l < "$SKILL_PATH")
SIZE=$(stat -f%z "$SKILL_PATH" 2>/dev/null || stat -c%s "$SKILL_PATH")
if [ "$LINES" -lt 2000 ] && [ "$SIZE" -lt 51200 ]; then
    SCORE=$((SCORE + 10))
fi

# Check has examples
if grep -qi "example" "$SKILL_PATH"; then
    SCORE=$((SCORE + 5))
fi

# Output result
echo "SKILL QUALITY SCORE: $SCORE/100"

if [ "$SCORE" -ge 70 ]; then
    echo "RESULT: APPROVED"
    exit 0
else
    echo "RESULT: REJECTED"
    exit 1
fi
```

---

## AGENT Quality Criteria

### Required Structure (30%)

```markdown
---
name: agent-name             # REQUIRED
description: |               # REQUIRED
  What this agent does
tools: Read, Write, Edit     # REQUIRED: Minimal necessary tools
model: sonnet                # REQUIRED: haiku|sonnet|opus
---

# Agent Instructions         # REQUIRED

## When to Use              # REQUIRED
## Workflow                 # REQUIRED
## Success Criteria         # REQUIRED
## Failure Handling         # REQUIRED
```

### Quality Checks

| Check | Weight | Pass Criteria |
|-------|--------|---------------|
| **Frontmatter Valid** | 10% | name, description, tools, model present |
| **Model Appropriate** | 15% | Matches task complexity (haiku=simple, sonnet=medium, opus=complex) |
| **Tools Minimal** | 15% | Only necessary tools listed (no "all tools") |
| **Has When to Use** | 10% | Clear trigger conditions |
| **Has Workflow** | 15% | Step-by-step instructions |
| **Has Success Criteria** | 15% | Measurable outcomes |
| **Has Failure Handling** | 10% | What to do when stuck |
| **Instructions Unambiguous** | 10% | No vague phrases like "as needed" |

### Model Selection Validation

```
TASK COMPLEXITY → MODEL MAPPING:

Simple Tasks (haiku):
- File search, pattern matching
- Simple code generation
- Documentation updates
- Format conversions

Medium Tasks (sonnet):
- Feature implementation
- Bug fixes
- Code review
- Test writing
- Most development work

Complex Tasks (opus):
- Architecture design
- Security analysis
- Multi-phase planning
- Complex debugging
- Research and analysis
```

### Validation Script

```bash
#!/bin/bash
# validate-agent.sh <agent-path>

AGENT_PATH="$1"
SCORE=0

# Check frontmatter fields
for FIELD in "name:" "description:" "tools:" "model:"; do
    if grep -q "^$FIELD" "$AGENT_PATH"; then
        SCORE=$((SCORE + 3))
    fi
done

# Check model is valid
MODEL=$(grep "^model:" "$AGENT_PATH" | sed 's/model: *//')
if echo "$MODEL" | grep -qE "^(haiku|sonnet|opus)$"; then
    SCORE=$((SCORE + 15))
fi

# Check tools aren't overly permissive
if ! grep -q "tools:.*\*" "$AGENT_PATH"; then
    SCORE=$((SCORE + 15))
fi

# Check required sections
for SECTION in "When to Use" "Workflow" "Success" "Fail"; do
    if grep -qi "$SECTION" "$AGENT_PATH"; then
        SCORE=$((SCORE + 10))
    fi
done

# Check for vague phrases (deduct if found)
if grep -qiE "(as needed|if necessary|when appropriate|etc\.)" "$AGENT_PATH"; then
    SCORE=$((SCORE - 10))
fi

echo "AGENT QUALITY SCORE: $SCORE/100"
[ "$SCORE" -ge 70 ] && echo "RESULT: APPROVED" && exit 0
echo "RESULT: REJECTED" && exit 1
```

---

## HOOK Quality Criteria

### Required Structure

```json
{
  "hooks": {
    "PreToolUse|PostToolUse|Stop": [
      {
        "matcher": "tool == \"ToolName\" && ...",  // REQUIRED: Valid matcher
        "hooks": [
          {
            "type": "command",
            "command": "#!/bin/bash\n..."         // REQUIRED: Valid bash
          }
        ],
        "description": "What this hook does"      // REQUIRED
      }
    ]
  }
}
```

### Quality Checks

| Check | Weight | Pass Criteria |
|-------|--------|---------------|
| **Valid JSON** | 15% | Parses without errors |
| **Matcher Syntax Valid** | 20% | Uses valid operators (==, &&, matches) |
| **Bash Syntax Valid** | 20% | Shell script parses (bash -n) |
| **Has Description** | 10% | Each hook has description field |
| **No Conflicts** | 15% | Doesn't conflict with existing hooks |
| **Appropriate Timing** | 10% | Pre/Post/Stop matches use case |
| **Error Handling** | 10% | Scripts handle failures gracefully |

### Matcher Syntax Validation

```
VALID MATCHERS:
- tool == "Bash"
- tool == "Edit" && tool_input.file_path matches ".*\\.ts$"
- tool == "Write" && tool_input.content contains "TODO"

INVALID MATCHERS:
- tool = "Bash"           # Wrong operator (= vs ==)
- Tool == "bash"          # Case sensitive
- tool == Bash            # Missing quotes
```

### Validation Script

```bash
#!/bin/bash
# validate-hook.sh <hooks-json-path>

HOOKS_PATH="$1"
SCORE=0

# Check valid JSON
if jq empty "$HOOKS_PATH" 2>/dev/null; then
    SCORE=$((SCORE + 15))
else
    echo "FAIL: Invalid JSON"
    exit 1
fi

# Check each hook has required fields
HOOK_COUNT=$(jq '[.hooks.PreToolUse, .hooks.PostToolUse, .hooks.Stop] | flatten | length' "$HOOKS_PATH")

for i in $(seq 0 $((HOOK_COUNT - 1))); do
    # Check matcher exists
    MATCHER=$(jq -r ".hooks | to_entries | .[].value[$i].matcher // empty" "$HOOKS_PATH")
    if [ -n "$MATCHER" ]; then
        SCORE=$((SCORE + 5))
    fi

    # Check description exists
    DESC=$(jq -r ".hooks | to_entries | .[].value[$i].description // empty" "$HOOKS_PATH")
    if [ -n "$DESC" ]; then
        SCORE=$((SCORE + 3))
    fi
done

# Validate bash syntax in commands
COMMANDS=$(jq -r '.. | .command? // empty' "$HOOKS_PATH")
while IFS= read -r cmd; do
    if [ -n "$cmd" ]; then
        if echo "$cmd" | bash -n 2>/dev/null; then
            SCORE=$((SCORE + 10))
        fi
    fi
done <<< "$COMMANDS"

# Normalize score to 100
SCORE=$((SCORE > 100 ? 100 : SCORE))

echo "HOOK QUALITY SCORE: $SCORE/100"
[ "$SCORE" -ge 70 ] && echo "RESULT: APPROVED" && exit 0
echo "RESULT: REJECTED" && exit 1
```

---

## Quality Gate Integration

### Phase 6.5: COMPONENT VALIDATION (NEW)

After generating components (Phase 5) and before testing (Phase 6):

```
┌─────────────────────────────────────────────────────────────────────────────┐
│                     PHASE 6.5: COMPONENT VALIDATION                          │
│                                                                             │
│  FOR EACH generated component:                                              │
│  ┌─────────────────────────────────────────────────────────────────────────┐│
│  │  1. VALIDATE structure and syntax                                       ││
│  │  2. SCORE against quality criteria (0-100)                              ││
│  │  3. GRADE: A (90+), B (80-89), C (70-79), D (60-69), F (<60)           ││
│  │  4. DECISION:                                                           ││
│  │     - A/B/C: APPROVED → Proceed                                         ││
│  │     - D/F: REJECTED → Regenerate (max 3 attempts)                       ││
│  └─────────────────────────────────────────────────────────────────────────┘│
│                                                                             │
│  OUTPUT: component-validation-report.json                                   │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘
```

### Validation Report Format

```json
{
  "phase": "6.5",
  "timestamp": "2024-01-15T10:30:00Z",
  "components_validated": 5,
  "results": [
    {
      "type": "skill",
      "name": "express-patterns",
      "path": ".claude/skills/express-patterns/SKILL.md",
      "score": 85,
      "grade": "B",
      "decision": "APPROVED",
      "checks": {
        "frontmatter_valid": true,
        "name_kebab_case": true,
        "description_has_triggers": true,
        "has_workflow": true,
        "has_code_templates": true,
        "code_syntax_valid": true,
        "has_validation": false,
        "not_duplicate": true,
        "token_efficient": true,
        "has_examples": true
      },
      "warnings": ["Missing validation section"],
      "suggestions": ["Add ## Validation section with checklist"]
    },
    {
      "type": "agent",
      "name": "api-builder",
      "path": ".claude/agents/api-builder.md",
      "score": 62,
      "grade": "D",
      "decision": "REJECTED",
      "checks": {
        "frontmatter_valid": true,
        "model_appropriate": false,
        "tools_minimal": false,
        "has_when_to_use": true,
        "has_workflow": false,
        "has_success_criteria": false,
        "has_failure_handling": false,
        "instructions_unambiguous": true
      },
      "errors": [
        "Model 'opus' too heavy for simple API generation",
        "Tools list too broad: includes all tools",
        "Missing workflow section",
        "Missing success criteria"
      ],
      "regeneration_hints": [
        "Use 'sonnet' model for API building",
        "Limit tools to: Read, Write, Edit, Bash",
        "Add step-by-step workflow",
        "Define what 'success' looks like"
      ]
    }
  ],
  "summary": {
    "approved": 4,
    "rejected": 1,
    "regeneration_required": true
  }
}
```

---

## Regeneration Protocol

When a component is REJECTED:

```
ATTEMPT 1:
├── Analyze rejection reasons
├── Apply regeneration hints
├── Regenerate component
└── Re-validate

ATTEMPT 2:
├── If still rejected, simplify scope
├── Focus on core functionality only
├── Regenerate with minimal features
└── Re-validate

ATTEMPT 3:
├── If still rejected, use template
├── Copy nearest working component
├── Adapt template to requirements
└── Re-validate

ATTEMPT 4+:
├── STOP
├── Log failure to build report
├── Mark component as MANUAL_REQUIRED
└── Continue with other components
```

---

## Quality Grading Scale

| Grade | Score | Meaning | Action |
|-------|-------|---------|--------|
| **A** | 90-100 | Excellent - Production ready | Approve immediately |
| **B** | 80-89 | Good - Minor improvements possible | Approve with suggestions |
| **C** | 70-79 | Acceptable - Works but not optimal | Approve with warnings |
| **D** | 60-69 | Poor - Significant issues | Reject, regenerate |
| **F** | <60 | Failing - Fundamentally broken | Reject, regenerate with hints |

---

## Quick Reference: What Makes Components Production-Ready

### Skills
- **Discoverable**: Clear triggers in description
- **Actionable**: Step-by-step workflow
- **Copy-Paste Ready**: Working code templates
- **Verifiable**: Success criteria defined

### Agents
- **Right-Sized**: Model matches complexity
- **Minimal Tools**: Only what's needed
- **Clear Instructions**: No ambiguity
- **Handles Failure**: Knows when to stop

### Hooks
- **Valid Syntax**: JSON + Bash parse correctly
- **Targeted**: Precise matchers, no false positives
- **Safe**: Error handling, no destructive defaults
- **Documented**: Purpose is clear

---

## Triggers

Use this skill when:
- Generating new skills/agents/hooks (Phase 5)
- Validating component quality (Phase 6.5)
- Reviewing existing components for improvement
- Debugging why a generated component doesn't work

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…