@@ -33,7 +33,7 @@ function matchPatternToSignals(pattern, signals) {
3333function scoreGene ( gene , signals ) {
3434 if ( ! gene || gene . type !== 'Gene' ) return 0 ;
3535 const patterns = Array . isArray ( gene . signals_match ) ? gene . signals_match : [ ] ;
36- var tagScore = scoreTagOverlap ( gene , signals ) ;
36+ const tagScore = scoreTagOverlap ( gene , signals ) ;
3737 if ( patterns . length === 0 ) return tagScore > 0 ? tagScore * 0.6 : 0 ;
3838 let score = 0 ;
3939 for ( const pat of patterns ) {
@@ -54,11 +54,11 @@ function getEpigeneticBoostLocal(gene, envFingerprint) {
5454
5555function scoreGeneLearning ( gene , signals , envFingerprint ) {
5656 if ( ! gene || gene . type !== 'Gene' ) return 0 ;
57- var boost = 0 ;
57+ let boost = 0 ;
5858
59- var history = Array . isArray ( gene . learning_history ) ? gene . learning_history . slice ( - 8 ) : [ ] ;
60- for ( var i = 0 ; i < history . length ; i ++ ) {
61- var entry = history [ i ] ;
59+ const history = Array . isArray ( gene . learning_history ) ? gene . learning_history . slice ( - 8 ) : [ ] ;
60+ for ( let i = 0 ; i < history . length ; i ++ ) {
61+ const entry = history [ i ] ;
6262 if ( ! entry ) continue ;
6363 if ( entry . outcome === 'success' ) boost += 0.12 ;
6464 else if ( entry . mode === 'hard' ) boost -= 0.22 ;
@@ -68,13 +68,13 @@ function scoreGeneLearning(gene, signals, envFingerprint) {
6868 boost += getEpigeneticBoostLocal ( gene , envFingerprint ) ;
6969
7070 if ( Array . isArray ( gene . anti_patterns ) && gene . anti_patterns . length > 0 ) {
71- var overlapPenalty = 0 ;
72- var signalTags = new Set ( require ( './learningSignals' ) . expandSignals ( signals , '' ) ) ;
73- var recentAntiPatterns = gene . anti_patterns . slice ( - 6 ) ;
74- for ( var j = 0 ; j < recentAntiPatterns . length ; j ++ ) {
75- var anti = recentAntiPatterns [ j ] ;
71+ let overlapPenalty = 0 ;
72+ const signalTags = new Set ( require ( './learningSignals' ) . expandSignals ( signals , '' ) ) ;
73+ const recentAntiPatterns = gene . anti_patterns . slice ( - 6 ) ;
74+ for ( let j = 0 ; j < recentAntiPatterns . length ; j ++ ) {
75+ const anti = recentAntiPatterns [ j ] ;
7676 if ( ! anti || ! Array . isArray ( anti . learning_signals ) ) continue ;
77- var overlap = anti . learning_signals . some ( function ( tag ) { return signalTags . has ( String ( tag ) ) ; } ) ;
77+ const overlap = anti . learning_signals . some ( function ( tag ) { return signalTags . has ( String ( tag ) ) ; } ) ;
7878 if ( overlap ) overlapPenalty += anti . mode === 'hard' ? 0.4 : 0.18 ;
7979 }
8080 boost -= overlapPenalty ;
@@ -90,19 +90,19 @@ function scoreGeneLearning(gene, signals, envFingerprint) {
9090// This replaces the binary driftEnabled flag with a continuous spectrum.
9191function computeDriftIntensity ( opts ) {
9292 // If explicitly enabled/disabled, use that as the baseline
93- var driftEnabled = ! ! ( opts && opts . driftEnabled ) ;
93+ const driftEnabled = ! ! ( opts && opts . driftEnabled ) ;
9494
9595 // Effective population size: active gene count in the pool
96- var effectivePopulationSize = opts && Number . isFinite ( Number ( opts . effectivePopulationSize ) )
96+ const effectivePopulationSize = opts && Number . isFinite ( Number ( opts . effectivePopulationSize ) )
9797 ? Number ( opts . effectivePopulationSize )
9898 : null ;
9999
100100 // If no Ne provided, fall back to gene pool size
101- var genePoolSize = opts && Number . isFinite ( Number ( opts . genePoolSize ) )
101+ const genePoolSize = opts && Number . isFinite ( Number ( opts . genePoolSize ) )
102102 ? Number ( opts . genePoolSize )
103103 : null ;
104104
105- var ne = effectivePopulationSize || genePoolSize || null ;
105+ const ne = effectivePopulationSize || genePoolSize || null ;
106106
107107 if ( driftEnabled ) {
108108 // Explicit drift: use moderate-to-high intensity
@@ -125,24 +125,24 @@ function selectGene(genes, signals, opts) {
125125 const preferredGeneId = opts && typeof opts . preferredGeneId === 'string' ? opts . preferredGeneId : null ;
126126
127127 // Diversity-directed drift: capability_gaps from Hub heartbeat
128- var capabilityGaps = opts && Array . isArray ( opts . capabilityGaps ) ? opts . capabilityGaps : [ ] ;
129- var noveltyScore = opts && Number . isFinite ( Number ( opts . noveltyScore ) ) ? Number ( opts . noveltyScore ) : null ;
128+ const capabilityGaps = opts && Array . isArray ( opts . capabilityGaps ) ? opts . capabilityGaps : [ ] ;
129+ const noveltyScore = opts && Number . isFinite ( Number ( opts . noveltyScore ) ) ? Number ( opts . noveltyScore ) : null ;
130130
131131 // Compute continuous drift intensity based on effective population size
132- var driftIntensity = computeDriftIntensity ( {
132+ const driftIntensity = computeDriftIntensity ( {
133133 driftEnabled : driftEnabled ,
134134 effectivePopulationSize : opts && opts . effectivePopulationSize ,
135135 genePoolSize : genesList . length ,
136136 } ) ;
137- var useDrift = driftEnabled || driftIntensity > 0.15 ;
137+ const useDrift = driftEnabled || driftIntensity > 0.15 ;
138138
139- var DISTILLED_PREFIX = 'gene_distilled_' ;
140- var DISTILLED_SCORE_FACTOR = 0.8 ;
139+ const DISTILLED_PREFIX = 'gene_distilled_' ;
140+ const DISTILLED_SCORE_FACTOR = 0.8 ;
141141
142142 const envFingerprint = captureEnvFingerprint ( ) ;
143143 const scored = genesList
144144 . map ( g => {
145- var s = scoreGene ( g , signals ) ;
145+ let s = scoreGene ( g , signals ) ;
146146 s += scoreGeneLearning ( g , signals , envFingerprint ) ;
147147 if ( s > 0 && g . id && String ( g . id ) . startsWith ( DISTILLED_PREFIX ) ) s *= DISTILLED_SCORE_FACTOR ;
148148 return { gene : g , score : s } ;
@@ -174,26 +174,26 @@ function selectGene(genes, signals, opts) {
174174 // Diversity-directed drift: when capability gaps are available, prefer genes that
175175 // cover gap areas instead of pure random selection. This replaces the blind
176176 // random drift with an informed exploration toward under-covered capabilities.
177- var selectedIdx = 0 ;
178- var driftMode = 'selection' ;
177+ let selectedIdx = 0 ;
178+ let driftMode = 'selection' ;
179179 if ( driftIntensity > 0 && filtered . length > 1 && Math . random ( ) < driftIntensity ) {
180180 if ( capabilityGaps . length > 0 ) {
181181 // Directed drift: score each candidate by how well its signals_match
182182 // covers the capability gap dimensions
183- var gapScores = filtered . map ( function ( entry , idx ) {
184- var g = entry . gene ;
185- var patterns = Array . isArray ( g . signals_match ) ? g . signals_match : [ ] ;
186- var gapHits = 0 ;
187- for ( var gi = 0 ; gi < capabilityGaps . length && gi < 5 ; gi ++ ) {
188- var gapSignal = capabilityGaps [ gi ] ;
183+ const gapScores = filtered . map ( function ( entry , idx ) {
184+ const g = entry . gene ;
185+ const patterns = Array . isArray ( g . signals_match ) ? g . signals_match : [ ] ;
186+ let gapHits = 0 ;
187+ for ( let gi = 0 ; gi < capabilityGaps . length && gi < 5 ; gi ++ ) {
188+ const gapSignal = capabilityGaps [ gi ] ;
189189 if ( typeof gapSignal === 'string' && patterns . some ( function ( p ) { return matchPatternToSignals ( p , [ gapSignal ] ) ; } ) ) {
190190 gapHits ++ ;
191191 }
192192 }
193193 return { idx : idx , gapHits : gapHits , baseScore : entry . score } ;
194194 } ) ;
195195
196- var hasGapHits = gapScores . some ( function ( gs ) { return gs . gapHits > 0 ; } ) ;
196+ const hasGapHits = gapScores . some ( function ( gs ) { return gs . gapHits > 0 ; } ) ;
197197 if ( hasGapHits ) {
198198 // Sort by gap coverage first, then by base score
199199 gapScores . sort ( function ( a , b ) {
@@ -203,7 +203,7 @@ function selectGene(genes, signals, opts) {
203203 driftMode = 'diversity_directed' ;
204204 } else {
205205 // No gap match: fall back to novelty-weighted random selection
206- var topN = Math . min ( filtered . length , Math . max ( 2 , Math . ceil ( filtered . length * driftIntensity ) ) ) ;
206+ let topN = Math . min ( filtered . length , Math . max ( 2 , Math . ceil ( filtered . length * driftIntensity ) ) ) ;
207207 // If novelty score is low (agent is too similar to others), increase exploration range
208208 if ( noveltyScore != null && noveltyScore < 0.3 && topN < filtered . length ) {
209209 topN = Math . min ( filtered . length , topN + 1 ) ;
@@ -213,7 +213,7 @@ function selectGene(genes, signals, opts) {
213213 }
214214 } else {
215215 // No capability gap data: original random drift behavior
216- var topN = Math . min ( filtered . length , Math . max ( 2 , Math . ceil ( filtered . length * driftIntensity ) ) ) ;
216+ const topN = Math . min ( filtered . length , Math . max ( 2 , Math . ceil ( filtered . length * driftIntensity ) ) ) ;
217217 selectedIdx = Math . floor ( Math . random ( ) * topN ) ;
218218 driftMode = 'random' ;
219219 }
@@ -242,31 +242,31 @@ function selectCapsule(capsules, signals) {
242242function computeSignalOverlap ( signalsA , signalsB ) {
243243 if ( ! Array . isArray ( signalsA ) || ! Array . isArray ( signalsB ) ) return 0 ;
244244 if ( signalsA . length === 0 || signalsB . length === 0 ) return 0 ;
245- var setB = new Set ( signalsB . map ( function ( s ) { return String ( s ) . toLowerCase ( ) ; } ) ) ;
246- var hits = 0 ;
247- for ( var i = 0 ; i < signalsA . length ; i ++ ) {
245+ const setB = new Set ( signalsB . map ( function ( s ) { return String ( s ) . toLowerCase ( ) ; } ) ) ;
246+ let hits = 0 ;
247+ for ( let i = 0 ; i < signalsA . length ; i ++ ) {
248248 if ( setB . has ( String ( signalsA [ i ] ) . toLowerCase ( ) ) ) hits ++ ;
249249 }
250250 return hits / Math . max ( signalsA . length , 1 ) ;
251251}
252252
253- var FAILED_CAPSULE_BAN_THRESHOLD = 2 ;
254- var FAILED_CAPSULE_OVERLAP_MIN = 0.6 ;
253+ const FAILED_CAPSULE_BAN_THRESHOLD = 2 ;
254+ const FAILED_CAPSULE_OVERLAP_MIN = 0.6 ;
255255
256256function banGenesFromFailedCapsules ( failedCapsules , signals , existingBans ) {
257- var bans = existingBans instanceof Set ? new Set ( existingBans ) : new Set ( ) ;
257+ const bans = existingBans instanceof Set ? new Set ( existingBans ) : new Set ( ) ;
258258 if ( ! Array . isArray ( failedCapsules ) || failedCapsules . length === 0 ) return bans ;
259- var geneFailCounts = { } ;
260- for ( var i = 0 ; i < failedCapsules . length ; i ++ ) {
261- var fc = failedCapsules [ i ] ;
259+ const geneFailCounts = { } ;
260+ for ( let i = 0 ; i < failedCapsules . length ; i ++ ) {
261+ const fc = failedCapsules [ i ] ;
262262 if ( ! fc || ! fc . gene ) continue ;
263- var overlap = computeSignalOverlap ( signals , fc . trigger || [ ] ) ;
263+ const overlap = computeSignalOverlap ( signals , fc . trigger || [ ] ) ;
264264 if ( overlap < FAILED_CAPSULE_OVERLAP_MIN ) continue ;
265- var gid = String ( fc . gene ) ;
265+ const gid = String ( fc . gene ) ;
266266 geneFailCounts [ gid ] = ( geneFailCounts [ gid ] || 0 ) + 1 ;
267267 }
268- var keys = Object . keys ( geneFailCounts ) ;
269- for ( var j = 0 ; j < keys . length ; j ++ ) {
268+ const keys = Object . keys ( geneFailCounts ) ;
269+ for ( let j = 0 ; j < keys . length ; j ++ ) {
270270 if ( geneFailCounts [ keys [ j ] ] >= FAILED_CAPSULE_BAN_THRESHOLD ) {
271271 bans . add ( keys [ j ] ) ;
272272 }
@@ -279,7 +279,7 @@ function selectGeneAndCapsule({ genes, capsules, signals, memoryAdvice, driftEna
279279 memoryAdvice && memoryAdvice . bannedGeneIds instanceof Set ? memoryAdvice . bannedGeneIds : new Set ( ) ;
280280 const preferredGeneId = memoryAdvice && memoryAdvice . preferredGeneId ? memoryAdvice . preferredGeneId : null ;
281281
282- var effectiveBans = banGenesFromFailedCapsules (
282+ const effectiveBans = banGenesFromFailedCapsules (
283283 Array . isArray ( failedCapsules ) ? failedCapsules : [ ] ,
284284 signals ,
285285 bannedGeneIds
0 commit comments