Clear local capital efficiency simulation gates
This commit is contained in:
@@ -32,6 +32,12 @@ const REQUIRED_CAPITAL_FIELDS = [
|
||||
'spread_adjustment_events',
|
||||
];
|
||||
|
||||
const STRESS_SCENARIOS = [
|
||||
'crash_40pct_external_asset',
|
||||
'high_vol_sigma_spike',
|
||||
'bank_run_redemption_spike',
|
||||
];
|
||||
|
||||
function readJson(file) {
|
||||
return JSON.parse(fs.readFileSync(file, 'utf8'));
|
||||
}
|
||||
@@ -67,21 +73,43 @@ function main() {
|
||||
|
||||
const policy = readJson(path.join(CONFIG_DIR, 'capital-efficiency-policy.json'));
|
||||
const maxDeployableLeverage = Number(policy.gates?.maxDeployableLeverage ?? policy.risk?.hardMaxLeverage ?? 4);
|
||||
const gates = policy.gates || {};
|
||||
const maxLiquidationProbability = Number(gates.maxLiquidationProbability ?? 0.02);
|
||||
const maxDrawdownP95 = Number(gates.maxDrawdownP95 ?? 0.25);
|
||||
const maxPegDeviationFrequency = Number(gates.maxPegDeviationFrequency ?? 0.05);
|
||||
const maxExternalLiquidityFloorViolations = Number(gates.maxExternalLiquidityFloorViolations ?? 0);
|
||||
const guard = policy.liveExecutionGuard || {};
|
||||
|
||||
assert(guard.status === 'simulation_only', 'liveExecutionGuard.status must remain simulation_only until external approvals exist');
|
||||
assert(guard.riskDashboardEvidence, 'risk dashboard evidence path is required');
|
||||
assert(guard.operatorRunbookEvidence, 'operator runbook evidence path is required');
|
||||
assert(guard.treasuryLiquidityCommitmentEvidence, 'treasury liquidity commitment evidence path is required');
|
||||
for (const evidencePath of [
|
||||
guard.riskDashboardEvidence,
|
||||
guard.operatorRunbookEvidence,
|
||||
guard.treasuryLiquidityCommitmentEvidence,
|
||||
]) {
|
||||
assert(fs.existsSync(path.join(ROOT, evidencePath)), `evidence path missing: ${evidencePath}`);
|
||||
}
|
||||
|
||||
const baseline = runScenario('hub_only_11').json;
|
||||
assert(baseline.capital_efficiency_enabled !== true, 'hub_only_11 unexpectedly enabled capital overlay');
|
||||
|
||||
for (const scenario of [
|
||||
'chain138_deployed_capital_efficiency',
|
||||
'crash_40pct_external_asset',
|
||||
'high_vol_sigma_spike',
|
||||
'bank_run_redemption_spike',
|
||||
...STRESS_SCENARIOS,
|
||||
]) {
|
||||
const scorecard = runScenario(scenario).json;
|
||||
assert(scorecard.capital_efficiency_enabled === true, `${scenario} did not emit capital overlay`);
|
||||
for (const field of REQUIRED_CAPITAL_FIELDS) {
|
||||
assert(Object.prototype.hasOwnProperty.call(scorecard, field), `${scenario} missing ${field}`);
|
||||
}
|
||||
if (STRESS_SCENARIOS.includes(scenario)) {
|
||||
assert(scorecard.liquidation_probability <= maxLiquidationProbability, `${scenario} liquidation probability exceeds gate`);
|
||||
assert(scorecard.max_drawdown_p95 <= maxDrawdownP95, `${scenario} p95 drawdown exceeds gate`);
|
||||
assert(scorecard.peg_deviation_frequency <= maxPegDeviationFrequency, `${scenario} peg deviation frequency exceeds gate`);
|
||||
assert(scorecard.external_liquidity_floor_violations <= maxExternalLiquidityFloorViolations, `${scenario} external liquidity floor violations exceed gate`);
|
||||
}
|
||||
}
|
||||
|
||||
const a = runScenario('crash_40pct_external_asset').raw;
|
||||
|
||||
Reference in New Issue
Block a user