import { existsSync, readFileSync } from 'node:fs'; import { resolve } from 'node:path'; const root = process.cwd(); const manifestPath = resolve(root, 'docs/contracts/refactoring-r0-manifest.json'); function assert(condition, message) { if (!condition) { throw new Error(message); } } function read(relativePath) { const absolutePath = resolve(root, relativePath); assert(existsSync(absolutePath), `R0 baseline file is missing: ${relativePath}`); return readFileSync(absolutePath, 'utf8'); } const manifest = JSON.parse(read('docs/contracts/refactoring-r0-manifest.json')); assert(manifest.version === 'r0', 'R0 manifest version must be r0'); assert(/^[0-9a-f]{40}$/.test(manifest.baselineCommit), 'R0 baselineCommit must be a full Git commit'); for (const contract of manifest.contracts) { for (const path of [contract.schema, contract.validator, ...(contract.examples ?? []), ...(contract.tests ?? [])].filter(Boolean)) { read(path); } assert((contract.invariants?.length ?? contract.examples?.length ?? 0) > 0, `${contract.kind}: no frozen examples or invariants`); } const facadeChecks = [ ['api/src/send-chain/send-chain.service.ts', 'export class SendChainService'], ['api/src/channels/channels.service.ts', 'export class ChannelsService'], ['api/src/operations/operations.service.ts', 'export class OperationsService'], ['api/src/sms-config/sms-config.service.ts', 'export class SmsConfigService'], ['api/src/report-materials/report-materials.service.ts', 'export class ReportMaterialsService'], ['src/api/adminApi.ts', 'export const adminApi'], ['gateway/internal/inbound/server.go', 'type Server struct'], ['gateway/internal/upstream/manager.go', 'type Manager struct'], ]; for (const [path, stableExport] of facadeChecks) { assert(read(path).includes(stableExport), `${path}: stable facade not found: ${stableExport}`); } const characterizationChecks = [ ['api/src/send-chain/send-chain.service.spec.ts', 'allows only one retry submit when three long-message failure receipts race'], ['api/src/send-chain/send-chain.service.spec.ts', 'creates and sends only one downstream final receipt under concurrent completion'], ['api/src/send-chain/send-chain.service.spec.ts', 'atomically claims a downstream manual requeue so concurrent requests only call Gateway once'], ['api/src/billing/billing.service.spec.ts', 'serializes and replays concurrent refunds with one balance mutation'], ['gateway/internal/inbound/server_test.go', 'TestDownstreamDeliveryRequiresAcknowledgement'], ['gateway/internal/upstream/connection_loss_test.go', 'TestReconnectDelayUsesCappedBackoffAndSlowAuthenticationRetry'], ['gateway/internal/upstream/reconnect_integration_test.go', 'TestFailedSupplierConnectionReconnectsWhenEndpointRecovers'], ['gateway/internal/cmpp/gocmpp_integration_test.go', 'TestGocmppDeliverReceiptPackAndUnpack'], ]; for (const [path, behavior] of characterizationChecks) { assert(read(path).includes(behavior), `${path}: required characterization test is missing: ${behavior}`); } read('docs/refactoring/r0-responsibility-index.md'); read('docs/refactoring/r0-release-gate.md'); console.log(`R0 refactoring baseline verified: ${manifest.contracts.length} contract groups, ${facadeChecks.length} stable facades, ${characterizationChecks.length} critical behaviors.`);