Files
PaperClipAI/scripts/sleep-qualification/evidence.mjs
T
2026-11-03 17:41:15 -06:00

232 lines
18 KiB
JavaScript

import { createHash } from 'node:crypto';
import { readFile, writeFile } from 'node:fs/promises';
import { pathToFileURL } from 'node:url';
const sha = value => typeof value === 'string' && /^[a-f0-9]{40}$/.test(value);
const finite = value => typeof value === 'number' && Number.isFinite(value) && value >= 0;
const stamp = value => typeof value === 'string' && Number.isFinite(Date.parse(value));
const layers = ['workerQuiet', 'eligibility', 'databaseSuspension', 'hostSuspension', 'backupPersistence', 'inboundWake', 'timedWake', 'returnToIdle'];
const result = (verdict, reason) => ({ verdict, reason });
const announcementFeed = 'https://pages.paperclip.ing/announcements/v1/current.json';
const observedAnnouncement = announcement => announcement?.intercepted === true
&& Array.isArray(announcement.requests) && announcement.requests.length > 0
&& announcement.requests.every(url => url === announcementFeed)
&& Array.isArray(announcement.unmatched) && announcement.unmatched.length === 0;
const signalKeys = ['telemetryRequests', 'traceRequests', 'exportedSpans', 'qualificationSpans', 'metricRequests', 'logRequests', 'malformedTraceRequests', 'unexpectedRequests'];
const knownSignalCounts = signal => signal && signalKeys.every(key => Number.isSafeInteger(signal[key]) && signal[key] >= 0);
/** Preserve actual cumulative app-server snapshots; IPC reads create no HTTP traffic. */
export function observeIncomingHttpWindow(before, after) {
return { before, after, requests: after?.requests - before?.requests };
}
const knownIncomingHttpSnapshot = snapshot => snapshot?.source === 'node-http-server-events'
&& typeof snapshot.captureId === 'string' && /^[a-f0-9]{8}-(?:[a-f0-9]{4}-){3}[a-f0-9]{12}$/.test(snapshot.captureId)
&& snapshot.installed === true && snapshot.valid === true
&& Number.isSafeInteger(snapshot.requests) && snapshot.requests >= 0 && stamp(snapshot.observedAt);
export const observedNoIncomingHttp = (observation, quiet) => knownIncomingHttpSnapshot(observation?.before)
&& knownIncomingHttpSnapshot(observation?.after) && observation.before.captureId === observation.after.captureId
&& stamp(quiet?.startedAt) && stamp(quiet?.finishedAt) && Date.parse(quiet.finishedAt) >= Date.parse(quiet.startedAt)
&& Date.parse(observation.before.observedAt) <= Date.parse(quiet.startedAt)
&& Date.parse(observation.after.observedAt) >= Date.parse(quiet.finishedAt)
&& Number.isSafeInteger(observation.requests) && observation.requests === 0
&& observation.after.requests - observation.before.requests === observation.requests;
/** Count actual collector requests and OTLP span records, never request-as-span estimates. */
export function observeConfiguredSignals(requests) {
const observed = Object.fromEntries(signalKeys.map(key => [key, 0]));
for (const request of requests) {
if (typeof request?.path !== 'string' || !request.path.startsWith('/') || request.path.startsWith('//')) { observed.unexpectedRequests++; continue; }
const pathname = new URL(request.path, 'http://owned-collector').pathname;
if (pathname === '/telemetry') { observed.telemetryRequests++; continue; }
if (pathname === '/v1/metrics') { observed.metricRequests++; continue; }
if (pathname === '/v1/logs') { observed.logRequests++; continue; }
if (pathname !== '/v1/traces') { observed.unexpectedRequests++; continue; }
observed.traceRequests++;
try {
if (!Array.isArray(request.body?.resourceSpans)) throw new Error('Missing resourceSpans');
let spans = 0, qualificationSpans = 0;
for (const resource of request.body.resourceSpans) {
if (!Array.isArray(resource?.scopeSpans)) throw new Error('Missing scopeSpans');
for (const scope of resource.scopeSpans) {
if (!Array.isArray(scope?.spans)) throw new Error('Missing spans');
for (const span of scope.spans) {
if (typeof span?.name !== 'string' || !span.name) throw new Error('Invalid span');
spans++; if (span.name === 'sleep-qualification-stimulus') qualificationSpans++;
}
}
}
observed.exportedSpans += spans; observed.qualificationSpans += qualificationSpans;
} catch { observed.malformedTraceRequests++; }
}
return observed;
}
/** Coverage booleans come from recorded activity; the evaluator also checks their provenance. */
export function configuredSleepFeatures({ announcement, signalObservation, backupCheckpoint }) {
const known = knownSignalCounts(signalObservation);
return { telemetry: Boolean(known && signalObservation.telemetryRequests > 0), announcements: Boolean(observedAnnouncement(announcement)),
automaticBackups: backupCheckpoint?.owner === 'normal-idle-checkpoint' && backupCheckpoint.wakeMarkerObserved === true
&& backupCheckpoint.failureObserved === false && Array.isArray(backupCheckpoint.archives) && backupCheckpoint.archives.length > 0,
otel: Boolean(known && signalObservation.traceRequests > 0 && signalObservation.exportedSpans > 0
&& signalObservation.qualificationSpans > 0 && signalObservation.qualificationSpans <= signalObservation.exportedSpans
&& signalObservation.metricRequests === 0 && signalObservation.logRequests === 0
&& signalObservation.malformedTraceRequests === 0 && signalObservation.unexpectedRequests === 0),
exportedSpans: known ? signalObservation.exportedSpans : 0 };
}
const validBackupCheckpoint = (backup, inRun, quietFinishedAt) => backup?.owner === 'normal-idle-checkpoint' && backup.wakeMarkerObserved === true
&& backup.failureObserved === false && inRun(backup.startedAt) && inRun(backup.observedAt)
&& Date.parse(backup.startedAt) >= Date.parse(quietFinishedAt) && Date.parse(backup.observedAt) >= Date.parse(backup.startedAt) && Array.isArray(backup.archives) && backup.archives.length > 0
&& backup.archives.every(archive => typeof archive.name === 'string' && /^[^/\\]+\.sql\.gz$/.test(archive.name)
&& finite(archive.bytes) && archive.bytes > 0 && finite(archive.sqlBytes) && archive.sqlBytes > 0
&& /^[a-f0-9]{64}$/.test(archive.sha256 ?? '') && archive.gzipVerified === true && archive.fixtureIdentifierFound === true
&& ['birthtime', 'mtime'].includes(archive.createdAtSource)
&& inRun(archive.createdAt) && Date.parse(archive.createdAt) >= Date.parse(backup.startedAt) && Date.parse(archive.createdAt) <= Date.parse(backup.observedAt));
/** Canonical logical configuration: ephemeral collector addresses are bound separately. */
export function logicalSleepConfiguration(configuration) {
if (!configuration || typeof configuration.announcements !== 'boolean' || typeof configuration.serveUi !== 'boolean'
|| typeof configuration.telemetryOrigin !== 'string' || typeof configuration.otelOrigin !== 'string'
|| (configuration.managedInstance !== undefined && typeof configuration.managedInstance !== 'boolean')
|| (configuration.deploymentMode !== undefined && !['authenticated', 'local_trusted'].includes(configuration.deploymentMode))
|| (configuration.storageProvider !== undefined && !['s3', 'local_disk'].includes(configuration.storageProvider))
|| typeof configuration.automaticBackups?.idleCheckpoint !== 'boolean'
|| !finite(configuration.automaticBackups?.intervalMinutes) || configuration.automaticBackups.intervalMinutes < 1) {
throw new Error('sleep_qualification_configuration_invalid');
}
return { automaticBackups: { intervalMinutes: configuration.automaticBackups.intervalMinutes,
idleCheckpoint: configuration.automaticBackups.idleCheckpoint }, announcements: configuration.announcements,
telemetry: Boolean(configuration.telemetryOrigin), otel: { enabled: Boolean(configuration.otelOrigin), protocol: 'http/json' }, serveUi: configuration.serveUi, managedInstance: configuration.managedInstance ?? false,
deploymentMode: configuration.deploymentMode ?? 'local_trusted', storageProvider: configuration.storageProvider ?? 'local_disk' };
}
export const sleepConfigurationDigest = configuration => createHash('sha256').update(JSON.stringify(logicalSleepConfiguration(configuration))).digest('hex');
/** Finish after observations, then validate the exact serialized local receipt. */
export function finalizeLocalSleepReceipt(observations, expected, now = () => new Date().toISOString()) {
const receipt = { ...observations, finishedAt: now() };
const report = evaluateSleepQualification(receipt, expected);
if (report.layers.workerQuiet.verdict !== 'VERIFIED' || report.layers.eligibility.verdict !== 'VERIFIED') {
throw new Error('sleep_qualification_local_evidence_invalid');
}
return { receipt, report };
}
/** Evaluate this campaign's measured boundaries. A local run cannot certify a provider. */
export function evaluateSleepQualification(receipt, expected) {
if (!receipt || receipt.version !== 1 || !expected || !sha(expected.appSha)
|| !sha(expected.cloudSha) || typeof expected.target !== 'string' || !expected.target
|| typeof expected.configDigest !== 'string' || !/^[a-f0-9]{64}$/.test(expected.configDigest)
|| !stamp(receipt.startedAt) || !stamp(receipt.finishedAt)
|| Date.parse(receipt.finishedAt) < Date.parse(receipt.startedAt)
|| ['appSha', 'cloudSha', 'target', 'configDigest'].some(key => receipt[key] !== expected[key])) {
throw new Error('sleep_qualification_identity_or_window_invalid');
}
if (sleepConfigurationDigest(receipt.configuration) !== expected.configDigest) throw new Error('sleep_qualification_configuration_digest_invalid');
const origins = receipt.collectorOrigins;
if (!origins || origins.telemetry !== receipt.configuration.telemetryOrigin || origins.otel !== receipt.configuration.otelOrigin
|| (expected.collectorOrigins && (origins.telemetry !== expected.collectorOrigins.telemetry || origins.otel !== expected.collectorOrigins.otel))) {
throw new Error('sleep_qualification_collector_origins_invalid');
}
const output = Object.fromEntries(layers.map(layer => [layer, result('INCONCLUSIVE', 'No evidence for this layer')]));
const inRun = value => stamp(value) && Date.parse(value) >= Date.parse(receipt.startedAt) && Date.parse(value) <= Date.parse(receipt.finishedAt);
const quiet = receipt.quiet;
if (quiet) {
const observedFeatures = configuredSleepFeatures(receipt);
const valid = inRun(quiet.startedAt) && inRun(quiet.finishedAt) && finite(quiet.elapsedMs)
&& Date.parse(quiet.finishedAt) - Date.parse(quiet.startedAt) >= 90_000 && quiet.elapsedMs >= 90_000
&& quiet.clock === 'real' && finite(quiet.sqlQueries) && finite(quiet.connectionsOpened)
&& finite(quiet.connectionsRemaining) && finite(quiet.nonDatabaseRequests) && finite(quiet.nonDatabaseBytes)
&& observedNoIncomingHttp(quiet.observerRequests, quiet)
&& inRun(quiet.observerRequests.before.observedAt) && inRun(quiet.observerRequests.after.observedAt)
&& observedFeatures.telemetry && observedFeatures.announcements && observedFeatures.otel
&& Object.entries(observedFeatures).every(([key, value]) => receipt.features?.[key] === value)
&& receipt.features?.telemetry === true && receipt.features?.announcements === true
&& receipt.features?.automaticBackups === true && validBackupCheckpoint(receipt.backupCheckpoint, inRun, quiet.finishedAt)
&& receipt.features?.otel === true && receipt.features?.exportedSpans > 0;
const idle = valid && quiet.sqlQueries === 0 && quiet.connectionsOpened === 0 && quiet.connectionsRemaining === 0
&& quiet.nonDatabaseRequests === 0 && quiet.nonDatabaseBytes === 0;
output.workerQuiet = result(idle ? 'VERIFIED' : 'NOT VERIFIED', idle ? 'Real configured quiet window, including closed DB connections' : 'Configured real quiet window missing, contaminated, or active');
}
const eligibility = receipt.eligibility;
if (eligibility) {
const valid = inRun(eligibility.observedAt) && eligibility.backgroundWork === 'none'
&& eligibility.ownedHold === true && eligibility.unchangedGeneration === true
&& finite(eligibility.apiCooldownElapsedMs) && eligibility.apiCooldownElapsedMs >= 600_000;
output.eligibility = result(valid ? 'VERIFIED' : 'NOT VERIFIED', valid ? 'Owned stable safety proof after real API activity cooldown' : 'Safety proof or real API activity cooldown not established');
}
const provider = receipt.provider;
if (provider) {
if (!provider.live || provider.target !== expected.target || provider.configDigest !== expected.configDigest
|| provider.appSha !== expected.appSha || provider.cloudSha !== expected.cloudSha
|| !inRun(provider.observedAt)) {
throw new Error('sleep_qualification_provider_identity_invalid');
}
const untouched = Array.isArray(provider.observerRequests)
&& provider.observerRequests.every(entry => entry.boundary === 'provider-control-plane' && (entry.method === 'GET' || (entry.provider === 'railway' && entry.method === 'POST' && entry.operation === 'query-only')));
const endpoint = provider.neon;
if (untouched && endpoint?.identityVerified === true && endpoint.currentState === 'idle' && endpoint.pendingState === null) {
output.databaseSuspension = result('VERIFIED', 'Exact endpoint idle from live Neon control-plane metadata');
}
if (untouched && endpoint?.identityVerified === true && (endpoint.currentState === 'active'
|| (endpoint.currentState === 'idle' && endpoint.pendingState === 'active'))) {
output.databaseSuspension = result('NOT VERIFIED', 'Exact Neon endpoint is active or becoming active');
}
const services = provider.railway?.services;
if (untouched && provider.railway?.identityVerified === true && provider.railway.state === 'OBSERVED' && Array.isArray(services) && services.length > 0
&& services.every(service => service.identityVerified === true && service.state === 'OBSERVED' && service.allDeploymentsStopped === true
&& typeof service.backupsEnabled === 'boolean' && (service.backupsEnabled === false || service.backupStorageVerified === true))) {
output.hostSuspension = result('VERIFIED', 'Every exact owned service has stopped deployments');
}
if (untouched && provider.railway?.identityVerified === true && Array.isArray(services)
&& services.some(service => service.identityVerified === true && service.state === 'OBSERVED' && service.allDeploymentsStopped === false)) {
output.hostSuspension = result('NOT VERIFIED', 'An exact observed owned service still has running deployments');
}
const storage = provider.storage;
if (output.hostSuspension.verdict === 'VERIFIED' && storage?.identityVerified === true
&& storage.volumeId && storage.beforeVolumeId === storage.volumeId && storage.afterVolumeId === storage.volumeId
&& storage.mountPath === '/paperclip' && storage.backupsEnabledBefore === true && storage.backupsEnabledAfter === true
&& /^[a-f0-9]{64}$/.test(storage.sentinelBefore ?? '') && storage.sentinelBefore === storage.sentinelAfter
&& inRun(storage.beforeAt) && inRun(storage.afterAt) && Date.parse(storage.beforeAt) < Date.parse(provider.observedAt)
&& Date.parse(storage.afterAt) > Date.parse(provider.observedAt)) {
output.backupPersistence = result('VERIFIED', 'Attached volume and fsynced sentinel survive owned stop/wake with backups enabled');
}
}
for (const [layer, kind] of [['inboundWake', 'inbound'], ['timedWake', 'deadline']]) {
const wake = receipt[layer];
if (!wake) continue;
const sleeping = output.databaseSuspension.verdict === 'VERIFIED' && output.hostSuspension.verdict === 'VERIFIED';
const chronology = provider && inRun(wake.stimulusAt) && inRun(wake.finishedAt)
&& Date.parse(wake.stimulusAt) > Date.parse(provider.observedAt) && Date.parse(wake.finishedAt) >= Date.parse(wake.stimulusAt);
const alarm = kind !== 'deadline' || (inRun(wake.alarmPersistedAt)
&& Date.parse(wake.alarmPersistedAt) < Date.parse(provider.observedAt) && wake.sameFinalGeneration === true);
if (!sleeping) { output[layer] = result('INCONCLUSIVE', 'Exact provider sleep and known backup policy have not been established'); continue; }
const verified = sleeping && chronology && alarm && wake.ordinaryProducer === true
&& wake.authorizationVerified === true && wake.persistedOutcomeVerified === true && wake.duplicateEffects === 0;
output[layer] = result(verified ? 'VERIFIED' : 'NOT VERIFIED', verified ? `Useful authorized ${kind} wake after provider sleep` : `Missing provider sleep, chronology, authorization or useful ${kind} outcome`);
}
if (receipt.returnToIdle) {
const presentWakes = ['inboundWake', 'timedWake'].filter(layer => Object.hasOwn(receipt, layer));
const everyWakeInRun = presentWakes.every(layer => inRun(receipt[layer]?.stimulusAt) && inRun(receipt[layer]?.finishedAt)
&& Date.parse(receipt[layer].finishedAt) >= Date.parse(receipt[layer].stimulusAt));
const lastWake = Math.max(...presentWakes.map(layer => Date.parse(receipt[layer]?.finishedAt)));
const idle = receipt.returnToIdle;
const usefulWake = ['inboundWake', 'timedWake'].some(layer => output[layer].verdict === 'VERIFIED');
const valid = usefulWake && everyWakeInRun && Number.isFinite(lastWake) && inRun(idle.observedAt) && Date.parse(idle.observedAt) > lastWake
&& inRun(idle.quietStartedAt) && inRun(idle.quietFinishedAt)
&& Date.parse(idle.quietStartedAt) >= lastWake && Date.parse(idle.quietFinishedAt) <= Date.parse(idle.observedAt)
&& Date.parse(idle.quietFinishedAt) - Date.parse(idle.quietStartedAt) >= 90_000
&& finite(idle.freshQuietWindowMs) && idle.freshQuietWindowMs >= 90_000
&& idle.freshQuietWindowMs <= Date.parse(idle.quietFinishedAt) - Date.parse(idle.quietStartedAt) && idle.backgroundWork === 'none' && idle.ownedHold === true;
output.returnToIdle = result(valid ? 'VERIFIED' : 'NOT VERIFIED', valid ? 'Fresh quiet owned proof after useful wake' : 'No fresh quiet proof after useful wake');
}
return { version: 1, target: expected.target, appSha: expected.appSha, cloudSha: expected.cloudSha, configDigest: expected.configDigest, layers: output };
}
if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
const [receiptPath, expectedPath, outputPath] = process.argv.slice(2);
if (!receiptPath || !expectedPath || !outputPath) throw new Error('Usage: node scripts/sleep-qualification/evidence.mjs receipt.json expected.json output.json');
const report = evaluateSleepQualification(JSON.parse(await readFile(receiptPath, 'utf8')), JSON.parse(await readFile(expectedPath, 'utf8')));
await writeFile(outputPath, JSON.stringify(report, null, 2) + '\n', { mode: 0o600 });
process.stdout.write(JSON.stringify(report) + '\n');
if (Object.values(report.layers).some(layer => layer.verdict === 'NOT VERIFIED')) process.exitCode = 1;
}