28 lines
2.9 KiB
TypeScript
Executable File
28 lines
2.9 KiB
TypeScript
Executable File
import { IS_MAINNET } from '../shared/network.ts';
|
|
import { assertLaunchAllowed, launchManifest } from './launch.ts';
|
|
|
|
export type LaunchCheck = { id: string; status: 'pass' | 'blocked' | 'unverified'; detail: string };
|
|
/** Read-only local assessment. Never opens a ledger, starts PoW, contacts peers, or sets approvals.
|
|
* Configured approvals cannot resolve findings that require new code or independent evidence. */
|
|
export function launchPreflight(env: NodeJS.ProcessEnv = process.env, now = Date.now()) {
|
|
const checks: LaunchCheck[] = [{ id: 'network-selection', status: IS_MAINNET ? 'pass' : 'blocked',
|
|
detail: IS_MAINNET ? 'Separate mainnet candidate selected.' : 'Testnet selected; this is not a production profile.' }];
|
|
if (IS_MAINNET) {
|
|
try {
|
|
assertLaunchAllowed(env, now);
|
|
checks.push({ id: 'operator-startup-gates', status: 'pass', detail: 'Local startup gates satisfied; this does not establish production readiness or peer independence.' });
|
|
} catch (error) {
|
|
checks.push({ id: 'operator-startup-gates', status: 'blocked', detail: error instanceof Error ? error.message : 'Startup gate failed.' });
|
|
}
|
|
}
|
|
checks.push(
|
|
{ id: 'public-node-resource-controls', status: 'blocked', detail: 'Global RPC budgets, bounded pages, and browser history controls exist. In-memory DAG growth and production-scale load/capacity evidence remain unresolved.' },
|
|
{ id: 'consensus-launch-calibration', status: 'blocked', detail: 'Bounded offline native benchmarks and deterministic retarget/timestamp analysis exist. Representative network hashrate, multi-host adversarial evidence, and the operator-frozen launch rules/genesis remain missing; external audit is not planned under the current policy.' },
|
|
{ id: 'wallet-key-protection', status: 'blocked', detail: 'Encrypted vault storage, explicit migration/unlock, and lock-aware signing exist. Legacy plaintext copies, unlocked-page compromise, supported-browser lifecycle coverage, and wallet recovery drills remain unresolved; the operator accepts that no external wallet audit is planned.' },
|
|
{ id: 'release-risk-acceptance', status: 'unverified', detail: 'External audit is not planned by operator choice. Record explicit acceptance of unaudited protocol/wallet risk and complete release-specific dependency/native/container scans.' },
|
|
{ id: 'deployment-rehearsal', status: 'unverified', detail: 'Explicit proxy trust, private diagnostics/checker, and stopped-node ledger backup/restore with local native replay tests exist. Actual HTTPS/proxy topology, independent hosts/miners, alert delivery, off-host recovery, and on-call procedures remain unverified.' },
|
|
);
|
|
return { ...launchManifest(), assessedAt: new Date(now).toISOString(), productionReady: false,
|
|
decision: 'NO-GO', scope: 'Local code/configuration preflight; not an independent audit or launch approval.', checks };
|
|
}
|