agile-v-quality-gates/SKILL.md
Quality validation gates for Agile V agents. Adds interface validation, test quality checks, data type awareness, and time allocation guidance to prevent common failure patterns identified in comprehensive testing.
npx skillsauth add agile-v/agile_v_skills agile-v-quality-gatesInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
You are an Agile V Certified Agent with Quality Gates enabled. This skill adds critical validation checkpoints to prevent common failure patterns identified in comprehensive testing.
Load this skill alongside agile-v-core for enhanced quality assurance.
BEFORE claiming implementation complete:
Foo(a, b), accept Foo(a, b))❌ WRONG - Internal Queueing Only:
def publish(self, topic, message):
# Stores message but NEVER delivers it
self._message_queue[topic].append(message)
✅ RIGHT - Actual Delivery:
def publish(self, topic, message):
# Actually delivers to subscribers
for connection in self._subscriptions[topic]:
connection.send(message) # ← CRITICAL: Must call delivery method
HALT if:
Resume after:
Your tests MUST:
Ask yourself BEFORE claiming tests complete:
Do my tests verify what a CONSUMER would experience?
len(self._queue) == 1connection.received_messages == [expected]Do my tests use the SAME data types as real usage?
age = 35 (number)age = "35" (string from CSV)Do my tests ACTUALLY CALL external methods?
send() was calledmock.send.assert_called_with(expected)Would my tests CATCH the bug if I didn't call the delivery method?
Would my tests CATCH type conversion bugs?
❌ WRONG - Tests Internal State:
def test_publish():
router.subscribe("client1", "topic1")
router.publish("topic1", message)
# Only checks internal queue, not actual delivery
assert len(router._message_queue["client1"]) == 1 # ❌ INSUFFICIENT
✅ RIGHT - Tests External Behavior:
def test_publish():
connection = MockConnection()
router.subscribe("client1", "topic1", connection)
router.publish("topic1", message)
# Checks what consumer receives
assert connection.received_messages == [message] # ✅ CORRECT
HALT if:
Resume after:
For file-based inputs:
❌ WRONG - String Comparison:
def filter_greater_than(data, column, threshold):
# CSV data is strings!
return [row for row in data if row[column] > threshold]
# BUG: "35" > "30" = False in string comparison!
# BUG: "4" > "30" = True in string comparison!
✅ RIGHT - Numeric Conversion:
def filter_greater_than(data, column, threshold):
result = []
for row in data:
try:
# Convert both to numbers for comparison
if float(row[column]) > float(threshold):
result.append(row)
except ValueError:
# Handle non-numeric values
if str(row[column]) > str(threshold): # Fallback to string
result.append(row)
return result
| Source | Native Type | Comparison Needs | Test With |
|--------|-------------|------------------|-----------|
| CSV | strings | float() conversion | "35", "30" |
| JSON | mixed | check schema | Actual JSON |
| XML | strings | conversion | String values |
| Database | typed | usually safe | Actual query results |
| User input | strings | conversion + validation | Raw strings |
HALT if:
int or float directly instead of stringsResume after:
Calculate MINIMUM required time:
Base Time (from complexity) + Multipliers = Minimum Required
| Complexity | Requirements | Minimum Time | Examples | |------------|-------------|--------------|----------| | Simple | 1-5 features, single file | 30-60 min | CSV reader, calculator | | Medium | 6-10 features, multi-file | 60-120 min | REST API, data transformer | | Complex | 11+ features, concurrency, integration | 120-180 min | WebSocket router, distributed system |
ADD to base time if:
Concurrency/Thread Safety: +60 minutes
External Integration: +30 minutes
Complex State Management: +30 minutes
Security/Authentication: +30 minutes
Testing Infrastructure: +20 minutes
Task: WebSocket Message Router
Requirements: 8 features (subscription, publishing, wildcards, limits, stats)
Complexity: Complex (concurrency + state)
Base: 120 min
Multipliers:
+ Concurrency (locks, thread-safe): +60 min
+ External Integration (connections): +30 min
+ Complex State (subscribers, routing): +30 min
TOTAL MINIMUM: 240 minutes (4 hours)
BEFORE starting implementation:
HALT if:
Resume after:
From testing data:
| Task Complexity | Rushed Time | Quality | Adequate Time | Quality | |----------------|-------------|---------|---------------|---------| | Simple | 7 min | 100% | 30 min | 100% | ← Same quality | Complex | 36 min | 68% | 65 min | 100% | ← Time matters!
Lesson: Simple tasks can be fast. Complex tasks need adequate time.
Symptom: Tests fail with "should receive message" but queue has messages
Root Cause: Implementation queues messages but never calls delivery method
Fix: Call connection.send(message) or equivalent
How to Prevent:
Symptom: Filters fail for >, <, >=, <= operators on CSV data
Root Cause: CSV data is strings, string comparison used instead of numeric
Fix: Convert to float() before comparison
How to Prevent:
Symptom: Tests get ERROR (not FAIL) when creating objects
Root Cause: Required parameters in implementation not in task spec
Fix: Make extra parameters optional with defaults
How to Prevent:
Example:
# Task shows: Message(topic, payload)
# ❌ WRONG - Requires extra param:
def __init__(self, topic, payload, sender_id): # ERROR if sender_id not provided
# ✅ RIGHT - Extra param is optional:
def __init__(self, topic, payload, sender_id=None): # Works with 2 or 3 params
Symptom: Self-tests all pass, hidden tests fail
Root Cause: Self-tests check internal state, not external interface
Fix: Test what consumers experience
How to Prevent:
Symptom: Complex task completed very quickly with low quality
Root Cause: No time calculation, rushed to finish
Fix: Calculate minimum time BEFORE starting
How to Prevent:
agile-v-core first (foundation)agile-v-quality-gates (this skill)Include in Evidence Bundle:
{
"quality_gates": {
"interface_validation": "PASS",
"test_quality": "PASS",
"data_type_awareness": "PASS",
"time_allocation": "PASS",
"common_patterns_avoided": ["message_delivery", "string_comparison"]
}
}
This skill works with:
Version: 2.1
Based on: Comprehensive framework testing (May 2026)
Prevents: Interface bugs, type errors, test gaps, rushed implementations
Expected Impact: +12% quality improvement on complex tasks
development
The Verification Agent — challenges Build Agent artifacts via independent verification. Executes tests against artifacts. Use to audit code, schematics, or firmware against requirements.
development
# Skill: system-understanding-agent ## Purpose Use this skill when Agile V is applied to an existing codebase, documentation set, or knowledge base. The skill consumes Understand Anything outputs and creates a concise, reviewable system overview that gives agents sufficient context before modifying code. This is **Gate 0** of the integrated Agile V lifecycle. No requirements should be generated, and no code should be built, until this skill has run and the system overview has been reviewed.
development
# Skill: regression-selection-agent ## Purpose Select and prioritize regression tests based on the impact map and graph dependency relationships. This skill ensures that existing tests are identified, prioritized, and run after a change, and that gaps in test coverage are flagged before the Red Team step. --- ## Trigger conditions Use this skill when: - Existing behavior must not break (regression risk). - An impact map is available. - The change affects shared modules, services, or APIs.
development
# Skill: impact-analysis-agent ## Purpose Identify the likely impact of a proposed change before implementation. This skill maps the change request to graph nodes, identifies affected files, functions, APIs, and tests, and produces a reviewable impact map that gates the Build Agent's context. --- ## Trigger conditions Use this skill when: - A change request targets an existing system. - The change could affect multiple files or modules. - Regression risk exists (the change touches shared c