Help us improve
Share bugs, ideas, or general feedback.
From prepare-delivery
Use when user asks to "validate delivery", "check readiness", or "verify completion". Runs tests, build, and requirement checks with pass/fail instructions.
npx claudepluginhub agent-sh/agentsys --plugin prepare-deliveryHow this skill is triggered — by the user, by Claude, or both
Slash command
/prepare-delivery:validate-deliveryThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Autonomously validate that a task is complete and ready to ship.
Executes the autonomous verification suite (agent-validate) on explicit requests like 'run the validator' or 'validate before commit/push/PR'. Handles status checking, failure extraction, and retry logic.
Runs multi-AI validation, scoring, and code/document review using Codex and Gemini CLIs. Triggers on review or delivery requests during the Double Diamond Deliver phase.
Runs automated checks (build, test, lint) and compares completed work against original requirements before committing.
Share bugs, ideas, or general feedback.
Autonomously validate that a task is complete and ready to ship.
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' };
}
# 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
fi
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
fi
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);
}
# 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=false
const fs = require('fs');
const path = require('path');
const { getStateDirPath } = require('@agentsys/lib/platform/state-dir');
const cwd = process.cwd();
const mapFile = path.join(getStateDirPath(cwd), 'repo-intel.json');
if (!fs.existsSync(mapFile)) {
const response = await AskUserQuestion({
questions: [{
question: 'Generate repo-intel?',
description: 'No repo-intel map found. Generating one enables diff-risk scoring for changed files. Takes ~5 seconds.',
options: [
{ label: 'Yes, generate it', value: 'yes' },
{ label: 'Skip', value: 'no' }
]
}]
});
if (response === 'yes' || response?.['Generate repo-intel?'] === 'yes') {
try {
const { binary } = require('@agentsys/lib');
const output = binary.runAnalyzer(['repo-intel', 'init', cwd]);
const stateDirPath = getStateDirPath(cwd);
if (!fs.existsSync(stateDirPath)) fs.mkdirSync(stateDirPath, { recursive: true });
fs.writeFileSync(mapFile, output);
} catch (e) {
// Binary not available - proceed without
}
}
}
Score changed files by composite risk using repo-intel. This check is advisory - it never causes pass/fail on its own, but raises the bar for high-risk files.
const { binary } = require('@agentsys/lib');
// stateDir and mapFile already defined in pre-check above
function checkDiffRisk(cwd) {
if (!fs.existsSync(mapFile)) {
return { available: false, reason: 'No repo-intel map found' };
}
// Get changed files via git
const changedFiles = getChangedFiles(cwd); // git diff --name-only origin/main..HEAD
if (!changedFiles.length) {
return { available: false, reason: 'No changed files' };
}
const fileList = changedFiles.join(',');
try {
const json = binary.runAnalyzer([
'repo-intel', 'query', 'diff-risk',
'--files', fileList,
'--map-file', mapFile,
cwd
]);
const risks = JSON.parse(json);
const elevated = risks.filter(r => r.riskScore > 0.5);
const high = risks.filter(r => r.riskScore > 0.7);
const requiresTestEvidence = risks.filter(r => r.riskScore > 0.6);
const requiresHumanReview = risks.filter(r => r.riskScore > 0.7);
const parts = [];
if (elevated.length > 0) parts.push(`${elevated.length} files at elevated risk (>0.5)`);
if (high.length > 0) parts.push(`${high.length} files at high risk (>0.7)`);
const summary = parts.length > 0 ? parts.join(', ') : 'All files at normal risk';
return {
available: true,
risks,
summary,
requiresTestEvidence: requiresTestEvidence.map(r => r.path),
requiresHumanReview: requiresHumanReview.map(r => r.path),
};
} catch (e) {
return { available: false, reason: 'diff-risk query failed' };
}
}
Risk scores modify validation strictness but never override pass/fail:
requiresHumanReview in the output so the orchestrator can prompt for confirmation.const diffRisk = checkDiffRisk(cwd);
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 },
diffRisk: diffRisk.available
? { passed: true, advisory: true, summary: diffRisk.summary,
requiresTestEvidence: diffRisk.requiresTestEvidence,
requiresHumanReview: diffRisk.requiresHumanReview }
: { passed: true, advisory: true, skipped: true, reason: diffRisk.reason }
};
// diffRisk is always passed:true - it is advisory only and never blocks shipping
const allPassed = Object.values(checks).every(c => c.passed);
const failedChecks = Object.entries(checks)
.filter(([_, v]) => !v.passed)
.map(([k]) => k);
const riskSummary = diffRisk.available ? diffRisk.summary : null;
workflowState.completePhase({
approved: true,
checks,
summary: 'All validation checks passed',
...(riskSummary && { riskSummary })
});
return { approved: true, checks, ...(riskSummary && { riskSummary }) };
const fixInstructions = generateFixInstructions(checks, failedChecks);
const riskSummary = diffRisk.available ? diffRisk.summary : null;
workflowState.failPhase('Validation failed', {
approved: false,
failedChecks,
fixInstructions,
...(riskSummary && { riskSummary })
});
return { approved: false, failedChecks, fixInstructions, ...(riskSummary && { riskSummary }) };
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(', ') });
}
// Risk-aware instructions (advisory - added alongside other instructions)
if (checks.diffRisk && !checks.diffRisk.skipped) {
if (checks.diffRisk.requiresTestEvidence?.length > 0) {
instructions.push({
action: 'Verify test coverage for high-risk files',
details: checks.diffRisk.requiresTestEvidence.join(', '),
advisory: true
});
}
if (checks.diffRisk.requiresHumanReview?.length > 0) {
instructions.push({
action: 'Flag for human review before shipping',
details: checks.diffRisk.requiresHumanReview.join(', '),
advisory: true
});
}
}
return instructions;
}
{
"approved": true|false,
"checks": {
"reviewClean": { "passed": true },
"testsPassing": { "passed": true },
"buildPassing": { "passed": true },
"requirementsMet": { "passed": true },
"noRegressions": { "passed": true },
"diffRisk": {
"passed": true,
"advisory": true,
"summary": "3 files at elevated risk (>0.5), 1 file at high risk (>0.7)",
"requiresTestEvidence": ["lib/core.js"],
"requiresHumanReview": ["lib/auth.js"]
}
},
"failedChecks": [],
"fixInstructions": [],
"riskSummary": "3 files at elevated risk (>0.5), 1 file at high risk (>0.7)"
}
When repo-intel is unavailable, diffRisk shows as skipped:
{
"diffRisk": { "passed": true, "advisory": true, "skipped": true, "reason": "No repo-intel map found" }
}