194 lines
5.5 KiB
JavaScript
194 lines
5.5 KiB
JavaScript
/**
|
|
* Phase Management for Network Lifecycle
|
|
* Tracks and validates phase transitions
|
|
*/
|
|
|
|
export class PhaseManager {
|
|
constructor() {
|
|
this.currentPhase = 'genesis';
|
|
this.phaseHistory = [];
|
|
this.phaseMetrics = new Map();
|
|
|
|
this.initializePhases();
|
|
}
|
|
|
|
/**
|
|
* Initialize phase definitions
|
|
*/
|
|
initializePhases() {
|
|
this.phases = {
|
|
genesis: {
|
|
name: 'Genesis Phase',
|
|
nodeRange: [0, 10000],
|
|
description: 'Network bootstrap with genesis nodes',
|
|
features: [
|
|
'Genesis node initialization',
|
|
'Early adopter multiplier (10x)',
|
|
'Network bootstrap',
|
|
'Initial task distribution',
|
|
'Security learning initialization',
|
|
],
|
|
validations: [
|
|
{ metric: 'genesisNodesActive', min: 1, description: 'At least 1 genesis node active' },
|
|
{ metric: 'earlyMultiplier', min: 5.0, description: 'High early adopter multiplier' },
|
|
],
|
|
},
|
|
transition: {
|
|
name: 'Transition Phase',
|
|
nodeRange: [10000, 50000],
|
|
description: 'Genesis sunset preparation',
|
|
features: [
|
|
'Genesis node connection limiting',
|
|
'Network resilience testing',
|
|
'Task routing optimization',
|
|
'Economic sustainability threshold',
|
|
'Topology self-organization',
|
|
],
|
|
validations: [
|
|
{ metric: 'genesisConnectionLimit', max: 500, description: 'Genesis connections limited' },
|
|
{ metric: 'networkResilience', min: 0.7, description: 'Network resilient without full genesis' },
|
|
{ metric: 'taskRoutingSuccess', min: 0.85, description: 'Efficient task routing' },
|
|
],
|
|
},
|
|
maturity: {
|
|
name: 'Maturity Phase',
|
|
nodeRange: [50000, 100000],
|
|
description: 'Genesis read-only mode',
|
|
features: [
|
|
'Genesis nodes read-only',
|
|
'Full network self-sustenance',
|
|
'Economic health monitoring',
|
|
'Security threat response',
|
|
'Founder tribute distribution',
|
|
],
|
|
validations: [
|
|
{ metric: 'genesisReadOnly', exact: true, description: 'Genesis nodes read-only' },
|
|
{ metric: 'economicHealth', min: 0.75, description: 'Healthy economic metrics' },
|
|
{ metric: 'selfSustaining', exact: true, description: 'Network self-sustaining' },
|
|
],
|
|
},
|
|
'post-genesis': {
|
|
name: 'Post-Genesis Phase',
|
|
nodeRange: [100000, Infinity],
|
|
description: 'Full decentralization',
|
|
features: [
|
|
'Genesis retirement complete',
|
|
'Independent network operation',
|
|
'Long-term stability',
|
|
'Economic equilibrium',
|
|
'Community governance',
|
|
],
|
|
validations: [
|
|
{ metric: 'genesisRetired', exact: true, description: 'All genesis nodes retired' },
|
|
{ metric: 'networkStability', min: 0.8, description: 'Stable network operation' },
|
|
{ metric: 'economicEquilibrium', min: 0.7, description: 'Economic equilibrium reached' },
|
|
],
|
|
},
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Transition to a new phase
|
|
*/
|
|
transition(newPhase) {
|
|
if (this.currentPhase === newPhase) return;
|
|
|
|
const previousPhase = this.currentPhase;
|
|
this.currentPhase = newPhase;
|
|
|
|
this.phaseHistory.push({
|
|
from: previousPhase,
|
|
to: newPhase,
|
|
timestamp: Date.now(),
|
|
});
|
|
|
|
console.log(`\n${'='.repeat(60)}`);
|
|
console.log(`🔄 PHASE TRANSITION: ${previousPhase} → ${newPhase}`);
|
|
console.log(`${'='.repeat(60)}`);
|
|
console.log(`\n${this.phases[newPhase].description}\n`);
|
|
console.log('Features:');
|
|
this.phases[newPhase].features.forEach(f => console.log(` ✓ ${f}`));
|
|
console.log('');
|
|
}
|
|
|
|
/**
|
|
* Get current phase definition
|
|
*/
|
|
getCurrentPhaseInfo() {
|
|
return this.phases[this.currentPhase];
|
|
}
|
|
|
|
/**
|
|
* Validate phase metrics
|
|
*/
|
|
validatePhase(metrics) {
|
|
const phase = this.phases[this.currentPhase];
|
|
if (!phase) return { valid: false, errors: ['Unknown phase'] };
|
|
|
|
const errors = [];
|
|
const validations = phase.validations || [];
|
|
|
|
for (const validation of validations) {
|
|
const value = metrics[validation.metric];
|
|
|
|
if (validation.min !== undefined && value < validation.min) {
|
|
errors.push(`${validation.description}: ${value} < ${validation.min}`);
|
|
}
|
|
|
|
if (validation.max !== undefined && value > validation.max) {
|
|
errors.push(`${validation.description}: ${value} > ${validation.max}`);
|
|
}
|
|
|
|
if (validation.exact !== undefined && value !== validation.exact) {
|
|
errors.push(`${validation.description}: ${value} !== ${validation.exact}`);
|
|
}
|
|
}
|
|
|
|
return {
|
|
valid: errors.length === 0,
|
|
errors,
|
|
phase: this.currentPhase,
|
|
validations,
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Record phase metrics
|
|
*/
|
|
recordMetrics(phase, metrics) {
|
|
if (!this.phaseMetrics.has(phase)) {
|
|
this.phaseMetrics.set(phase, []);
|
|
}
|
|
|
|
this.phaseMetrics.get(phase).push({
|
|
timestamp: Date.now(),
|
|
...metrics,
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Get phase report
|
|
*/
|
|
getReport() {
|
|
return {
|
|
currentPhase: this.currentPhase,
|
|
phaseInfo: this.getCurrentPhaseInfo(),
|
|
history: this.phaseHistory,
|
|
metrics: Object.fromEntries(this.phaseMetrics),
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Get expected phase for node count
|
|
*/
|
|
getExpectedPhase(nodeCount) {
|
|
for (const [phaseName, phase] of Object.entries(this.phases)) {
|
|
const [min, max] = phase.nodeRange;
|
|
if (nodeCount >= min && nodeCount < max) {
|
|
return phaseName;
|
|
}
|
|
}
|
|
return 'post-genesis';
|
|
}
|
|
}
|