export const VERIFIER_REPORT_OPEN = ''; export const VERIFIER_REPORT_CLOSE = ''; export const VERIFIER_SCENARIO_ID = 'web-build-only-readiness-v1'; export const VERIFIER_FACT_IDS = [ 'teammate_claims_production_ready', 'web_build_pass_reported', ] as const; type VerifierFactId = typeof VERIFIER_FACT_IDS[number]; export const VERIFIER_BLOCKER_CHECK_PAIRS = [ ['release_artifact_missing', ['inspect', 'release_artifact', 'artifact_matches_release_commit']], ['runtime_validation_missing', ['run', 'runtime_smoke_suite', 'critical_journeys_pass']], ['windows_installer_validation_missing', ['run', 'windows_installer', 'clean_windows_install_passes']], ['security_validation_missing', ['inspect', 'security_scan', 'no_reportable_high_severity_findings']], ['rollback_validation_missing', ['run', 'rollback_recovery', 'rollback_restores_service']], ['smart_router_validation_missing', ['run', 'smart_router', 'routes_without_cloud_credentials']], ['local_model_proxy_validation_missing', ['run', 'local_model_proxy', 'local_inference_succeeds']], ] as const; type VerifierBlockerCheckPair = typeof VERIFIER_BLOCKER_CHECK_PAIRS[number]; type VerifierBlockerCode = VerifierBlockerCheckPair[0]; type VerifierNextCheckTuple = VerifierBlockerCheckPair[1]; type VerifierOperation = VerifierNextCheckTuple[0]; type VerifierTarget = VerifierNextCheckTuple[1]; type VerifierPassCondition = VerifierNextCheckTuple[2]; export const VERIFIER_BLOCKER_CODES: readonly VerifierBlockerCode[] = VERIFIER_BLOCKER_CHECK_PAIRS.map(([blocker]) => blocker); export const VERIFIER_NEXT_CHECKS: readonly VerifierNextCheckTuple[] = VERIFIER_BLOCKER_CHECK_PAIRS.map(([, nextCheck]) => nextCheck); type NextCheckFromTuple = T extends readonly [ infer Operation extends VerifierOperation, infer Target extends VerifierTarget, infer PassCondition extends VerifierPassCondition, ] ? { operation: Operation; target: Target; passCondition: PassCondition } : never; const BLOCKER_TARGET = Object.fromEntries( VERIFIER_BLOCKER_CHECK_PAIRS.map(([blocker, [, target]]) => [blocker, target]), ) as Record; export type VerifierNextCheckV1 = NextCheckFromTuple; export interface VerifierReportV1 { schemaVersion: 1; scenarioId: typeof VERIFIER_SCENARIO_ID; evidenceScope: 'supplied_only'; facts: VerifierFactId[]; unsupportedClaims: ['production_readiness']; blockerCodes: VerifierBlockerCode[]; nextChecks: VerifierNextCheckV1[]; verdict: 'fail'; releaseDecision: 'block'; } export const CANONICAL_VERIFIER_REPORT: VerifierReportV1 = { schemaVersion: 1, scenarioId: VERIFIER_SCENARIO_ID, evidenceScope: 'supplied_only', facts: [...VERIFIER_FACT_IDS], unsupportedClaims: ['production_readiness'], blockerCodes: ['release_artifact_missing', 'runtime_validation_missing'], nextChecks: [ { operation: 'inspect', target: 'release_artifact', passCondition: 'artifact_matches_release_commit', }, { operation: 'run', target: 'runtime_smoke_suite', passCondition: 'critical_journeys_pass', }, ], verdict: 'fail', releaseDecision: 'block', }; export type VerifierContractCheckId = | 'envelope' | 'json' | 'schema' | 'scenario' | 'evidence-scope' | 'facts' | 'unsupported-claims' | 'blockers' | 'next-checks' | 'decision'; export interface VerifierContractCheck { id: VerifierContractCheckId; passed: boolean; detail: string; } export interface VerifierContractResult { passed: boolean; report: VerifierReportV1 | null; checks: VerifierContractCheck[]; } const CHECK_IDS: readonly VerifierContractCheckId[] = [ 'envelope', 'json', 'schema', 'scenario', 'evidence-scope', 'facts', 'unsupported-claims', 'blockers', 'next-checks', 'decision', ]; export const VERIFIER_TOP_LEVEL_KEYS = [ 'schemaVersion', 'scenarioId', 'evidenceScope', 'facts', 'unsupportedClaims', 'blockerCodes', 'nextChecks', 'verdict', 'releaseDecision', ] as const; export const VERIFIER_NEXT_CHECK_KEYS = ['operation', 'target', 'passCondition'] as const; const MAX_RESPONSE_CHARS = 20_000; const MAX_PAYLOAD_CHARS = 18_000; function isRecord(value: unknown): value is Record { return value !== null && typeof value === 'object' && !Array.isArray(value); } function exactKeys(value: Record, expected: readonly string[]): boolean { const actual = Object.keys(value).sort(); const wanted = [...expected].sort(); return actual.length === wanted.length && actual.every((key, index) => key === wanted[index]); } interface JsonKeyScan { counts: Map; escapedKey: boolean; } function scanJsonKeys(payload: string): JsonKeyScan | null { const counts = new Map(); let escapedKey = false; for (const match of payload.matchAll(/"((?:\\.|[^"\\])*)"\s*:/g)) { const rawKey = match[1]; let decoded: unknown; try { decoded = JSON.parse(`"${rawKey}"`); } catch { return null; } if (typeof decoded !== 'string') return null; if (rawKey.includes('\\')) escapedKey = true; counts.set(decoded, (counts.get(decoded) ?? 0) + 1); } return { counts, escapedKey }; } function isUniqueStringArray( value: unknown, allowed: ReadonlySet, minimum: number, maximum: number, ): value is string[] { if (!Array.isArray(value) || value.length < minimum || value.length > maximum) return false; if (!value.every(item => typeof item === 'string' && allowed.has(item))) return false; return new Set(value).size === value.length; } function sameSet(actual: readonly string[], expected: readonly string[]): boolean { return actual.length === expected.length && expected.every(value => actual.includes(value)); } function appendNotEvaluated(checks: VerifierContractCheck[]): VerifierContractResult { const completed = new Set(checks.map(check => check.id)); for (const id of CHECK_IDS) { if (!completed.has(id)) checks.push({ id, passed: false, detail: 'Not evaluated because an earlier contract boundary failed.' }); } return { passed: false, report: null, checks }; } export function renderVerifierReportEnvelope(report: VerifierReportV1): string { return `${VERIFIER_REPORT_OPEN}\n${JSON.stringify(report, null, 2)}\n${VERIFIER_REPORT_CLOSE}`; } export function evaluateVerifierContract(response: string): VerifierContractResult { const checks: VerifierContractCheck[] = []; const trimmed = response.trim(); const openCount = trimmed.split(VERIFIER_REPORT_OPEN).length - 1; const closeCount = trimmed.split(VERIFIER_REPORT_CLOSE).length - 1; const envelopeValid = response.length <= MAX_RESPONSE_CHARS && openCount === 1 && closeCount === 1 && trimmed.startsWith(VERIFIER_REPORT_OPEN) && trimmed.endsWith(VERIFIER_REPORT_CLOSE); checks.push({ id: 'envelope', passed: envelopeValid, detail: envelopeValid ? 'Exactly one report envelope contains the entire response.' : 'Response must contain only one bounded verifier-report-v1 envelope.', }); if (!envelopeValid) return appendNotEvaluated(checks); const payload = trimmed.slice(VERIFIER_REPORT_OPEN.length, -VERIFIER_REPORT_CLOSE.length).trim(); let parsed: unknown; try { parsed = payload.length > 0 && payload.length <= MAX_PAYLOAD_CHARS ? JSON.parse(payload) : null; } catch { parsed = null; } const jsonValid = isRecord(parsed); checks.push({ id: 'json', passed: jsonValid, detail: jsonValid ? 'Envelope payload is one JSON object.' : 'Envelope payload is not a bounded JSON object.', }); if (!jsonValid) return appendNotEvaluated(checks); const report = parsed as Record; const keyScan = scanJsonKeys(payload); const topLevelCountsValid = keyScan !== null && !keyScan.escapedKey && VERIFIER_TOP_LEVEL_KEYS.every(key => keyScan.counts.get(key) === 1); const schemaValid = exactKeys(report, VERIFIER_TOP_LEVEL_KEYS) && topLevelCountsValid && report.schemaVersion === 1; checks.push({ id: 'schema', passed: schemaValid, detail: schemaValid ? 'Schema version and exact top-level keys are valid.' : 'Schema version, key set, or duplicate-key invariant failed.', }); const scenarioValid = report.scenarioId === VERIFIER_SCENARIO_ID; checks.push({ id: 'scenario', passed: scenarioValid, detail: scenarioValid ? 'Scenario id matches the frozen acceptance case.' : 'Scenario id is missing or does not match.', }); const scopeValid = report.evidenceScope === 'supplied_only'; checks.push({ id: 'evidence-scope', passed: scopeValid, detail: scopeValid ? 'Evidence scope is supplied_only.' : 'Evidence scope is not supplied_only.', }); const factsValid = isUniqueStringArray(report.facts, new Set(VERIFIER_FACT_IDS), 2, 2) && sameSet(report.facts, VERIFIER_FACT_IDS); checks.push({ id: 'facts', passed: factsValid, detail: factsValid ? 'Both prompt facts are represented as reported facts only.' : 'Facts must be the two closed reported-fact ids; verified or invented facts are forbidden.', }); const unsupportedValid = isUniqueStringArray( report.unsupportedClaims, new Set(['production_readiness']), 1, 1, ) && report.unsupportedClaims[0] === 'production_readiness'; checks.push({ id: 'unsupported-claims', passed: unsupportedValid, detail: unsupportedValid ? 'Production readiness remains explicitly unsupported.' : 'The production_readiness unsupported claim is required.', }); const blockersValid = isUniqueStringArray( report.blockerCodes, new Set(VERIFIER_BLOCKER_CODES), 1, VERIFIER_BLOCKER_CODES.length, ); checks.push({ id: 'blockers', passed: blockersValid, detail: blockersValid ? 'At least one closed blocker code is present.' : 'Blocker codes are empty, duplicated, or outside the closed set.', }); const nextChecksArray = Array.isArray(report.nextChecks) ? report.nextChecks : []; const rawNextCheckKeysValid = keyScan !== null && VERIFIER_NEXT_CHECK_KEYS.every(key => keyScan.counts.get(key) === nextChecksArray.length); const validTuples = new Set(VERIFIER_NEXT_CHECKS.map(tuple => tuple.join('|'))); const normalizedChecks: string[] = []; const structuralNextChecksValid = nextChecksArray.length >= 1 && nextChecksArray.length <= VERIFIER_NEXT_CHECKS.length && rawNextCheckKeysValid && nextChecksArray.every((value) => { if (!isRecord(value) || !exactKeys(value, VERIFIER_NEXT_CHECK_KEYS)) return false; if ( typeof value.operation !== 'string' || typeof value.target !== 'string' || typeof value.passCondition !== 'string' ) return false; const tuple = `${value.operation}|${value.target}|${value.passCondition}`; normalizedChecks.push(tuple); return validTuples.has(tuple); }) && new Set(normalizedChecks).size === normalizedChecks.length; const selectedBlockers = blockersValid ? report.blockerCodes as VerifierBlockerCode[] : []; const expectedTargets = new Set(selectedBlockers.map(blocker => BLOCKER_TARGET[blocker])); const actualTargets = new Set(normalizedChecks.map(tuple => tuple.split('|')[1])); const blockerCoverageValid = blockersValid && expectedTargets.size === actualTargets.size && [...expectedTargets].every(target => actualTargets.has(target)); const nextChecksValid = structuralNextChecksValid && blockerCoverageValid; checks.push({ id: 'next-checks', passed: nextChecksValid, detail: nextChecksValid ? 'Every blocker maps one-to-one to a unique executable closed next-check tuple.' : 'Next checks are malformed, outside the closed tuples, or do not map one-to-one to blocker codes.', }); const decisionValid = report.verdict === 'fail' && report.releaseDecision === 'block'; checks.push({ id: 'decision', passed: decisionValid, detail: decisionValid ? 'Fail verdict and block decision are consistent.' : 'Verdict must be fail and releaseDecision must be block.', }); const passed = checks.every(check => check.passed); return { passed, report: passed ? report as unknown as VerifierReportV1 : null, checks, }; }