Documentation Index
Fetch the complete documentation index at: https://mintlify.com/EvoMap/evolver/llms.txt
Use this file to discover all available pages before exploring further.
Overview
The extractSignals() function scans session logs, memory files, and user input to extract structured signals that drive gene selection and evolution intent.
Location: src/gep/signals.js:137
Function Signature
function extractSignals({ recentSessionTranscript, todayLog, memorySnippet, userSnippet, recentEvents })
Parameters
Recent session logs (tail of active sessions)
Recent evolution events for de-duplication
Return Value
Array of extracted signal strings (unique, de-duplicated)
Signal Categories
Defensive Signals (Errors)
Location: src/gep/signals.js:150
// Refined error detection regex
var errorHit = /\[error\]|error:|exception:|iserror":true|"status":\s*"error"|错误\s*[::]|异常\s*[::]/.test(lower);
if (errorHit) signals.push('log_error');
// Error signature for reproducibility
var errLine = lines.find(l => /\b(typeerror|referenceerror|syntaxerror)\b\s*:|error\s*:/i.test(l));
if (errLine) {
var clipped = errLine.replace(/\s+/g, ' ').slice(0, 260);
signals.push('errsig:' + clipped);
}
Defensive Signals:
log_error - Generic error detected
errsig:<signature> - Specific error signature with details
memory_missing - MEMORY.md file not found
user_missing - USER.md file not found
integration_key_missing - Required API key missing
session_logs_missing - No session logs found
protocol_drift - Protocol deviation detected
Recurring Error Detection
Location: src/gep/signals.js:186
var errorCounts = {};
var errPatterns = corpus.match(/(?:LLM error|"error"|"status":\s*"error")[^}]{0,200}/gi) || [];
for (var ep of errPatterns) {
var key = ep.replace(/\s+/g, ' ').slice(0, 100);
errorCounts[key] = (errorCounts[key] || 0) + 1;
}
var recurringErrors = Object.entries(errorCounts).filter(e => e[1] >= 3);
if (recurringErrors.length > 0) {
signals.push('recurring_error');
var topErr = recurringErrors.sort((a, b) => b[1] - a[1])[0];
signals.push('recurring_errsig(' + topErr[1] + 'x):' + topErr[0].slice(0, 150));
}
Output: recurring_errsig(5x):LLM error Unsupported MIME type image/gif
Opportunity Signals (Innovation)
Location: src/gep/signals.js:2
const OPPORTUNITY_SIGNALS = [
'user_feature_request',
'user_improvement_suggestion',
'perf_bottleneck',
'capability_gap',
'stable_success_plateau',
'external_opportunity',
'recurring_error',
'unsupported_input_type',
'evolution_stagnation_detected',
'repair_loop_detected',
'force_innovation_after_repair_loop',
];
Location: src/gep/signals.js:211
// English
var featEn = corpus.match(/\b(add|implement|create|build|make)\b[^.?!\n]{3,120}\b(feature|function|module|capability)\b/i);
if (featEn) featureRequestSnippet = featEn[0].trim().slice(0, 200);
// Chinese (Simplified)
if (/加个|实现一下|做个|想要\s*一个/.test(corpus)) {
var featZh = corpus.match(/.{0,100}(加个|实现一下|做个|想要\s*一个).{0,100}/);
if (featZh) featureRequestSnippet = featZh[0].trim().slice(0, 200);
}
// Chinese (Traditional)
if (/加個|實現一下|做個|想要一個/.test(corpus)) {
var featTw = corpus.match(/.{0,100}(加個|實現一下|做個|想要一個).{0,100}/);
}
// Japanese
if (/追加|実装|作って|機能を/.test(corpus)) {
var featJa = corpus.match(/.{0,100}(追加|実装|作って|機能を).{0,100}/);
}
if (featureRequestSnippet) {
signals.push('user_feature_request:' + featureRequestSnippet);
}
Output: user_feature_request:add support for image/gif uploads to the card renderer
Improvement Suggestion (4 languages)
Location: src/gep/signals.js:244
if (!errorHit) {
var impEn = corpus.match(/.{0,80}\b(should be|could be better|improve|enhance|refactor)\b.{0,80}/i);
if (impEn) improvementSnippet = impEn[0].trim().slice(0, 200);
if (!improvementSnippet && /改进一下|优化一下|简化|重构/.test(corpus)) {
var impZh = corpus.match(/.{0,100}(改进一下|优化一下|简化|重构).{0,100}/);
}
if (improvementSnippet) {
signals.push('user_improvement_suggestion:' + improvementSnippet);
}
}
Location: src/gep/signals.js:283
var toolUsage = {};
var toolMatches = corpus.match(/\[TOOL:\s*([\w-]+)\]/g) || [];
// Extract exec commands to identify benign loops
var execCommands = corpus.match(/exec: (node\s+[\w\/\.-]+\.js\s+ensure)/g) || [];
var benignExecCount = execCommands.length;
for (var toolMatch of toolMatches) {
var toolName = toolMatch.match(/\[TOOL:\s*([\w-]+)\]/)[1];
toolUsage[toolName] = (toolUsage[toolName] || 0) + 1;
}
// Adjust exec count by subtracting benign commands
if (toolUsage['exec']) {
toolUsage['exec'] = Math.max(0, toolUsage['exec'] - benignExecCount);
}
Object.keys(toolUsage).forEach(tool => {
if (toolUsage[tool] >= 10) {
signals.push('high_tool_usage:' + tool);
}
if (tool === 'exec' && toolUsage[tool] >= 5) {
signals.push('repeated_tool_usage:exec');
}
});
Signal De-duplication
Location: src/gep/signals.js:27
Recent History Analysis
function analyzeRecentHistory(recentEvents) {
var recent = recentEvents.slice(-10);
var signalFreq = {};
var tail = recent.slice(-8);
for (var evt of tail) {
var sigs = Array.isArray(evt.signals) ? evt.signals : [];
for (var s of sigs) {
// Normalize: strip details suffix
var key = s.startsWith('errsig:') ? 'errsig'
: s.startsWith('user_feature_request:') ? 'user_feature_request'
: s;
signalFreq[key] = (signalFreq[key] || 0) + 1;
}
}
// Suppress signals that appeared in 3+ of the last 8 events
var suppressedSignals = new Set();
for (var [sig, count] of Object.entries(signalFreq)) {
if (count >= 3) suppressedSignals.add(sig);
}
return { suppressedSignals, recentIntents, consecutiveRepairCount };
}
De-duplication Application
Location: src/gep/signals.js:321
if (history.suppressedSignals.size > 0) {
var beforeDedup = signals.length;
signals = signals.filter(s => {
var key = s.startsWith('errsig:') ? 'errsig'
: s.startsWith('user_feature_request:') ? 'user_feature_request'
: s;
return !history.suppressedSignals.has(key);
});
if (beforeDedup > 0 && signals.length === 0) {
// All signals were suppressed = system is stable but stuck in a loop
signals.push('evolution_stagnation_detected');
signals.push('stable_success_plateau');
}
}
Force Innovation Logic
Location: src/gep/signals.js:341
After Consecutive Repairs
if (history.consecutiveRepairCount >= 3) {
// Remove repair-only signals and inject innovation signals
signals = signals.filter(s =>
s !== 'log_error' && !s.startsWith('errsig:') && !s.startsWith('recurring_errsig')
);
if (signals.length === 0) {
signals.push('repair_loop_detected');
signals.push('stable_success_plateau');
}
signals.push('force_innovation_after_repair_loop');
}
After Empty Cycles
Location: src/gep/signals.js:355
if (history.emptyCycleCount >= 4) {
signals = signals.filter(s =>
s !== 'log_error' && !s.startsWith('errsig:')
);
if (!signals.includes('empty_cycle_loop_detected')) {
signals.push('empty_cycle_loop_detected');
}
if (!signals.includes('stable_success_plateau')) {
signals.push('stable_success_plateau');
}
}
Saturation Detection
Location: src/gep/signals.js:366
// When consecutive empty cycles pile up, signal graceful degradation
if (history.consecutiveEmptyCycles >= 5) {
signals.push('force_steady_state');
signals.push('evolution_saturation');
} else if (history.consecutiveEmptyCycles >= 3) {
signals.push('evolution_saturation');
}
Example Usage
const signals = extractSignals({
recentSessionTranscript: readRealSessionLog(),
todayLog: readRecentLog(TODAY_LOG),
memorySnippet: readMemorySnippet(),
userSnippet: readUserSnippet(),
recentEvents: readAllEvents().slice(-80),
});
console.log('Extracted signals:', signals);
// Output: ['log_error', 'errsig:TypeError: Cannot read property...', 'user_feature_request:add image support']