
Validate Delivery
- 66 installs
- 931 repo stars
- Updated July 26, 2026
- avifenesh/agentsys
validate-delivery is a skill that autonomously validates a task is complete by running tests, build, and requirement checks.
About
validate-delivery autonomously checks whether a task is complete and ready to ship. It runs the project's tests and build, verifies extracted requirements are implemented, and compares test counts to catch regressions. It returns a structured JSON verdict with pass/fail per check and specific fix instructions for an orchestrator to retry.
- Runs tests, build, and requirement checks to decide if work is ready to ship
- Detects the runner (npm/pytest/cargo/go) and compares before/after test counts for regressions
- Returns an approved/failed JSON verdict with specific fix instructions, fully autonomous
Validate Delivery by the numbers
- 66 all-time installs (skills.sh)
- Ranked #1,120 of 2,153 Testing & QA skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
validate-delivery capabilities & compatibility
- Capabilities
- test runner · build check · requirement verification · regression check
- Use cases
- testing · ci cd
- Pricing
- Free
What validate-delivery says it does
Autonomously validate that a task is complete and ready to ship.
NO human intervention - fully autonomous
Generates specific fix instructions on failure
npx skills add https://github.com/avifenesh/agentsys --skill validate-deliveryAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 66 |
|---|---|
| repo stars | ★ 931 |
| Last updated | July 26, 2026 |
| Repository | avifenesh/agentsys ↗ |
What it does
Autonomously gate a task as ship-ready by running tests, build, and requirement checks.
Who is it for?
Autonomously gating whether tests, build, and requirements pass before shipping.
Skip if: Manual, human-in-the-loop review or fixing the failures itself.
When should I use this skill?
When asked to validate delivery, check readiness, or verify completion.
What you get
An approved/failed verdict with per-check results and concrete fix instructions.
- approval verdict json with fix instructions
By the numbers
- 5 validation checks
- supports npm/pytest/cargo/go runners
Files
validate-delivery
Autonomously validate that a task is complete and ready to ship.
Validation Checks
Check 1: Review Status
function checkReviewStatus(reviewResults) {
if (!reviewResults) return { passed: false, reason: 'No review results' };
if (reviewResults.approved) return { passed: true };
if (reviewResults.override) return { passed: true, override: true };
return { passed: false, reason: 'Review not approved' };
}Check 2: Tests Pass
# Detect test runner and run
if grep -q '"test"' package.json; then
npm test; TEST_EXIT_CODE=$?
elif [ -f "pytest.ini" ]; then
pytest; TEST_EXIT_CODE=$?
elif [ -f "Cargo.toml" ]; then
cargo test; TEST_EXIT_CODE=$?
elif [ -f "go.mod" ]; then
go test ./...; TEST_EXIT_CODE=$?
else
TEST_EXIT_CODE=0 # No tests
fiCheck 3: Build Passes
if grep -q '"build"' package.json; then
npm run build; BUILD_EXIT_CODE=$?
elif [ -f "Cargo.toml" ]; then
cargo build --release; BUILD_EXIT_CODE=$?
elif [ -f "go.mod" ]; then
go build ./...; BUILD_EXIT_CODE=$?
else
BUILD_EXIT_CODE=0 # No build step
fiCheck 4: Requirements Met
async function checkRequirementsMet(task, changedFiles) {
const requirements = extractRequirements(task.description);
const results = [];
for (const req of requirements) {
const implemented = await verifyRequirement(req, changedFiles);
results.push({ requirement: req, implemented });
}
return {
passed: results.every(r => r.implemented),
requirements: results
};
}
function extractRequirements(description) {
const reqs = [];
// Extract bullet points: - Item
const bullets = description.match(/^[-*]\s+(.+)$/gm);
if (bullets) reqs.push(...bullets.map(m => m.replace(/^[-*]\s+/, '')));
// Extract numbered items: 1. Item
const numbered = description.match(/^\d+\.\s+(.+)$/gm);
if (numbered) reqs.push(...numbered.map(m => m.replace(/^\d+\.\s+/, '')));
return [...new Set(reqs)].slice(0, 10);
}Check 5: No Regressions
# Compare test counts before/after changes
git stash
BEFORE=$(npm test 2>&1 | grep -oE '[0-9]+ passing' | grep -oE '[0-9]+')
git stash pop
AFTER=$(npm test 2>&1 | grep -oE '[0-9]+ passing' | grep -oE '[0-9]+')
[ "$AFTER" -lt "$BEFORE" ] && REGRESSION=true || REGRESSION=falseAggregate Results
const checks = {
reviewClean: checkReviewStatus(reviewResults),
testsPassing: { passed: TEST_EXIT_CODE === 0 },
buildPassing: { passed: BUILD_EXIT_CODE === 0 },
requirementsMet: await checkRequirementsMet(task, changedFiles),
noRegressions: { passed: !REGRESSION }
};
const allPassed = Object.values(checks).every(c => c.passed);
const failedChecks = Object.entries(checks)
.filter(([_, v]) => !v.passed)
.map(([k]) => k);Decision and Output
If All Pass
workflowState.completePhase({
approved: true,
checks,
summary: 'All validation checks passed'
});
return { approved: true, checks };If Any Fail
const fixInstructions = generateFixInstructions(checks, failedChecks);
workflowState.failPhase('Validation failed', {
approved: false,
failedChecks,
fixInstructions
});
return { approved: false, failedChecks, fixInstructions };Fix Instructions Generator
function generateFixInstructions(checks, failedChecks) {
const instructions = [];
if (failedChecks.includes('testsPassing')) {
instructions.push({ action: 'Fix failing tests', command: 'npm test' });
}
if (failedChecks.includes('buildPassing')) {
instructions.push({ action: 'Fix build errors', command: 'npm run build' });
}
if (failedChecks.includes('requirementsMet')) {
const unmet = checks.requirementsMet.requirements
.filter(r => !r.implemented)
.map(r => r.requirement);
instructions.push({ action: 'Implement missing', details: unmet.join(', ') });
}
return instructions;
}Output Format
{
"approved": true|false,
"checks": {
"reviewClean": { "passed": true },
"testsPassing": { "passed": true },
"buildPassing": { "passed": true },
"requirementsMet": { "passed": true },
"noRegressions": { "passed": true }
},
"failedChecks": [],
"fixInstructions": []
}Constraints
- NO human intervention - fully autonomous
- Returns structured JSON for orchestrator
- Generates specific fix instructions on failure
- Workflow retries automatically after fixes