Skip to main content

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

signals
string[]
required
Current signals extracted from logs
selectedGene
Gene
Selected Gene object (used for target if not provided)
driftEnabled
boolean
default:false
Enable random drift mode
personalityState
object
Current personality state with rigor and risk_tolerance
allowHighRisk
boolean
default:false
Allow high-risk mutations (guarded by strict safety constraints)
target
string
Mutation target (defaults to gene:<geneId> or behavior:protocol)
expected_effect
string
Expected effect description (auto-generated from category if not provided)

Return Value

type
string
Type identifier
id
string
Unique mutation ID (e.g., mut_1678901234567)
category
string
Mutation category: repair, optimize, or innovate
trigger_signals
string[]
Array of unique signals that triggered this mutation
target
string
Target of mutation (e.g., gene:gene_gep_repair_from_errors)
expected_effect
string
Human-readable description of expected outcome
risk_level
string
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

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',
// }

Build docs developers (and LLMs) love