Overview
The buildMutation() function creates a structured mutation object that defines the intent, target, and risk level of an evolution cycle.
Location: src/gep/mutation.js:100
Function Signature
function buildMutation ({
signals ,
selectedGene ,
driftEnabled ,
personalityState ,
allowHighRisk = false ,
target ,
expected_effect ,
})
Parameters
Current signals extracted from logs
Selected Gene object (used for target if not provided)
Current personality state with rigor and risk_tolerance
Allow high-risk mutations (guarded by strict safety constraints)
Mutation target (defaults to gene:<geneId> or behavior:protocol)
Expected effect description (auto-generated from category if not provided)
Return Value
Unique mutation ID (e.g., mut_1678901234567)
Mutation category: repair, optimize, or innovate
Array of unique signals that triggered this mutation
Target of mutation (e.g., gene:gene_gep_repair_from_errors)
Human-readable description of expected outcome
Risk level: low, medium, or high
Category Selection
Location: src/gep/mutation.js:54
function mutationCategoryFromContext ({ signals , driftEnabled }) {
if ( hasErrorishSignal ( signals )) return 'repair' ;
if ( driftEnabled ) return 'innovate' ;
if ( hasOpportunitySignal ( signals )) return 'innovate' ;
// Consult strategy preset
try {
const strategy = require ( './strategy' ). resolveStrategy ();
if ( strategy && strategy . innovate >= 0.5 ) return 'innovate' ;
} catch ( _ ) {}
return 'optimize' ;
}
Signal Analysis
Location: src/gep/mutation.js:23
function hasErrorishSignal ( signals ) {
const list = signals . map ( s => String ( s || '' ));
if ( list . includes ( 'issue_already_resolved' ) || list . includes ( 'openclaw_self_healed' )) {
return false ; // Not an error if already resolved
}
if ( list . includes ( 'log_error' )) return true ;
if ( list . some ( s => s . startsWith ( 'errsig:' ) || s . startsWith ( 'errsig_norm:' ))) return true ;
return false ;
}
function hasOpportunitySignal ( signals ) {
const OPPORTUNITY_SIGNALS = [
'user_feature_request' ,
'user_improvement_suggestion' ,
'perf_bottleneck' ,
'capability_gap' ,
'stable_success_plateau' ,
'external_opportunity' ,
];
for ( const name of OPPORTUNITY_SIGNALS ) {
if ( signals . includes ( name )) return true ;
if ( signals . some ( s => s . startsWith ( name + ':' ))) return true ;
}
return false ;
}
Risk Level Assignment
Location: src/gep/mutation.js:119
const base = {
type: 'Mutation' ,
id: `mut_ ${ Date . now () } ` ,
category ,
trigger_signals: uniqStrings ( signals ),
target: String ( target || targetFromGene ( selectedGene )),
expected_effect: String ( expected_effect || expectedEffectFromCategory ( category )),
risk_level: 'low' ,
};
// Default risk assignment
if ( category === 'innovate' ) base . risk_level = 'medium' ;
// Optional high-risk escalation (rare, guarded)
if ( allowHighRisk && category === 'innovate' ) {
base . risk_level = 'high' ;
}
Safety Constraints
Location: src/gep/mutation.js:131
Forbid Innovate + High-Risk Personality
const highRiskPersonality = isHighRiskPersonality ( personalityState || null );
if ( base . category === 'innovate' && highRiskPersonality ) {
base . category = 'optimize' ;
base . expected_effect = 'safety downgrade: optimize under high-risk personality' ;
base . risk_level = 'low' ;
base . trigger_signals = uniqStrings ([
... ( base . trigger_signals || []),
'safety:avoid_innovate_with_high_risk_personality'
]);
}
Downgrade Disallowed High-Risk Mutations
if ( base . risk_level === 'high' && ! isHighRiskMutationAllowed ( personalityState || null )) {
base . risk_level = 'medium' ;
base . trigger_signals = uniqStrings ([
... ( base . trigger_signals || []),
'safety:downgrade_high_risk'
]);
}
High-Risk Mutation Guard
Location: src/gep/mutation.js:91
function isHighRiskMutationAllowed ( personalityState ) {
const rigor = personalityState && Number . isFinite ( Number ( personalityState . rigor ))
? Number ( personalityState . rigor )
: 0 ;
const riskTol = personalityState && Number . isFinite ( Number ( personalityState . risk_tolerance ))
? Number ( personalityState . risk_tolerance )
: 1 ;
// High-risk mutations require high rigor AND low risk tolerance
return rigor >= 0.6 && riskTol <= 0.5 ;
}
High-Risk Personality Detection
Location: src/gep/mutation.js:82
function isHighRiskPersonality ( p ) {
const rigor = p && Number . isFinite ( Number ( p . rigor )) ? Number ( p . rigor ) : null ;
const riskTol = p && Number . isFinite ( Number ( p . risk_tolerance )) ? Number ( p . risk_tolerance ) : null ;
// Low rigor or high risk tolerance = high-risk personality
if ( rigor != null && rigor < 0.5 ) return true ;
if ( riskTol != null && riskTol > 0.6 ) return true ;
return false ;
}
Expected Effect Descriptions
Location: src/gep/mutation.js:69
function expectedEffectFromCategory ( category ) {
const c = String ( category || '' );
if ( c === 'repair' ) {
return 'reduce runtime errors, increase stability, and lower failure rate' ;
}
if ( c === 'optimize' ) {
return 'improve success rate and reduce repeated operational cost' ;
}
if ( c === 'innovate' ) {
return 'explore new strategy combinations to escape local optimum' ;
}
return 'improve robustness and success probability' ;
}
Validation
Location: src/gep/mutation.js:151
function isValidMutation ( obj ) {
if ( ! obj || typeof obj !== 'object' ) return false ;
if ( obj . type !== 'Mutation' ) return false ;
if ( ! obj . id || typeof obj . id !== 'string' ) return false ;
if ( ! [ 'repair' , 'optimize' , 'innovate' ]. includes ( String ( obj . category ))) return false ;
if ( ! Array . isArray ( obj . trigger_signals )) return false ;
if ( ! obj . target || typeof obj . target !== 'string' ) return false ;
if ( ! obj . expected_effect || typeof obj . expected_effect !== 'string' ) return false ;
if ( ! [ 'low' , 'medium' , 'high' ]. includes ( String ( obj . risk_level ))) return false ;
return true ;
}
Example Usage
Repair Mutation
Innovate Mutation
Safety Downgrade
const mutation = buildMutation ({
signals: [ 'log_error' , 'errsig:TypeError: undefined' ],
selectedGene: gene ,
driftEnabled: false ,
personalityState: { rigor: 0.8 , risk_tolerance: 0.3 },
});
console . log ( mutation );
// {
// type: 'Mutation',
// id: 'mut_1678901234567',
// category: 'repair',
// trigger_signals: ['log_error', 'errsig:TypeError: undefined'],
// target: 'gene:gene_gep_repair_from_errors',
// expected_effect: 'reduce runtime errors, increase stability, and lower failure rate',
// risk_level: 'low',
// }