
Recommend Evolution
- 53 installs
- 36 repo stars
- Updated July 14, 2026
- oimiragieo/agent-studio
Helps with ai & agent building tasks.
About
recommend-evolution is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted development.
- recommend-evolution
- AI & Agent Building
- AI-coding skill
Recommend Evolution by the numbers
- 53 all-time installs (skills.sh)
- Ranked #6,979 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 4, 2026 (Skillselion catalog sync)
npx skills add https://github.com/oimiragieo/agent-studio --skill recommend-evolutionAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 53 |
|---|---|
| repo stars | ★ 36 |
| Last updated | July 14, 2026 |
| Repository | oimiragieo/agent-studio ↗ |
What it does
Helps with ai & agent building tasks.
Files
Recommend Evolution
Overview
Recommend ecosystem evolution when repeated evidence indicates missing capability, and record the recommendation in a standard machine-readable format.
When to Use
- Reflection identifies recurring delivery failures with the same root cause
- Router/analysis signals no suitable agent or skill for recurring requests
- Repeated integration gaps imply missing artifact type or policy
- User explicitly requests a new capability path
Iron Laws
1. NEVER spawn evolution-orchestrator directly from this skill — this skill records recommendations only; execution decisions belong to the orchestrator and approval pipeline. 2. ALWAYS validate trigger type against defined thresholds before recording a recommendation — vague observations are not triggers; require concrete failure counts or routing misses. 3. NEVER create a new evolution request when artifact-integrator or skill-updater would address the gap — reserve evolution for net-new capabilities, not integration or update gaps. 4. ALWAYS append the recommendation to the JSONL queue AND include the required report block in the current output — dual recording ensures the recommendation is discoverable at both runtime and review time. 5. NEVER proceed with a recommendation without evidence — single failures are noise; trigger thresholds exist for a reason.
<identity> Evolution recommendation skill for reflection/planning agents. </identity>
<capabilities>
- Trigger classification (
repeated_error,no_agent,integration_gap,user_request,rubric_regression,stale_skill,other) - Recommendation-vs-integration decision branching
- Dual recording mode: JSONL runtime queue + reflection report block
</capabilities>
Trigger Taxonomy Note
recommend-evolution uses a cause-oriented trigger taxonomy (repeated_error, no_agent, integration_gap, user_request, rubric_regression, stale_skill, other).
This intentionally differs from skill-updater, which uses a caller-oriented trigger taxonomy (reflection, evolve, manual, stale_skill) to describe who/what initiated the update path.
<instructions> <execution_process>
Step 0: Validate Trigger Type
Use these thresholds:
repeated_error: same class of failure in 5+ tasksrubric_regression: repeated score drop below threshold for same class of taskno_agent: recurring need with no valid routing matchintegration_gap: existing artifact integration missing (prefer artifact-integrator)user_request: explicit request for capability not availablestale_skill: audit pipeline reports verified artifact older than 6 months or invalidlastVerifiedAt
Step 1: Decide Recommendation Path
- If gap is integration of existing artifact, prefer:
Skill({ skill: 'artifact-integrator' })
- If gap is stale/underperforming existing skill, prefer:
Skill({ skill: 'skill-updater' })
- If gap requires net-new capability/artifact, continue with evolution recommendation
- If no artifact change needed, update memory only and exit
Step 2: Create Standard Recommendation Payload
Build one JSON object with required fields:
{
"timestamp": "2026-02-14T00:00:00.000Z",
"source": "reflection-agent",
"trigger": "repeated_error",
"evidence": "Same routing failure observed in 6 tasks over 2 days.",
"suggestedArtifactType": "skill",
"summary": "Create a new routing-context skill for reflection-time grounding.",
"status": "proposed"
}Schema reference: .claude/schemas/evolution-request.schema.json
Step 3: Record Recommendation
1. Append JSON line to: .claude/context/runtime/evolution-requests.jsonl 2. Add required report block:
## Evolution Recommendation
- Trigger: <trigger>
- Evidence: <evidence>
- Suggested Artifact Type: <type|null>
- Summary: <1-2 sentences>
- Queue Record: `.claude/context/runtime/evolution-requests.jsonl`Step 3: Output
Return recommendation summary and what was recorded.
</execution_process> </instructions>
<examples> <usage_example> Example Invocations:
// Repeated failure pattern -> recommend skill creation
Skill({
skill: 'recommend-evolution',
args: '--trigger repeated_error --suggestedArtifactType skill',
});
// Routing miss -> recommend new agent/workflow discussion
Skill({ skill: 'recommend-evolution', args: '--trigger no_agent --suggestedArtifactType agent' });</usage_example> </examples>
Anti-Patterns
| Anti-Pattern | Why It Fails | Correct Approach |
|---|---|---|
| Spawning evolution-orchestrator directly from this skill | Violates single-responsibility; bypasses approval and resource gates | Record recommendation to JSONL queue only; let the orchestrator decide on execution |
| Recording an evolution request for an integration gap that already has artifacts | Creates unnecessary new artifacts when an integration fix would suffice | Check artifact-integrator path first; escalate only if gap requires net-new capability |
| Submitting a recommendation without trigger evidence | Uninformed evolution wastes resources and pollutes the queue with noise | Require concrete evidence: failure counts, routing miss logs, or explicit user request |
| Routing stale-skill triggers through this skill instead of skill-updater | Wrong escalation path; creates evolution requests for work that belongs in an update cycle | Route stale_skill triggers directly to skill-updater; only escalate if the skill cannot be updated |
| Triggering evolution after a single failure instance | Single failures are noise; premature evolution wastes build capacity | Apply defined thresholds: 5+ repeated errors, consistent routing misses across sessions |
Memory Protocol (MANDATORY)
Before starting:
Read .claude/context/memory/learnings.md using Read or Node fs.readFileSync (cross-platform).
After completing:
- Recommendation pattern ->
.claude/context/memory/learnings.md - Ambiguous trigger logic ->
.claude/context/memory/issues.md - Evolution policy decision ->
.claude/context/memory/decisions.md
ASSUME INTERRUPTION: Your context may reset. If it's not in memory, it didn't happen.
Invoke the recommend-evolution skill and follow it exactly as presented to you
#!/usr/bin/env node
/**
* Recommend Evolution - Post-Execute Hook
* Runs after the skill executes for cleanup, logging, or follow-up actions.
*
* This hook receives the skill execution result as JSON in process.argv[2]
*/
const fs = require('fs');
const path = require('path');
const { safeParseJSON } = require('../../../lib/utils/safe-json.cjs');
// Parse hook input
const result = safeParseJSON(process.argv[2] || '{}');
console.log('📝 [RECOMMEND-EVOLUTION] Post-execute processing...');
/**
* Process execution result
*/
function processResult(_result) {
// TODO: Add your post-processing logic here
// Examples:
// - Log execution to audit file
// - Send notifications
// - Update memory files
// - Trigger follow-up actions
return { success: true };
}
// Run post-processing
const outcome = processResult(result);
if (outcome.success) {
console.log('✅ [RECOMMEND-EVOLUTION] Post-processing complete');
process.exit(0);
} else {
console.error('⚠️ [RECOMMEND-EVOLUTION] Post-processing had issues');
process.exit(0); // Don't fail the skill for post-processing issues
}
#!/usr/bin/env node
'use strict';
const { ALLOWED_TRIGGERS } = require('../scripts/main.cjs');
const { safeParseJSON } = require('../../../lib/utils/safe-json.cjs');
function validateInput(input) {
const errors = [];
const trigger = String(input.trigger || '').trim();
if (!trigger) {
errors.push('Missing required field: trigger');
} else if (!ALLOWED_TRIGGERS.has(trigger)) {
errors.push(`Invalid trigger: ${trigger}`);
}
if (trigger === 'stale_skill') {
const evidence = String(input.evidence || '').trim();
if (!evidence) {
errors.push('stale_skill requires evidence text');
}
}
return errors;
}
function main(rawInput) {
const input = rawInput || {};
const errors = validateInput(input);
return {
ok: errors.length === 0,
errors,
};
}
if (require.main === module) {
const input = safeParseJSON(process.argv[2] || '{}');
const outcome = main(input);
if (!outcome.ok) {
console.error(JSON.stringify(outcome, null, 2));
process.exit(1);
}
console.log(JSON.stringify(outcome));
process.exit(0);
}
module.exports = {
validateInput,
main,
};
recommend-evolution Research Requirements
Generated: 2026-02-28
Skill Description
Detect capability gaps and record standardized evolution recommendations.
Research Areas
- Current best practices for recommend-evolution
- Industry standards and tooling
- Integration patterns
Source References
- To be populated by skill-updater research phase
recommend-evolution Rules
Purpose
Detect capability gaps and record standardized evolution recommendations.
Best Practices
- Follow established patterns
- Validate inputs at boundaries
Integration Points
See SKILL.md for complete documentation.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "recommend-evolution Input Schema",
"description": "Input validation schema for recommend-evolution skill",
"type": "object",
"required": ["trigger"],
"properties": {
"trigger": {
"type": "string",
"enum": [
"repeated_error",
"no_agent",
"integration_gap",
"user_request",
"rubric_regression",
"stale_skill",
"other"
]
},
"evidence": {
"type": "string",
"minLength": 1
},
"summary": {
"type": "string",
"minLength": 1
},
"source": {
"type": "string",
"minLength": 1
},
"suggestedArtifactType": {
"type": "string",
"enum": ["skill", "agent", "workflow", "hook", "schema", "command"]
}
},
"allOf": [
{
"if": {
"properties": {
"trigger": {
"const": "stale_skill"
}
}
},
"then": {
"required": ["evidence"]
}
}
],
"additionalProperties": true
}
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "recommend-evolution Output Schema",
"description": "Output validation schema for recommend-evolution skill",
"type": "object",
"required": ["success"],
"properties": {
"success": {
"type": "boolean",
"description": "Whether the skill executed successfully"
},
"result": {
"type": "object",
"description": "The skill execution result",
"additionalProperties": true
},
"error": {
"type": "string",
"description": "Error message if execution failed"
}
},
"additionalProperties": true
}
#!/usr/bin/env node
'use strict';
const fs = require('node:fs');
const path = require('node:path');
const crypto = require('node:crypto');
const ALLOWED_TRIGGERS = new Set([
'repeated_error',
'no_agent',
'integration_gap',
'user_request',
'rubric_regression',
'stale_skill',
'other',
]);
function findProjectRoot() {
let dir = __dirname;
while (dir !== path.parse(dir).root) {
if (fs.existsSync(path.join(dir, '.claude'))) return dir;
if (path.basename(dir) === '.claude') return path.dirname(dir);
dir = path.dirname(dir);
}
return process.cwd();
}
const PROJECT_ROOT = findProjectRoot();
const EVOLUTION_QUEUE_PATH = path.join(
PROJECT_ROOT,
'.claude',
'context',
'runtime',
'evolution-requests.jsonl'
);
function parseArgs(argv) {
const options = {};
for (let i = 0; i < argv.length; i++) {
const arg = argv[i];
if (!arg.startsWith('--')) continue;
const key = arg.slice(2);
const next = argv[i + 1];
const hasValue = next && !next.startsWith('--');
options[key] = hasValue ? argv[++i] : true;
}
return options;
}
function normalizeTrigger(trigger) {
const value = String(trigger || '').trim();
return ALLOWED_TRIGGERS.has(value) ? value : null;
}
function toText(value, fallback = '') {
const text = String(value == null ? '' : value).trim();
return text || fallback;
}
function ensureQueueDir(queuePath = EVOLUTION_QUEUE_PATH) {
fs.mkdirSync(path.dirname(queuePath), { recursive: true });
}
function buildRequest(options = {}) {
const trigger = normalizeTrigger(options.trigger);
if (!trigger) {
return { ok: false, error: 'Invalid or missing --trigger' };
}
const suggestedArtifactType = toText(
options.suggestedArtifactType || options.suggested_artifact_type,
null
);
const source = toText(options.source, 'recommend-evolution');
const evidence = toText(
options.evidence,
trigger === 'stale_skill' ? 'Stale artifact detected by audit.' : 'No evidence provided.'
);
const summary = toText(
options.summary,
'Recommend capability evolution based on repeated signals.'
);
const now = new Date().toISOString();
const idInput = `${trigger}|${suggestedArtifactType || 'unknown'}|${summary}|${evidence}`;
// M-03: non-security use (cache key / content addressing / UUID namespace); MD5/SHA-1 acceptable
const id = `evo_${crypto.createHash('sha1').update(idInput).digest('hex').slice(0, 12)}`;
return {
ok: true,
request: {
id,
timestamp: now,
source,
trigger,
evidence,
suggestedArtifactType: suggestedArtifactType || null,
summary,
status: 'proposed',
},
};
}
function appendQueueEntry(entry, queuePath = EVOLUTION_QUEUE_PATH) {
ensureQueueDir(queuePath);
const line = `${JSON.stringify(entry)}\n`;
fs.appendFileSync(queuePath, line, 'utf8');
return queuePath;
}
function main(input = null) {
const options = input || parseArgs(process.argv.slice(2));
if (options.help) {
return {
success: true,
usage:
'node .claude/skills/recommend-evolution/scripts/main.cjs --trigger <type> [--suggestedArtifactType skill|agent|workflow|hook|schema|command] [--summary <text>] [--evidence <text>] [--source <text>]',
};
}
const built = buildRequest(options);
if (!built.ok) {
return {
success: false,
error: built.error,
};
}
const queuePath = appendQueueEntry(built.request, EVOLUTION_QUEUE_PATH);
return {
success: true,
result: {
request: built.request,
queuePath: path.relative(PROJECT_ROOT, queuePath).replace(/\\/g, '/'),
},
};
}
if (require.main === module) {
const result = main();
if (result.usage) {
console.log(result.usage);
process.exit(0);
}
console.log(JSON.stringify(result, null, 2));
process.exit(result.success ? 0 : 1);
}
module.exports = {
ALLOWED_TRIGGERS,
parseArgs,
normalizeTrigger,
buildRequest,
appendQueueEntry,
main,
EVOLUTION_QUEUE_PATH,
};
recommend-evolution Implementation Template
Goal
- Define target outcome and acceptance criteria.
TDD
1. Red 2. Green 3. Refactor
Verification
- lint
- format
- targeted tests