@plasius/schema 1.4.2 → 1.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/validation/currencyCode.ISO4217.ts","../src/validation/percentage.ISO80000-1.ts","../src/validation/name.OWASP.ts","../src/validation/user.MS-GOOGLE-APPLE.ts","../src/components.ts","../src/player-system-events.ts","../src/feedback.ts"],"sourcesContent":["export const isoCurrencyCodes = new Set([\n \"AED\",\n \"AFN\",\n \"ALL\",\n \"AMD\",\n \"ANG\",\n \"AOA\",\n \"ARS\",\n \"AUD\",\n \"AWG\",\n \"AZN\",\n \"BAM\",\n \"BBD\",\n \"BDT\",\n \"BGN\",\n \"BHD\",\n \"BIF\",\n \"BMD\",\n \"BND\",\n \"BOB\",\n \"BOV\",\n \"BRL\",\n \"BSD\",\n \"BTN\",\n \"BWP\",\n \"BYN\",\n \"BZD\",\n \"CAD\",\n \"CDF\",\n \"CHE\",\n \"CHF\",\n \"CHW\",\n \"CLF\",\n \"CLP\",\n \"CNY\",\n \"COP\",\n \"COU\",\n \"CRC\",\n \"CUC\",\n \"CUP\",\n \"CVE\",\n \"CZK\",\n \"DJF\",\n \"DKK\",\n \"DOP\",\n \"DZD\",\n \"EGP\",\n \"ERN\",\n \"ETB\",\n \"EUR\",\n \"FJD\",\n \"FKP\",\n \"GBP\",\n \"GEL\",\n \"GHS\",\n \"GIP\",\n \"GMD\",\n \"GNF\",\n \"GTQ\",\n \"GYD\",\n \"HKD\",\n \"HNL\",\n \"HRK\",\n \"HTG\",\n \"HUF\",\n \"IDR\",\n \"ILS\",\n \"INR\",\n \"IQD\",\n \"IRR\",\n \"ISK\",\n \"JMD\",\n \"JOD\",\n \"JPY\",\n \"KES\",\n \"KGS\",\n \"KHR\",\n \"KMF\",\n \"KPW\",\n \"KRW\",\n \"KWD\",\n \"KYD\",\n \"KZT\",\n \"LAK\",\n \"LBP\",\n \"LKR\",\n \"LRD\",\n \"LSL\",\n \"LYD\",\n \"MAD\",\n \"MDL\",\n \"MGA\",\n \"MKD\",\n \"MMK\",\n \"MNT\",\n \"MOP\",\n \"MRU\",\n \"MUR\",\n \"MVR\",\n \"MWK\",\n \"MXN\",\n \"MXV\",\n \"MYR\",\n \"MZN\",\n \"NAD\",\n \"NGN\",\n \"NIO\",\n \"NOK\",\n \"NPR\",\n \"NZD\",\n \"OMR\",\n \"PAB\",\n \"PEN\",\n \"PGK\",\n \"PHP\",\n \"PKR\",\n \"PLN\",\n \"PYG\",\n \"QAR\",\n \"RON\",\n \"RSD\",\n \"RUB\",\n \"RWF\",\n \"SAR\",\n \"SBD\",\n \"SCR\",\n \"SDG\",\n \"SEK\",\n \"SGD\",\n \"SHP\",\n \"SLE\",\n \"SLL\",\n \"SOS\",\n \"SRD\",\n \"SSP\",\n \"STN\",\n \"SVC\",\n \"SYP\",\n \"SZL\",\n \"THB\",\n \"TJS\",\n \"TMT\",\n \"TND\",\n \"TOP\",\n \"TRY\",\n \"TTD\",\n \"TWD\",\n \"TZS\",\n \"UAH\",\n \"UGX\",\n \"USD\",\n \"USN\",\n \"UYI\",\n \"UYU\",\n \"UYW\",\n \"UZS\",\n \"VES\",\n \"VND\",\n \"VUV\",\n \"WST\",\n \"XAF\",\n \"XAG\",\n \"XAU\",\n \"XBA\",\n \"XBB\",\n \"XBC\",\n \"XBD\",\n \"XCD\",\n \"XDR\",\n \"XOF\",\n \"XPD\",\n \"XPF\",\n \"XPT\",\n \"XSU\",\n \"XTS\",\n \"XUA\",\n \"XXX\",\n \"YER\",\n \"ZAR\",\n \"ZMW\",\n \"ZWL\",\n]);\n\n\n/** \n * Validates whether a string is a valid ISO 4217 currency code. \n * Performs a case-insensitive lookup against a predefined set of known codes.\n */\nexport const validateCurrencyCode = (value: unknown): boolean => {\n if (typeof value !== \"string\") return false;\n return isoCurrencyCodes.has(value.toUpperCase());\n};\n","/**\n * Validates that a number is a percentage value (0 to 100 inclusive).\n * Global Standard: ISO 80000-1 percentage definition.\n */\nexport function validatePercentage(value: unknown): boolean {\n if (typeof value !== \"number\") return false;\n return value >= 0 && value <= 100;\n}\n","function validateNameLike(value: unknown, pattern: RegExp): boolean {\n if (typeof value !== \"string\") return false;\n\n const trimmed = value.trim();\n if (trimmed.length === 0) return false;\n\n // Limit length (ISO guidance: max 256 is typical)\n if (trimmed.length > 256) return false;\n\n // Reject ASCII control chars (U+0000–U+001F and U+007F)\n for (const ch of trimmed) {\n const cp = ch.codePointAt(0)!;\n if ((cp >= 0x00 && cp <= 0x1F) || cp === 0x7F) return false;\n }\n\n if (!pattern.test(trimmed)) return false;\n\n return true;\n}\n\n/**\n * Validates that a personal name is safe and culturally inclusive.\n *\n * Decimal digits remain unsupported because first, middle, and last names are\n * personal-name components rather than public display identifiers.\n *\n * Global Standard: OWASP Input Validation Cheat Sheet + ICAO Doc 9303 + IETF PRECIS\n */\nexport function validateName(value: unknown): boolean {\n return validateNameLike(value, /^[\\p{L}\\p{M}'\\-. ]+$/u);\n}\n\n/**\n * Validates a public display name independently from personal-name fields.\n *\n * Unicode decimal digits are supported alongside letters and combining marks\n * so legitimate display names such as `Player 2` remain representable without\n * relaxing first, middle, or last-name validation.\n *\n * Global Standard: OWASP Input Validation Cheat Sheet + IETF PRECIS\n */\nexport function validateDisplayName(value: unknown): boolean {\n return validateNameLike(value, /^[\\p{L}\\p{M}\\p{Nd}'\\-. ]+$/u);\n}\n","/**\n * Validates that a user ID is a valid `sub` from one of the supported identity providers.\n * Global Standard: OpenID Connect Core 1.0 `sub` claim.\n */\nexport function validateUserId(value: unknown): boolean {\n if (typeof value !== \"string\") return false;\n\n const trimmed = value.trim();\n if (trimmed.length === 0) return false;\n\n // Google: all digits\n const googlePattern = /^\\d{21,22}$/;\n\n // Microsoft: UUID v4\n const microsoftPattern =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n // Apple: opaque, usually UUID but allow any printable string up to 255 chars\n const applePattern = /^[\\w\\-.]{6,255}$/; // Alphanumeric + - . _ (common safe characters)\n\n return (\n googlePattern.test(trimmed) ||\n microsoftPattern.test(trimmed) ||\n applePattern.test(trimmed)\n );\n}\n\nexport function validateUserIdArray(value: unknown): boolean {\n if (!Array.isArray(value)) return false;\n return value.every(validateUserId);\n}","import { Infer } from \"./infer.js\";\nimport { createSchema } from \"./schema.js\";\nimport { Schema, SchemaShape } from \"./types.js\";\n// This module provides a registry for component schemas, allowing components to be registered and retrieved by type.\nconst componentSchemaRegistry = new Map<string, Schema<SchemaShape>>();\n\nexport function createComponentSchema<T extends SchemaShape>(\n shape: SchemaShape,\n name: string,\n version: string,\n tableName: string = \"\",\n schemaValidator: (entity: Infer<T>) => boolean = () => true\n): Schema<SchemaShape> {\n const schema = createSchema<T>(shape as T, name, {\n version: version,\n piiEnforcement: \"strict\",\n table: tableName,\n schemaValidator,\n });\n registerComponentSchema(name, schema as Schema<SchemaShape>);\n return schema as Schema<SchemaShape>;\n}\n\nexport function registerComponentSchema(\n type: string,\n schema: Schema<SchemaShape>\n) {\n componentSchemaRegistry.set(type, schema);\n}\n\nexport function getComponentSchema(\n type: string\n): Schema<SchemaShape> | undefined {\n return componentSchemaRegistry.get(type);\n}\n\nexport function getAllComponentSchemas(): [string, Schema<SchemaShape>][] {\n return Array.from(componentSchemaRegistry.entries());\n}\n","import { field } from \"./field.js\";\nimport { createSchema } from \"./schema.js\";\n\n/** Event classes that can be observed by a player. */\nexport const PLAYER_SYSTEM_EVENT_KINDS = [\n \"combat\",\n \"social\",\n \"mission\",\n \"crafting\",\n \"world\",\n] as const;\n\nexport type PlayerSystemEventKind = (typeof PLAYER_SYSTEM_EVENT_KINDS)[number];\n\n/** Achievement tiers exposed by the curated player projection. */\nexport const PLAYER_SYSTEM_ACHIEVEMENT_TIERS = [\n \"bronze\",\n \"silver\",\n \"gold\",\n] as const;\n\nexport type PlayerSystemAchievementTier =\n (typeof PLAYER_SYSTEM_ACHIEVEMENT_TIERS)[number];\n\n/** Projection states for an achievement progress track. */\nexport const PLAYER_SYSTEM_ACHIEVEMENT_TRACK_STATUSES = [\n \"tracking\",\n \"earned\",\n] as const;\n\nexport type PlayerSystemAchievementTrackStatus =\n (typeof PLAYER_SYSTEM_ACHIEVEMENT_TRACK_STATUSES)[number];\n\nconst playerIdField = () =>\n field\n .string()\n .min(1)\n .max(128)\n .PID({\n classification: \"low\",\n action: \"none\",\n logHandling: \"pseudonym\",\n purpose: \"a stable player-scoped storage identifier\",\n })\n .description(\n \"Stable player identifier; the only personal identifier retained in event projections\",\n );\n\nconst eventIdField = () => field.string().min(1).max(128);\n\nconst eventKindField = () =>\n field.string().enum(PLAYER_SYSTEM_EVENT_KINDS);\n\nconst eventTitleField = () =>\n field\n .generalText()\n .min(1)\n .max(120)\n .description(\"Player-visible event title\");\n\nconst eventSummaryField = () =>\n field\n .generalText()\n .min(1)\n .max(320)\n .description(\"Player-visible event summary\");\n\nconst observedEventFields = (defaultHighlighted = true) => ({\n id: eventIdField(),\n playerId: playerIdField(),\n occurredAt: field.dateTimeISO(),\n kind: eventKindField(),\n title: eventTitleField(),\n summary: eventSummaryField(),\n highlighted: defaultHighlighted\n ? field.boolean().default(false)\n : field.boolean(),\n});\n\nconst eventHighlightFields = () => ({\n id: eventIdField(),\n title: eventTitleField(),\n summary: eventSummaryField(),\n occurredAt: field.dateTimeISO(),\n kind: eventKindField(),\n});\n\nconst eventEntryFields = () => ({\n id: eventIdField(),\n title: eventTitleField(),\n summary: eventSummaryField(),\n occurredAt: field.dateTimeISO(),\n kind: eventKindField(),\n highlighted: field.boolean(),\n});\n\nconst achievementFields = () => ({\n id: eventIdField(),\n title: eventTitleField(),\n tier: field.string().enum(PLAYER_SYSTEM_ACHIEVEMENT_TIERS),\n progressLabel: eventSummaryField(),\n earnedAt: field.dateTimeISO().optional(),\n});\n\nconst achievementTrackFields = () => ({\n id: eventIdField(),\n title: eventTitleField(),\n current: field.number().min(0).max(1000),\n target: field.number().min(1).max(1000),\n status: field.string().enum(PLAYER_SYSTEM_ACHIEVEMENT_TRACK_STATUSES),\n});\n\n/** A player-observable event accepted at the ingestion boundary. */\nexport interface PlayerSystemObservedEvent {\n id: string;\n playerId: string;\n occurredAt: string;\n kind: PlayerSystemEventKind;\n title: string;\n summary: string;\n highlighted: boolean;\n}\n\n/** A raw event batch written to the blob-backed ingestion zone. */\nexport interface PlayerSystemObservedEventBatch {\n source: string;\n emittedAt: string;\n events: readonly PlayerSystemObservedEvent[];\n}\n\n/** A normalized event enriched with its deterministic deduplication key. */\nexport interface PlayerSystemNormalizedObservedEvent\n extends PlayerSystemObservedEvent {\n deterministicKey: string;\n}\n\n/** A normalized event batch written by the projection processor. */\nexport interface PlayerSystemNormalizedEventBatch {\n sourceBlobName: string;\n processedAt: string;\n events: readonly PlayerSystemNormalizedObservedEvent[];\n}\n\n/** A highlighted event shown in the curated player Event Log. */\nexport interface PlayerSystemEventHighlight {\n id: string;\n title: string;\n summary: string;\n occurredAt: string;\n kind: PlayerSystemEventKind;\n}\n\n/** A recent event shown in the curated player Event Log. */\nexport interface PlayerSystemEventEntry extends PlayerSystemEventHighlight {\n highlighted: boolean;\n}\n\n/** An earned or explainable achievement projected from observed events. */\nexport interface PlayerSystemAchievementEntry {\n id: string;\n title: string;\n tier: PlayerSystemAchievementTier;\n progressLabel: string;\n earnedAt?: string;\n}\n\n/** Progress toward an achievement projected from observed events. */\nexport interface PlayerSystemAchievementTrack {\n id: string;\n title: string;\n current: number;\n target: number;\n status: PlayerSystemAchievementTrackStatus;\n}\n\n/** Curated per-player Event Log and Achievement read model. */\nexport interface PlayerSystemCuratedSnapshot {\n playerId: string;\n projectedAt: string;\n lastObservedAt: string;\n highlights: readonly PlayerSystemEventHighlight[];\n events: readonly PlayerSystemEventEntry[];\n achievements: readonly PlayerSystemAchievementEntry[];\n tracks: readonly PlayerSystemAchievementTrack[];\n}\n\n/** Schema for raw player-observable event batches. */\nexport const PlayerSystemObservedEventBatchSchema = createSchema(\n {\n source: field.string().min(1).max(120),\n emittedAt: field.dateTimeISO(),\n events: field.array(field.object(observedEventFields())),\n },\n \"player-system-observed-event-batch\",\n {\n version: \"1.0.0\",\n piiEnforcement: \"strict\",\n },\n);\n\n/** Schema for normalized event batches used by projections and gossip sourcing. */\nexport const PlayerSystemNormalizedEventBatchSchema = createSchema(\n {\n sourceBlobName: field.string().min(1).max(512),\n processedAt: field.dateTimeISO(),\n events: field.array(\n field.object({\n ...observedEventFields(false),\n deterministicKey: field.string().min(1).max(256),\n }),\n ),\n },\n \"player-system-normalized-event-batch\",\n {\n version: \"1.0.0\",\n piiEnforcement: \"strict\",\n },\n);\n\n/** Schema for curated per-player Event Log and Achievement read models. */\nexport const PlayerSystemCuratedSnapshotSchema = createSchema(\n {\n playerId: playerIdField(),\n projectedAt: field.dateTimeISO(),\n lastObservedAt: field.dateTimeISO(),\n highlights: field.array(field.object(eventHighlightFields())),\n events: field.array(field.object(eventEntryFields())),\n achievements: field.array(field.object(achievementFields())),\n tracks: field.array(field.object(achievementTrackFields())),\n },\n \"player-system-curated-snapshot\",\n {\n version: \"1.0.0\",\n piiEnforcement: \"strict\",\n },\n);\n\nexport type PlayerSystemObservedEventBatchEntity =\n PlayerSystemObservedEventBatch & {\n type: \"player-system-observed-event-batch\";\n version: \"1.0.0\";\n };\n\nexport type PlayerSystemNormalizedEventBatchEntity =\n PlayerSystemNormalizedEventBatch & {\n type: \"player-system-normalized-event-batch\";\n version: \"1.0.0\";\n };\n\nexport type PlayerSystemCuratedSnapshotEntity = PlayerSystemCuratedSnapshot & {\n type: \"player-system-curated-snapshot\";\n version: \"1.0.0\";\n};\n","import { field } from \"./field.js\";\nimport { FEEDBACK_CONTRACT_VERSION } from \"./feedback-contract-version.js\";\nimport {\n FEEDBACK_BACKEND_BUCKETS,\n FEEDBACK_FRAME_RATE_BUCKETS,\n FEEDBACK_FRAME_TIME_BUCKETS,\n FEEDBACK_GAME_COUNTER_CODES,\n FEEDBACK_GAME_COUNTER_MAX_COUNT,\n FEEDBACK_GAME_COUNTER_MAX_ITEMS,\n FEEDBACK_GAME_ERROR_CODES,\n FEEDBACK_GAME_FEATURE_IDS,\n FEEDBACK_GAME_PROVENANCE_CONTRACT_IDS,\n FEEDBACK_GAME_PROVENANCE_CONTRACTS,\n FEEDBACK_GAME_SURFACE_IDS,\n FEEDBACK_RENDERER_BUCKETS,\n FEEDBACK_VIEWPORT_BUCKETS,\n FeedbackGameDiagnosticsSchema,\n feedbackGameDiagnosticsShape as gameDiagnosticsShape,\n isFeedbackGameDiagnosticsConsistent as isGameDiagnosticsConsistent,\n validateFeedbackGameDiagnostics,\n} from \"./feedback-diagnostics.contract.js\";\nimport type {\n FeedbackGameDiagnostics,\n FeedbackGameDiagnosticsValidationResult,\n} from \"./feedback-diagnostics.contract.js\";\nimport {\n FEEDBACK_UNICODE_PROFILE_ID,\n containsFeedbackUnicodeProfileUnsupportedText,\n} from \"./feedback-unicode-profile.js\";\nimport { createSchema } from \"./schema.js\";\nimport type { ValidationIssue } from \"./validation.types.js\";\n\nexport { FEEDBACK_CONTRACT_VERSION };\nexport {\n FEEDBACK_BACKEND_BUCKETS,\n FEEDBACK_FRAME_RATE_BUCKETS,\n FEEDBACK_FRAME_TIME_BUCKETS,\n FEEDBACK_GAME_COUNTER_CODES,\n FEEDBACK_GAME_COUNTER_MAX_COUNT,\n FEEDBACK_GAME_COUNTER_MAX_ITEMS,\n FEEDBACK_GAME_ERROR_CODES,\n FEEDBACK_GAME_FEATURE_IDS,\n FEEDBACK_GAME_PROVENANCE_CONTRACT_IDS,\n FEEDBACK_GAME_PROVENANCE_CONTRACTS,\n FEEDBACK_GAME_SURFACE_IDS,\n FEEDBACK_RENDERER_BUCKETS,\n FEEDBACK_VIEWPORT_BUCKETS,\n FeedbackGameDiagnosticsSchema,\n validateFeedbackGameDiagnostics,\n};\nexport type {\n FeedbackGameDiagnostics,\n FeedbackGameDiagnosticsValidationResult,\n};\n\n/**\n * Canonical Unicode normalization data shared by every v1 narrative\n * processor.\n */\nexport const FEEDBACK_UNICODE_NORMALIZATION_PROFILE =\n FEEDBACK_UNICODE_PROFILE_ID;\n\n/** Exact progressive bug cooldown ladder, in seconds. */\nexport const FEEDBACK_BUG_COOLDOWN_SECONDS = Object.freeze([\n 5 * 60,\n 15 * 60,\n 60 * 60,\n 6 * 60 * 60,\n 24 * 60 * 60,\n] as const);\n\n/** Exact post-review suppression period, in seconds. */\nexport const FEEDBACK_REVIEW_COOLDOWN_SECONDS = 30 * 24 * 60 * 60;\n\n/** Closed abuse-control bands safe to aggregate without reporter identity. */\nexport const FEEDBACK_ABUSE_BLOCK_BANDS = Object.freeze([\n \"five-minutes\",\n \"fifteen-minutes\",\n \"one-hour\",\n \"six-hours\",\n \"twenty-four-hours\",\n \"fail-closed\",\n \"edge-blocked\",\n] as const);\n\n/** Stable issue types accepted by bug-report intake. */\nexport const FEEDBACK_ISSUE_TYPES = [\n \"visual-layout\",\n \"functionality\",\n \"gameplay\",\n \"performance-stability\",\n \"accessibility\",\n \"content-localisation\",\n \"account-access\",\n \"privacy-security\",\n \"other\",\n] as const;\n\n/** Issue types that may be persisted after intake routing. */\nexport const FEEDBACK_PERSISTABLE_ISSUE_TYPES = FEEDBACK_ISSUE_TYPES.filter(\n (issueType) => issueType !== \"privacy-security\",\n);\n\n/** Stable severity scale and translation keys for accessible star controls. */\nexport const FEEDBACK_SEVERITY_LEVELS = [\n { value: 1, id: \"cosmetic\", labelKey: \"feedback.severity.cosmetic\" },\n { value: 2, id: \"minor\", labelKey: \"feedback.severity.minor\" },\n { value: 3, id: \"disruptive\", labelKey: \"feedback.severity.disruptive\" },\n { value: 4, id: \"blocking\", labelKey: \"feedback.severity.blocking\" },\n { value: 5, id: \"critical\", labelKey: \"feedback.severity.critical\" },\n] as const;\n\n/** Stable satisfaction scale and translation keys for accessible stars. */\nexport const FEEDBACK_SATISFACTION_LEVELS = [\n { value: 1, id: \"very-poor\", labelKey: \"feedback.satisfaction.very-poor\" },\n { value: 2, id: \"poor\", labelKey: \"feedback.satisfaction.poor\" },\n { value: 3, id: \"fair\", labelKey: \"feedback.satisfaction.fair\" },\n { value: 4, id: \"good\", labelKey: \"feedback.satisfaction.good\" },\n { value: 5, id: \"excellent\", labelKey: \"feedback.satisfaction.excellent\" },\n] as const;\n\n/** Closed sentiment output from the transient English classifier. */\nexport const FEEDBACK_SENTIMENT_BUCKETS = [\n \"very-negative\",\n \"negative\",\n \"mixed\",\n \"neutral\",\n \"positive\",\n \"very-positive\",\n \"not-detected\",\n] as const;\n\n/** Closed intent output from the transient classifier. */\nexport const FEEDBACK_INTENT_IDS = [\n \"visual-layout\",\n \"functionality\",\n \"gameplay\",\n \"performance-stability\",\n \"accessibility\",\n \"content-localisation\",\n \"account-access\",\n \"other\",\n \"praise\",\n \"suggestion\",\n \"confusion\",\n \"frustration\",\n] as const;\n\n/** Closed theme output from the transient classifier. */\nexport const FEEDBACK_THEME_IDS = [\n \"navigation\",\n \"visual-design\",\n \"game-controls\",\n \"rendering\",\n \"responsiveness\",\n \"stability\",\n \"accessibility\",\n \"localisation\",\n \"account-access\",\n \"overall-experience\",\n \"other\",\n] as const;\n\n/** Closed site-section identifiers; arbitrary routes and URLs are forbidden. */\nexport const FEEDBACK_SURFACE_IDS = [\n \"site.about\",\n \"admin.analytics\",\n \"admin.capabilities\",\n \"admin.feature-flags\",\n \"admin.feedback\",\n \"admin.moderation\",\n \"admin.users\",\n \"site.chatbot\",\n \"site.generator\",\n \"site.gpu-demo\",\n \"site.home\",\n \"game.player-system\",\n \"account.profile\",\n \"site.video\",\n] as const;\n\n/** Canonical capability-projection metadata for every feedback surface. */\nexport const FEEDBACK_SURFACE_DEFINITIONS = [\n {\n id: \"site.about\",\n labelKey: \"feedback.surface.about\",\n kind: \"public\",\n gameDiagnosticsEligible: false,\n },\n {\n id: \"admin.analytics\",\n labelKey: \"feedback.surface.adminAnalytics\",\n kind: \"admin\",\n gameDiagnosticsEligible: false,\n },\n {\n id: \"admin.capabilities\",\n labelKey: \"feedback.surface.adminCapabilities\",\n kind: \"admin\",\n gameDiagnosticsEligible: false,\n },\n {\n id: \"admin.feature-flags\",\n labelKey: \"feedback.surface.adminFeatureFlags\",\n kind: \"admin\",\n gameDiagnosticsEligible: false,\n },\n {\n id: \"admin.feedback\",\n labelKey: \"feedback.surface.adminFeedback\",\n kind: \"admin\",\n gameDiagnosticsEligible: false,\n },\n {\n id: \"admin.moderation\",\n labelKey: \"feedback.surface.adminModeration\",\n kind: \"admin\",\n gameDiagnosticsEligible: false,\n },\n {\n id: \"admin.users\",\n labelKey: \"feedback.surface.adminUsers\",\n kind: \"admin\",\n gameDiagnosticsEligible: false,\n },\n {\n id: \"site.chatbot\",\n labelKey: \"feedback.surface.chatbot\",\n kind: \"public\",\n gameDiagnosticsEligible: false,\n },\n {\n id: \"site.generator\",\n labelKey: \"feedback.surface.generator\",\n kind: \"game\",\n gameDiagnosticsEligible: true,\n },\n {\n id: \"site.gpu-demo\",\n labelKey: \"feedback.surface.gpuDemo\",\n kind: \"game\",\n gameDiagnosticsEligible: true,\n },\n {\n id: \"site.home\",\n labelKey: \"feedback.surface.home\",\n kind: \"public\",\n gameDiagnosticsEligible: false,\n },\n {\n id: \"game.player-system\",\n labelKey: \"feedback.surface.playerSystem\",\n kind: \"game\",\n gameDiagnosticsEligible: false,\n },\n {\n id: \"account.profile\",\n labelKey: \"feedback.surface.profile\",\n kind: \"authenticated\",\n gameDiagnosticsEligible: false,\n },\n {\n id: \"site.video\",\n labelKey: \"feedback.surface.video\",\n kind: \"public\",\n gameDiagnosticsEligible: false,\n },\n] as const;\n\n/** Closed reasons for falling back to explicit structured-only submission. */\nexport const FEEDBACK_STRUCTURED_ONLY_REASON_CODES = [\n \"analysis-unavailable\",\n \"invalid-envelope\",\n \"invalid-sensitive-payload\",\n \"language-not-enabled\",\n \"request-too-large\",\n \"length-required\",\n] as const;\n\n/** Pinned privacy policy versions permitted in retained analysis. */\nexport const FEEDBACK_PRIVACY_POLICY_VERSIONS = [\n \"feedback-privacy-en-v1\",\n] as const;\n\n/** Pinned local model versions permitted in retained analysis. */\nexport const FEEDBACK_ANALYSIS_MODEL_VERSIONS = [\n \"feedback-en-rules-v1\",\n] as const;\n\nfor (const vocabulary of [\n FEEDBACK_BUG_COOLDOWN_SECONDS,\n FEEDBACK_ISSUE_TYPES,\n FEEDBACK_PERSISTABLE_ISSUE_TYPES,\n FEEDBACK_SEVERITY_LEVELS,\n FEEDBACK_SATISFACTION_LEVELS,\n FEEDBACK_SENTIMENT_BUCKETS,\n FEEDBACK_INTENT_IDS,\n FEEDBACK_THEME_IDS,\n FEEDBACK_SURFACE_IDS,\n FEEDBACK_SURFACE_DEFINITIONS,\n FEEDBACK_STRUCTURED_ONLY_REASON_CODES,\n FEEDBACK_PRIVACY_POLICY_VERSIONS,\n FEEDBACK_ANALYSIS_MODEL_VERSIONS,\n]) {\n Object.freeze(vocabulary);\n}\nfor (const entry of [\n ...FEEDBACK_SEVERITY_LEVELS,\n ...FEEDBACK_SATISFACTION_LEVELS,\n ...FEEDBACK_SURFACE_DEFINITIONS,\n]) {\n Object.freeze(entry);\n}\n\n/** Bug issue-type identifier. */\nexport type FeedbackIssueType = (typeof FEEDBACK_ISSUE_TYPES)[number];\n\n/** Persistable issue type after confidential security routing. */\nexport type FeedbackPersistableIssueType =\n (typeof FEEDBACK_PERSISTABLE_ISSUE_TYPES)[number];\n\n/** One-to-five bug severity. */\nexport type FeedbackSeverity =\n (typeof FEEDBACK_SEVERITY_LEVELS)[number][\"value\"];\n\n/** One-to-five satisfaction score. */\nexport type FeedbackSatisfaction =\n (typeof FEEDBACK_SATISFACTION_LEVELS)[number][\"value\"];\n\n/** Closed transient sentiment bucket. */\nexport type FeedbackSentiment =\n (typeof FEEDBACK_SENTIMENT_BUCKETS)[number];\n\n/** Closed transient intent identifier. */\nexport type FeedbackIntentId = (typeof FEEDBACK_INTENT_IDS)[number];\n\n/** Closed transient theme identifier. */\nexport type FeedbackThemeId = (typeof FEEDBACK_THEME_IDS)[number];\n\n/** Closed site-section identifier eligible for capability projection. */\nexport type FeedbackSurfaceId = (typeof FEEDBACK_SURFACE_IDS)[number];\n\n/** Closed abuse-control aggregation band. */\nexport type FeedbackAbuseBlockBand =\n (typeof FEEDBACK_ABUSE_BLOCK_BANDS)[number];\n\n/** Supported rich-text mark. */\nexport type FeedbackRichTextMark = \"bold\" | \"italic\" | \"underline\";\n\n/** Text leaf in the transient rich-text AST. */\nexport interface FeedbackRichTextNode {\n type: \"text\";\n text: string;\n marks?: readonly FeedbackRichTextMark[];\n}\n\n/** Paragraph or bullet-list item in the transient rich-text AST. */\nexport type FeedbackRichTextBlock =\n | {\n type: \"paragraph\";\n depth: number;\n children: readonly FeedbackRichTextNode[];\n }\n | {\n type: \"listItem\";\n listType: \"bullet\";\n depth: number;\n children: readonly FeedbackRichTextNode[];\n };\n\n/** Browser/scanner interoperable transient document. */\nexport interface FeedbackRichTextDocument {\n type: \"doc\";\n schemaVersion: \"1\";\n children: readonly FeedbackRichTextBlock[];\n version: typeof FEEDBACK_CONTRACT_VERSION;\n}\n\n/** Browser/scanner interoperable encrypted narrative envelope. */\nexport interface FeedbackEncryptedNarrativeEnvelope {\n type: \"feedback-encrypted-narrative-envelope\";\n version: typeof FEEDBACK_CONTRACT_VERSION;\n schemaVersion: \"1\";\n keyId: string;\n algorithm: \"RSA-OAEP-256+A256GCM\";\n wrappedKey: string;\n iv: string;\n ciphertext: string;\n authenticationTag: string;\n}\n\ninterface FeedbackTransientAnalysisRequestBase {\n type: \"feedback-transient-analysis-request\";\n version: typeof FEEDBACK_CONTRACT_VERSION;\n schemaVersion: \"1\";\n requestId: string;\n deterministicRedactionCount: number;\n envelope: FeedbackEncryptedNarrativeEnvelope;\n}\n\n/**\n * One-use bug analysis request bound to a closed surface that the service\n * must authorise before handing ciphertext to the private scanner.\n */\nexport interface FeedbackBugTransientAnalysisRequest\n extends FeedbackTransientAnalysisRequestBase {\n purpose: \"bug\";\n surfaceId: FeedbackSurfaceId;\n}\n\n/** One-use satisfaction-review analysis request with no site surface. */\nexport interface FeedbackReviewTransientAnalysisRequest\n extends FeedbackTransientAnalysisRequestBase {\n purpose: \"review\";\n surfaceId?: never;\n}\n\n/** Closed purpose-discriminated request that must never be persisted or logged. */\nexport type FeedbackTransientAnalysisRequest =\n | FeedbackBugTransientAnalysisRequest\n | FeedbackReviewTransientAnalysisRequest;\n\n/** Typed result for the purpose-discriminated transient request validator. */\nexport type FeedbackTransientAnalysisRequestValidationResult =\n | {\n readonly valid: true;\n readonly value: FeedbackTransientAnalysisRequest;\n readonly errors?: never;\n readonly issues?: never;\n }\n | {\n readonly valid: false;\n readonly value?: never;\n readonly errors: readonly string[];\n readonly issues?: readonly ValidationIssue[];\n };\n\n/** Closed classifier fields that may be persisted. */\nexport interface FeedbackDerivedAnalysis {\n type: \"feedback-derived-analysis\";\n version: typeof FEEDBACK_CONTRACT_VERSION;\n status: \"analyzed\" | \"structured-only\";\n sentiment?: FeedbackSentiment;\n intentIds: readonly FeedbackIntentId[];\n themeIds: readonly FeedbackThemeId[];\n confidence?: \"low\" | \"medium\" | \"high\";\n policyVersion: string;\n modelVersion: string;\n deterministicRedactionCount: number;\n scannerRedactionCount: number;\n}\n\n/** Ephemeral one-use scanner receipt. */\nexport interface FeedbackAnalysisReceipt\n extends Omit<FeedbackDerivedAnalysis, \"type\" | \"status\"> {\n type: \"feedback-analysis-receipt\";\n status: \"analyzed\";\n receiptId: string;\n analyzedAt: string;\n}\n\n/** Identifier-free immutable bug packet. */\nexport interface FeedbackBugPacket {\n type: \"feedback-bug-packet\";\n version: typeof FEEDBACK_CONTRACT_VERSION;\n packetId: string;\n acceptedAt: string;\n surfaceId: string;\n issueType: FeedbackPersistableIssueType;\n severity: FeedbackSeverity;\n releaseId: string;\n buildId: string;\n analysis?: FeedbackDerivedAnalysis;\n gameDiagnostics?: FeedbackGameDiagnostics;\n}\n\n/** Identifier-free immutable satisfaction packet. */\nexport interface FeedbackReviewPacket {\n type: \"feedback-review-packet\";\n version: typeof FEEDBACK_CONTRACT_VERSION;\n packetId: string;\n acceptedAt: string;\n satisfaction: FeedbackSatisfaction;\n analysis?: FeedbackDerivedAnalysis;\n}\n\n/**\n * Durable identifier-free proof that feedback intake committed a packet.\n *\n * This projection is emitted only by the trusted acceptance-evidence worker;\n * the public intake contract never accepts it from a caller.\n */\nexport interface FeedbackCommittedAcceptanceEvidence {\n type: \"feedback-committed-acceptance-evidence\";\n version: typeof FEEDBACK_CONTRACT_VERSION;\n packetId: string;\n packetKind: \"bug\" | \"review\";\n acceptedAt: string;\n}\n\n/** Count bucket used by materialized feedback reports. */\nexport interface FeedbackCountBucket {\n id: string;\n count: number;\n}\n\n/** Allowlisted abuse-control count safe for identifier-free reports. */\nexport interface FeedbackAbuseBlockBucket extends FeedbackCountBucket {\n id: FeedbackAbuseBlockBand;\n}\n\n/** Identifier-free finalized facts supplied to one hourly bug-health window. */\nexport interface FeedbackBugHealthMetricsProjection {\n type: \"feedback-bug-health-metrics-projection\";\n version: typeof FEEDBACK_CONTRACT_VERSION;\n projectionId: string;\n windowStart: string;\n windowEnd: string;\n observedAt: string;\n finalized: true;\n rejectedCount: number;\n trafficDenominator: number;\n abuseBlockBands: readonly FeedbackAbuseBlockBucket[];\n}\n\n/** A weekly public point that reveals nothing when the privacy threshold fails. */\nexport type FeedbackPublicWeeklyPoint =\n | {\n weekStart: string;\n state: \"suppressed\";\n }\n | {\n weekStart: string;\n state: \"published\";\n acceptedReviewCount: number;\n averageStars: number;\n };\n\n/** Thresholded preceding-window facts used to derive the public trend. */\nexport interface FeedbackPublicComparison {\n previousAcceptedReviewCount: number;\n previousAverageStars: number;\n deltaStars: number;\n}\n\ninterface FeedbackPublicSummaryBase {\n type: \"feedback-public-summary\";\n version: typeof FEEDBACK_CONTRACT_VERSION;\n snapshotId: string;\n generatedAt: string;\n asOf: string;\n freshness: \"fresh\" | \"stale\";\n reportAgeSeconds: number;\n rollingWindowDays: 90;\n weeklyPoints: readonly FeedbackPublicWeeklyPoint[];\n}\n\n/** Daily read model that omits every public metric below ten reviews. */\nexport type FeedbackPublicSummary =\n | (FeedbackPublicSummaryBase & {\n state: \"suppressed\";\n })\n | (FeedbackPublicSummaryBase & {\n state: \"published\";\n acceptedReviewCount: number;\n averageStars: number;\n comparison?: FeedbackPublicComparison;\n trend?: \"up\" | \"flat\" | \"down\";\n });\n\nconst SAFE_ID_PATTERN = /^[a-z0-9][a-z0-9._:-]*$/i;\nconst INGESTION_KEY_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;\nconst BASE64URL_PATTERN = /^[A-Za-z0-9_-]+$/;\nconst OPAQUE_UUID_V4_PATTERN =\n /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/;\nconst DISALLOWED_NARRATIVE_SYNTAX_PATTERN =\n /<|>|(?:https?|ftp|mailto|javascript|data|blob|file):|\\/\\/|www\\.|\\]\\s*\\(/i;\nconst DISALLOWED_UNICODE_FORMAT_PATTERN = /\\p{Cf}/u;\nconst MAX_NARRATIVE_CHARACTERS = 4_000;\nconst MAX_NARRATIVE_UTF16_CODE_UNITS = 8_000;\nconst MAX_COUNT = 1_000_000_000;\nconst BASE64URL_ALPHABET =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\";\nconst BUG_HOUR_WINDOW_PATTERN =\n /^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])T(?:[01]\\d|2[0-3])$/;\nconst REVIEW_DAY_WINDOW_PATTERN =\n /^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$/;\nconst RECONCILIATION_WINDOW_PATTERN =\n /^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])T(?:[01]\\d|2[0-3]):(?:[0-5]\\d)$/;\nconst CANONICAL_SERVER_UTC_PATTERN =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$/;\n\nconst strictOptions = {\n version: FEEDBACK_CONTRACT_VERSION,\n piiEnforcement: \"strict\" as const,\n unknownFields: \"reject\" as const,\n identity: \"exact\" as const,\n};\n\nconst uuidField = () =>\n field\n .string()\n .validator((value) => OPAQUE_UUID_V4_PATTERN.test(value))\n .description(\"Opaque UUID generated for the feedback workflow\");\n\nconst isCanonicalServerUtc = (value: unknown): value is string => {\n if (\n typeof value !== \"string\" ||\n !CANONICAL_SERVER_UTC_PATTERN.test(value)\n ) {\n return false;\n }\n\n const timestamp = Date.parse(value);\n return (\n Number.isFinite(timestamp) && new Date(timestamp).toISOString() === value\n );\n};\n\nconst canonicalServerUtcField = () =>\n field\n .dateTimeISO()\n .validator(isCanonicalServerUtc)\n .description(\n \"Canonical millisecond-precision UTC timestamp supplied by the trusted server\",\n );\n\nconst draftIdField = () =>\n field\n .string()\n .validator((value) => OPAQUE_UUID_V4_PATTERN.test(value))\n .description(\"Opaque identifier for one short-lived structured draft\")\n .PID({\n classification: \"low\",\n action: \"none\",\n logHandling: \"omit\",\n purpose: \"short-lived feedback draft lookup that must never enter logs\",\n });\n\nconst safeIdField = (maximum = 128) =>\n field.string().min(1).max(maximum).pattern(SAFE_ID_PATTERN);\n\nconst ingestionKeyIdField = () =>\n field\n .string()\n .min(1)\n .max(80)\n .pattern(INGESTION_KEY_ID_PATTERN);\n\nconst decodeCanonicalBase64Url = (value: string): Uint8Array | undefined => {\n if (\n !BASE64URL_PATTERN.test(value) ||\n value.length % 4 === 1\n ) {\n return undefined;\n }\n const finalValue = BASE64URL_ALPHABET.indexOf(value.at(-1) ?? \"\");\n if (\n finalValue < 0 ||\n (value.length % 4 === 2 && (finalValue & 0b1111) !== 0) ||\n (value.length % 4 === 3 && (finalValue & 0b11) !== 0)\n ) {\n return undefined;\n }\n\n const output: number[] = [];\n let accumulator = 0;\n let bitCount = 0;\n for (const character of value) {\n const sextet = BASE64URL_ALPHABET.indexOf(character);\n if (sextet < 0) {\n return undefined;\n }\n accumulator = (accumulator << 6) | sextet;\n bitCount += 6;\n while (bitCount >= 8) {\n bitCount -= 8;\n output.push((accumulator >> bitCount) & 0xff);\n accumulator &= (1 << bitCount) - 1;\n }\n }\n return Uint8Array.from(output);\n};\n\nconst isCanonicalRsaModulus = (value: string): boolean => {\n const bytes = decodeCanonicalBase64Url(value);\n return (\n bytes !== undefined &&\n (bytes.length === 256 ||\n bytes.length === 384 ||\n bytes.length === 512) &&\n (bytes[0] ?? 0) >= 0x80 &&\n ((bytes.at(-1) ?? 0) & 1) === 1\n );\n};\n\nconst isCanonicalRsaExponent = (value: string): boolean => {\n const bytes = decodeCanonicalBase64Url(value);\n if (\n bytes === undefined ||\n bytes.length < 1 ||\n bytes.length > 4 ||\n bytes[0] === 0\n ) {\n return false;\n }\n const exponent = bytes.reduce(\n (total, byte) => total * 256 + byte,\n 0,\n );\n return exponent >= 3 && exponent % 2 === 1;\n};\n\nconst surfaceIdField = () =>\n field.string().enum(FEEDBACK_SURFACE_IDS);\n\nconst countField = () =>\n field\n .number()\n .validator((value) => Number.isSafeInteger(value))\n .min(0)\n .max(MAX_COUNT);\n\nconst positiveCountField = (maximum = MAX_COUNT) =>\n field\n .number()\n .validator((value) => Number.isSafeInteger(value))\n .min(1)\n .max(maximum);\n\nconst redactionCountField = () =>\n field\n .number()\n .validator((value) => Number.isSafeInteger(value))\n .min(0)\n .max(MAX_NARRATIVE_CHARACTERS);\n\nconst revisionField = () =>\n field\n .number()\n .validator((value) => Number.isSafeInteger(value))\n .min(0)\n .max(1_000_000);\n\nconst ratingField = () =>\n field\n .number()\n .validator((value) => Number.isInteger(value))\n .min(1)\n .max(5);\n\nconst narrativeTextField = () =>\n field\n .string()\n .validator(\n (value) =>\n typeof value === \"string\" &&\n value.length >= 1 &&\n value.length <= MAX_NARRATIVE_UTF16_CODE_UNITS &&\n !containsFeedbackUnicodeProfileUnsupportedText(value) &&\n value.normalize(\"NFKC\") === value &&\n [...value].length <= MAX_NARRATIVE_CHARACTERS &&\n !DISALLOWED_NARRATIVE_SYNTAX_PATTERN.test(value) &&\n !DISALLOWED_UNICODE_FORMAT_PATTERN.test(value) &&\n ![...value].some((character) => {\n const codePoint = character.codePointAt(0);\n return (\n codePoint !== undefined &&\n (codePoint < 32 || codePoint === 127)\n );\n }),\n )\n .min(1)\n .max(MAX_NARRATIVE_UTF16_CODE_UNITS)\n .PID({\n classification: \"high\",\n action: \"clear\",\n logHandling: \"omit\",\n purpose:\n \"transient feedback narrative that must be discarded after classification\",\n });\n\nconst transientCorrelationIdField = () =>\n field\n .string()\n .validator((value) => OPAQUE_UUID_V4_PATTERN.test(value))\n .PID({\n classification: \"low\",\n action: \"clear\",\n logHandling: \"omit\",\n purpose: \"one-use transient feedback correlation\",\n });\n\nconst transientEncryptedField = (\n minimum: number,\n maximum: number,\n allowedLengths?: readonly number[],\n) =>\n field\n .string()\n .min(minimum)\n .max(maximum)\n .pattern(BASE64URL_PATTERN)\n .validator(\n (value) => {\n const decoded = decodeCanonicalBase64Url(value);\n return (\n decoded !== undefined &&\n decoded.length > 0 &&\n (allowedLengths === undefined ||\n allowedLengths.includes(value.length))\n );\n },\n )\n .PID({\n classification: \"high\",\n action: \"clear\",\n logHandling: \"omit\",\n purpose: \"encrypted transient feedback narrative material\",\n });\n\nconst richTextNodeShape = () => ({\n type: field.string().enum([\"text\"] as const),\n text: narrativeTextField(),\n marks: field\n .array(\n field.string().enum([\"bold\", \"italic\", \"underline\"] as const),\n )\n .max(3)\n .optional(),\n});\n\nconst richTextBlockShape = () => ({\n type: field.string().enum([\"paragraph\", \"listItem\"] as const),\n depth: field\n .number()\n .validator((value) => Number.isInteger(value))\n .min(0)\n .max(4),\n listType: field.string().enum([\"bullet\"] as const).optional(),\n children: field\n .array(field.object(richTextNodeShape()))\n .min(1)\n .max(128),\n});\n\nconst nestedIdentityShape = <T extends string>(type: T) => ({\n type: field.string().enum([type] as const),\n version: field.string().enum([FEEDBACK_CONTRACT_VERSION] as const),\n});\n\nconst envelopeShape = (includeIdentity = false) => ({\n ...(includeIdentity\n ? nestedIdentityShape(\"feedback-encrypted-narrative-envelope\")\n : {}),\n schemaVersion: field.string().enum([\"1\"] as const),\n keyId: ingestionKeyIdField(),\n algorithm: field\n .string()\n .enum([\"RSA-OAEP-256+A256GCM\"] as const),\n wrappedKey: transientEncryptedField(342, 683, [342, 512, 683]),\n iv: transientEncryptedField(16, 16, [16]),\n ciphertext: transientEncryptedField(2, 49_152),\n authenticationTag: transientEncryptedField(22, 22, [22]),\n});\n\nconst analysisProjectionShape = (includeIdentity = false) => ({\n ...(includeIdentity\n ? nestedIdentityShape(\"feedback-derived-analysis\")\n : {}),\n status: field.string().enum([\"analyzed\", \"structured-only\"] as const),\n sentiment: field.string().enum(FEEDBACK_SENTIMENT_BUCKETS).optional(),\n intentIds: field\n .array(field.string().enum(FEEDBACK_INTENT_IDS))\n .max(8),\n themeIds: field\n .array(field.string().enum(FEEDBACK_THEME_IDS))\n .max(8),\n confidence: field\n .string()\n .enum([\"low\", \"medium\", \"high\"] as const)\n .optional(),\n policyVersion: field.string().enum(FEEDBACK_PRIVACY_POLICY_VERSIONS),\n modelVersion: field.string().enum(FEEDBACK_ANALYSIS_MODEL_VERSIONS),\n deterministicRedactionCount: redactionCountField(),\n scannerRedactionCount: redactionCountField(),\n});\n\nconst analysisReceiptShape = () => ({\n receiptId: transientCorrelationIdField(),\n ...analysisProjectionShape(),\n analyzedAt: field.dateTimeISO(),\n});\n\nconst isAnalysisProjectionConsistent = (\n value: Record<string, unknown>,\n): boolean => {\n const status = value.status;\n const intentIds = value.intentIds;\n const themeIds = value.themeIds;\n if (!Array.isArray(intentIds) || !Array.isArray(themeIds)) {\n return false;\n }\n if (\n new Set(intentIds).size !== intentIds.length ||\n new Set(themeIds).size !== themeIds.length\n ) {\n return false;\n }\n if (status === \"structured-only\") {\n return (\n value.sentiment === undefined &&\n value.confidence === undefined &&\n intentIds.length === 0 &&\n themeIds.length === 0\n );\n }\n return (\n status === \"analyzed\" &&\n value.sentiment !== undefined &&\n value.confidence !== undefined\n );\n};\n\nconst optionalDraftFields = () => ({\n surfaceId: surfaceIdField().optional(),\n issueType: field.string().enum(FEEDBACK_ISSUE_TYPES).optional(),\n severity: ratingField().optional(),\n satisfaction: ratingField().optional(),\n analysisReceiptId: transientCorrelationIdField().optional(),\n});\n\nconst surfaceEntryShape = () => ({\n id: surfaceIdField(),\n labelKey: safeIdField(160),\n kind: field\n .string()\n .enum([\"public\", \"authenticated\", \"admin\", \"game\"] as const),\n gameDiagnosticsEligible: field.boolean(),\n});\n\nconst areSurfacesConsistent = (surfaces: unknown): boolean => {\n if (!Array.isArray(surfaces)) {\n return false;\n }\n const surfaceIds = surfaces.map(\n (surface: { id?: unknown }) => surface.id,\n );\n return (\n new Set(surfaceIds).size === surfaceIds.length &&\n surfaces.every(\n (surface: {\n id?: unknown;\n labelKey?: unknown;\n kind?: unknown;\n gameDiagnosticsEligible?: unknown;\n }) => {\n const definition = FEEDBACK_SURFACE_DEFINITIONS.find(\n ({ id }) => id === surface.id,\n );\n return (\n definition !== undefined &&\n surface.labelKey === definition.labelKey &&\n surface.kind === definition.kind &&\n surface.gameDiagnosticsEligible ===\n definition.gameDiagnosticsEligible\n );\n },\n )\n );\n};\n\nconst isDraftShapeConsistent = (value: Record<string, unknown>): boolean => {\n const hasDirtyField =\n value.surfaceId !== undefined ||\n value.issueType !== undefined ||\n value.severity !== undefined ||\n value.satisfaction !== undefined ||\n value.analysisReceiptId !== undefined ||\n value.analysis !== undefined;\n if (!hasDirtyField) {\n return false;\n }\n if (value.kind === \"bug\") {\n return value.satisfaction === undefined;\n }\n if (value.kind === \"review\") {\n return (\n value.surfaceId === undefined &&\n value.issueType === undefined &&\n value.severity === undefined\n );\n }\n return false;\n};\n\nconst isContextConsistent = (value: Record<string, any>): boolean => {\n if (!areSurfacesConsistent(value.surfaces)) {\n return false;\n }\n if (\n value.selectedSurfaceId !== undefined &&\n !value.surfaces.some(\n (surface: { id?: unknown }) => surface.id === value.selectedSurfaceId,\n )\n ) {\n return false;\n }\n const hasProjectedSurface = value.surfaces.length > 0;\n const hasDiagnosticsSurface = value.surfaces.some(\n (surface: { gameDiagnosticsEligible?: unknown }) =>\n surface.gameDiagnosticsEligible === true,\n );\n if (\n (value.eligibility.bugReport && !hasProjectedSurface) ||\n (value.eligibility.gameDiagnostics &&\n (!value.eligibility.bugReport || !hasDiagnosticsSurface))\n ) {\n return false;\n }\n\n const generatedAt = Date.parse(String(value.generatedAt));\n if (!Number.isFinite(generatedAt)) {\n return false;\n }\n const boundedFutureAvailabilityIsValid = (\n candidate: unknown,\n maximumSeconds: number,\n ): boolean => {\n if (candidate === undefined) {\n return true;\n }\n const availableAt = Date.parse(String(candidate));\n return (\n Number.isFinite(availableAt) &&\n availableAt > generatedAt &&\n availableAt - generatedAt <= maximumSeconds * 1_000\n );\n };\n const maximumBugCooldownSeconds =\n FEEDBACK_BUG_COOLDOWN_SECONDS[\n FEEDBACK_BUG_COOLDOWN_SECONDS.length - 1\n ] ?? 0;\n if (\n !boundedFutureAvailabilityIsValid(\n value.eligibility.bugAvailableAt,\n maximumBugCooldownSeconds,\n ) ||\n !boundedFutureAvailabilityIsValid(\n value.eligibility.reviewAvailableAt,\n FEEDBACK_REVIEW_COOLDOWN_SECONDS,\n )\n ) {\n return false;\n }\n const bugAvailableAt =\n value.eligibility.bugAvailableAt === undefined\n ? undefined\n : Date.parse(String(value.eligibility.bugAvailableAt));\n const bugRetryAfterSeconds =\n value.eligibility.bugRetryAfterSeconds;\n const bugCooldownIsConsistent =\n (bugAvailableAt === undefined &&\n bugRetryAfterSeconds === undefined) ||\n (bugAvailableAt !== undefined &&\n typeof bugRetryAfterSeconds === \"number\" &&\n bugRetryAfterSeconds ===\n Math.ceil((bugAvailableAt - generatedAt) / 1_000));\n if (\n !bugCooldownIsConsistent ||\n (value.eligibility.bugReport &&\n (value.eligibility.bugAvailableAt !== undefined ||\n value.eligibility.bugRetryAfterSeconds !== undefined)) ||\n (value.eligibility.review &&\n value.eligibility.reviewAvailableAt !== undefined) ||\n (value.eligibility.bugReport && !value.flags.bugReport) ||\n (value.eligibility.review && !value.flags.review) ||\n (value.eligibility.gameDiagnostics && !value.flags.gameDiagnostics)\n ) {\n return false;\n }\n\n if (!value.flags.transientAnalysis) {\n return value.ingestionKey === undefined;\n }\n if (value.ingestionKey === undefined) {\n return false;\n }\n const expiresAt = Date.parse(String(value.ingestionKey.expiresAt));\n return (\n Number.isFinite(expiresAt) &&\n expiresAt > generatedAt &&\n expiresAt - generatedAt <= 10 * 60 * 1_000\n );\n};\n\nconst distributionShape = (\n idField: () => ReturnType<typeof safeIdField> = () => safeIdField(128),\n) => ({\n id: idField(),\n count: countField(),\n});\n\nconst hasUniqueIds = (values: unknown): boolean =>\n Array.isArray(values) &&\n new Set(\n values.map((value) =>\n typeof value === \"object\" && value !== null\n ? (value as { id?: unknown }).id\n : undefined,\n ),\n ).size === values.length;\n\nconst distributionTotal = (values: unknown): number =>\n Array.isArray(values)\n ? values.reduce(\n (total, value) =>\n total +\n (typeof value === \"object\" &&\n value !== null &&\n typeof (value as { count?: unknown }).count === \"number\"\n ? (value as { count: number }).count\n : 0),\n 0,\n )\n : 0;\n\nconst distributionCountsAtMost = (\n values: unknown,\n maximum: number,\n): boolean =>\n Array.isArray(values) &&\n values.every(\n (value) =>\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { count?: unknown }).count === \"number\" &&\n (value as { count: number }).count <= maximum,\n );\n\nconst advisoryShape = () => ({\n code: field\n .string()\n .enum(\n [\n \"severity-five\",\n \"critical-regression\",\n \"satisfaction-drop\",\n \"processor-stale\",\n ] as const,\n ),\n level: field.string().enum([\"advisory\", \"critical\"] as const),\n triggerCount: positiveCountField(),\n recommendationIds: field\n .array(\n field\n .string()\n .enum(\n [\n \"inspect-release\",\n \"verify-renderer-health\",\n \"review-top-intents\",\n \"verify-processor-health\",\n ] as const,\n ),\n )\n .min(1)\n .max(8),\n});\n\nconst orderedWindow = (\n value: Record<string, unknown>,\n durationMilliseconds: number,\n): boolean => {\n const start = Date.parse(String(value.windowStart));\n const end = Date.parse(String(value.windowEnd));\n const generatedAt = Date.parse(String(value.generatedAt));\n return (\n Number.isFinite(start) &&\n Number.isFinite(end) &&\n Number.isFinite(generatedAt) &&\n new Date(start).toISOString() === value.windowStart &&\n new Date(end).toISOString() === value.windowEnd &&\n start % durationMilliseconds === 0 &&\n end - start === durationMilliseconds &&\n generatedAt >= end\n );\n};\n\ntype FeedbackProcessor =\n | \"bug-hourly\"\n | \"review-daily\"\n | \"commit-reconciliation\";\n\nconst processorWindow = (\n processor: FeedbackProcessor,\n windowKey: string,\n): { start: number; duration: number } | undefined => {\n let iso: string;\n let expectedLength: number;\n let duration: number;\n if (processor === \"bug-hourly\") {\n if (!BUG_HOUR_WINDOW_PATTERN.test(windowKey)) {\n return undefined;\n }\n iso = `${windowKey}:00:00.000Z`;\n expectedLength = 13;\n duration = 60 * 60 * 1_000;\n } else if (processor === \"review-daily\") {\n if (!REVIEW_DAY_WINDOW_PATTERN.test(windowKey)) {\n return undefined;\n }\n iso = `${windowKey}T00:00:00.000Z`;\n expectedLength = 10;\n duration = 24 * 60 * 60 * 1_000;\n } else {\n if (!RECONCILIATION_WINDOW_PATTERN.test(windowKey)) {\n return undefined;\n }\n const minute = Number(windowKey.slice(-2));\n if (minute % 5 !== 0) {\n return undefined;\n }\n iso = `${windowKey}:00.000Z`;\n expectedLength = 16;\n duration = 5 * 60 * 1_000;\n }\n const start = Date.parse(iso);\n if (\n !Number.isFinite(start) ||\n new Date(start).toISOString().slice(0, expectedLength) !== windowKey\n ) {\n return undefined;\n }\n return { start, duration };\n};\n\nconst isProcessorArtifactConsistent = (\n value: Record<string, unknown>,\n artifact: \"checkpoint\" | \"manifest\",\n): boolean => {\n const processor = value.processor as FeedbackProcessor;\n const windowKey = String(value.windowKey);\n const window = processorWindow(processor, windowKey);\n if (window === undefined) {\n return false;\n }\n const completedAt = Date.parse(\n String(\n artifact === \"checkpoint\" ? value.completedAt : value.generatedAt,\n ),\n );\n if (\n !Number.isFinite(completedAt) ||\n completedAt < window.start + window.duration\n ) {\n return false;\n }\n if (\n artifact === \"checkpoint\" &&\n value.checkpointId !==\n `checkpoint:${processor}:${windowKey}`\n ) {\n return false;\n }\n return true;\n};\n\nconst roundRate = (value: number): number =>\n Math.round((value + Number.EPSILON) * 1_000_000) / 1_000_000;\n\nconst rateMatches = (actual: unknown, expected: number): boolean =>\n typeof actual === \"number\" && actual === roundRate(expected);\n\nconst distributionCountFor = (values: unknown, id: string): number => {\n if (!Array.isArray(values)) {\n return 0;\n }\n const entry = values.find(\n (value) =>\n typeof value === \"object\" &&\n value !== null &&\n (value as { id?: unknown }).id === id,\n );\n return typeof entry === \"object\" &&\n entry !== null &&\n typeof (entry as { count?: unknown }).count === \"number\"\n ? (entry as { count: number }).count\n : 0;\n};\n\ntype FeedbackAdvisoryCode =\n | \"severity-five\"\n | \"critical-regression\"\n | \"satisfaction-drop\"\n | \"processor-stale\";\n\ninterface FeedbackAdvisoryExpectation {\n level: \"advisory\" | \"critical\";\n triggerCount: number;\n recommendationIds: readonly (\n | \"inspect-release\"\n | \"verify-renderer-health\"\n | \"review-top-intents\"\n | \"verify-processor-health\"\n )[];\n}\n\nconst advisoryCodesAreConsistent = (\n advisories: unknown,\n expected: Readonly<\n Partial<Record<FeedbackAdvisoryCode, FeedbackAdvisoryExpectation>>\n >,\n): boolean => {\n if (!Array.isArray(advisories)) {\n return false;\n }\n const expectedCodes = Object.entries(expected)\n .filter((entry): entry is [string, FeedbackAdvisoryExpectation] =>\n entry[1] !== undefined,\n )\n .map(([code]) => code);\n const codes = advisories.map(\n (advisory) =>\n (advisory as { code?: unknown } | null)?.code,\n );\n return (\n new Set(codes).size === codes.length &&\n codes.every(\n (code) =>\n typeof code === \"string\" &&\n expectedCodes.includes(code),\n ) &&\n codes.length === expectedCodes.length &&\n expectedCodes.every((code) => codes.includes(code)) &&\n advisories.every((advisory) => {\n const value = advisory as {\n code?: unknown;\n level?: unknown;\n triggerCount?: unknown;\n recommendationIds?: unknown;\n };\n const code =\n typeof value.code === \"string\"\n ? (value.code as FeedbackAdvisoryCode)\n : undefined;\n const expectation = code === undefined ? undefined : expected[code];\n if (\n expectation === undefined ||\n value.level !== expectation.level ||\n value.triggerCount !== expectation.triggerCount ||\n !Array.isArray(value.recommendationIds) ||\n value.recommendationIds.length !==\n expectation.recommendationIds.length\n ) {\n return false;\n }\n return value.recommendationIds.every(\n (recommendation, index) =>\n recommendation === expectation.recommendationIds[index],\n );\n })\n );\n};\n\n/** AST used only inside the transient no-retention narrative scanner. */\nexport const FeedbackRichTextAstSchema = createSchema(\n {\n schemaVersion: field.string().enum([\"1\"] as const),\n children: field\n .array(field.object(richTextBlockShape()))\n .min(1)\n .max(128),\n },\n \"doc\",\n {\n ...strictOptions,\n schemaValidator: (value) => {\n const blocks = Array.isArray(value.children) ? value.children : [];\n const blocksAreConsistent = blocks.every(\n (block: {\n type?: unknown;\n listType?: unknown;\n children?: Array<{ marks?: unknown }>;\n }) => {\n const listShapeIsValid =\n (block.type === \"paragraph\" && block.listType === undefined) ||\n (block.type === \"listItem\" && block.listType === \"bullet\");\n const marksAreUnique =\n Array.isArray(block.children) &&\n block.children.every(\n (child) =>\n child.marks === undefined ||\n (Array.isArray(child.marks) &&\n new Set(child.marks).size === child.marks.length),\n );\n return listShapeIsValid && marksAreUnique;\n },\n );\n const characterCount = blocks.reduce(\n (blockTotal: number, block: { children?: unknown }) =>\n blockTotal +\n (Array.isArray(block.children)\n ? block.children.reduce(\n (nodeTotal: number, node: { text?: unknown }) =>\n nodeTotal +\n (typeof node.text === \"string\"\n ? [...node.text].length\n : 0),\n 0,\n )\n : 0),\n 0,\n );\n const extractedCharacterCount =\n characterCount + Math.max(0, blocks.length - 1);\n const nodeCount = blocks.reduce(\n (total: number, block: { children?: unknown }) =>\n total + (Array.isArray(block.children) ? block.children.length : 0),\n 0,\n );\n return (\n value.type === \"doc\" &&\n value.schemaVersion === \"1\" &&\n blocksAreConsistent &&\n nodeCount <= 256 &&\n extractedCharacterCount > 0 &&\n extractedCharacterCount <= MAX_NARRATIVE_CHARACTERS\n );\n },\n },\n);\n\n/** Encrypted outer envelope accepted by privacy-specific middleware. */\nexport const FeedbackEncryptedNarrativeEnvelopeSchema = createSchema(\n envelopeShape(),\n \"feedback-encrypted-narrative-envelope\",\n strictOptions,\n);\n\n/** Transient scanner request; this contract must never be stored or logged. */\nexport const FeedbackTransientAnalysisRequestSchema = createSchema(\n {\n schemaVersion: field.string().enum([\"1\"] as const),\n requestId: transientCorrelationIdField(),\n purpose: field.string().enum([\"bug\", \"review\"] as const),\n surfaceId: surfaceIdField().optional(),\n deterministicRedactionCount: redactionCountField(),\n envelope: field.object(envelopeShape(true)),\n },\n \"feedback-transient-analysis-request\",\n {\n ...strictOptions,\n schemaValidator: (value, context) => {\n const surfaceWasProvided =\n context?.wasProvided(\"surfaceId\") ??\n Object.prototype.hasOwnProperty.call(value, \"surfaceId\");\n return (\n (value.purpose === \"bug\" && value.surfaceId !== undefined) ||\n (value.purpose === \"review\" && !surfaceWasProvided)\n );\n },\n },\n);\n\n/**\n * Validate and clone a transient request while preserving its purpose\n * discriminator for TypeScript consumers.\n */\nexport const validateFeedbackTransientAnalysisRequest = (\n input: unknown,\n): FeedbackTransientAnalysisRequestValidationResult => {\n const result = FeedbackTransientAnalysisRequestSchema.validate(input);\n if (!result.valid || result.value === undefined) {\n return {\n valid: false,\n errors: result.errors ?? [\"Transient analysis validation failed.\"],\n ...(result.issues === undefined ? {} : { issues: result.issues }),\n };\n }\n return {\n valid: true,\n value: result.value as unknown as FeedbackTransientAnalysisRequest,\n };\n};\n\n/** Identifier-free, closed classifier output safe to copy into a packet. */\nexport const FeedbackAnalysisReceiptSchema = createSchema(\n analysisReceiptShape(),\n \"feedback-analysis-receipt\",\n {\n ...strictOptions,\n schemaValidator: (value) =>\n value.status === \"analyzed\" &&\n isAnalysisProjectionConsistent(value),\n },\n);\n\n/**\n * Persistable classifier projection. Unlike the transient receipt it contains\n * no receipt identifier or scanner timestamp that could enable cross-boundary\n * joining.\n */\nexport const FeedbackDerivedAnalysisSchema = createSchema(\n analysisProjectionShape(),\n \"feedback-derived-analysis\",\n {\n ...strictOptions,\n schemaValidator: isAnalysisProjectionConsistent,\n },\n);\n\n/** Capability-filtered surface catalog with no hidden entitlement metadata. */\nexport const FeedbackSurfaceCatalogSchema = createSchema(\n {\n generatedAt: field.dateTimeISO(),\n catalogVersion: safeIdField(64),\n surfaces: field\n .array(field.object(surfaceEntryShape()))\n .max(256),\n },\n \"feedback-surface-catalog\",\n {\n ...strictOptions,\n schemaValidator: (value) => areSurfacesConsistent(value.surfaces),\n },\n);\n\n/** Capability-filtered surface catalog and effective feedback eligibility. */\nexport const FeedbackContextSchema = createSchema(\n {\n generatedAt: field.dateTimeISO(),\n catalogVersion: safeIdField(64),\n surfaces: field\n .array(field.object(surfaceEntryShape()))\n .max(256),\n selectedSurfaceId: surfaceIdField().optional(),\n flags: field.object({\n bugReport: field.boolean(),\n review: field.boolean(),\n transientAnalysis: field.boolean(),\n reporting: field.boolean(),\n admin: field.boolean(),\n mcp: field.boolean(),\n publicHonesty: field.boolean(),\n gameDiagnostics: field.boolean(),\n anonymous: field.boolean(),\n }),\n eligibility: field.object({\n bugReport: field.boolean(),\n review: field.boolean(),\n gameDiagnostics: field.boolean(),\n bugAvailableAt: field.dateTimeISO().optional(),\n reviewAvailableAt: field.dateTimeISO().optional(),\n bugRetryAfterSeconds: positiveCountField().optional(),\n }),\n ingestionKey: field\n .object({\n keyId: ingestionKeyIdField(),\n algorithm: field.string().enum([\"RSA-OAEP-256\"] as const),\n publicJwk: field.object({\n kty: field.string().enum([\"RSA\"] as const),\n alg: field.string().enum([\"RSA-OAEP-256\"] as const),\n use: field.string().enum([\"enc\"] as const),\n key_ops: field\n .array(field.string().enum([\"wrapKey\"] as const))\n .min(1)\n .max(1),\n n: field\n .string()\n .min(342)\n .max(683)\n .pattern(BASE64URL_PATTERN)\n .validator(isCanonicalRsaModulus),\n e: field\n .string()\n .min(2)\n .max(6)\n .pattern(BASE64URL_PATTERN)\n .validator(isCanonicalRsaExponent),\n ext: field.boolean().validator((value) => value === true),\n }),\n expiresAt: field.dateTimeISO(),\n })\n .optional(),\n },\n \"feedback-context\",\n {\n ...strictOptions,\n schemaValidator: isContextConsistent,\n },\n);\n\n/** Dirty structured fields sent by focus-loss autosave. */\nexport const FeedbackDraftUpsertRequestSchema = createSchema(\n {\n draftId: draftIdField(),\n kind: field.string().enum([\"bug\", \"review\"] as const),\n revision: revisionField(),\n ...optionalDraftFields(),\n },\n \"feedback-draft-upsert-request\",\n {\n ...strictOptions,\n schemaValidator: isDraftShapeConsistent,\n },\n);\n\n/** Short-lived structured draft packet; narrative and ciphertext are excluded. */\nexport const FeedbackDraftPacketSchema = createSchema(\n {\n draftId: draftIdField(),\n kind: field.string().enum([\"bug\", \"review\"] as const),\n revision: revisionField(),\n surfaceId: surfaceIdField().optional(),\n issueType: field.string().enum(FEEDBACK_ISSUE_TYPES).optional(),\n severity: ratingField().optional(),\n satisfaction: ratingField().optional(),\n analysis: field.object(analysisProjectionShape(true)).optional(),\n serverUpdatedAt: field.dateTimeISO(),\n expiresAt: field.dateTimeISO(),\n },\n \"feedback-draft-packet\",\n {\n ...strictOptions,\n schemaValidator: (value) => {\n if (!isDraftShapeConsistent(value)) {\n return false;\n }\n if (\n value.analysis !== undefined &&\n !isAnalysisProjectionConsistent(value.analysis)\n ) {\n return false;\n }\n const updatedAt = Date.parse(String(value.serverUpdatedAt));\n const expiresAt = Date.parse(String(value.expiresAt));\n return (\n Number.isFinite(updatedAt) &&\n Number.isFinite(expiresAt) &&\n expiresAt > updatedAt &&\n expiresAt - updatedAt <= 24 * 60 * 60 * 1_000\n );\n },\n },\n);\n\n/** ETag-external response after a structured draft is durably saved. */\nexport const FeedbackDraftReceiptSchema = createSchema(\n {\n draftId: draftIdField(),\n revision: revisionField(),\n savedAt: field.dateTimeISO(),\n expiresAt: field.dateTimeISO(),\n },\n \"feedback-draft-receipt\",\n {\n ...strictOptions,\n schemaValidator: (value) => {\n const savedAt = Date.parse(String(value.savedAt));\n const expiresAt = Date.parse(String(value.expiresAt));\n return (\n Number.isFinite(savedAt) &&\n Number.isFinite(expiresAt) &&\n expiresAt > savedAt &&\n expiresAt - savedAt <= 24 * 60 * 60 * 1_000\n );\n },\n },\n);\n\n/**\n * Explicit final bug submission request. Transport idempotency belongs only\n * in the HTTP Idempotency-Key header and is not part of this JSON contract.\n */\nexport const FeedbackBugSubmissionRequestSchema = createSchema(\n {\n draftId: draftIdField().optional(),\n surfaceId: surfaceIdField(),\n issueType: field.string().enum(FEEDBACK_ISSUE_TYPES),\n severity: ratingField(),\n analysisReceiptId: transientCorrelationIdField().optional(),\n gameDiagnostics: field.object(gameDiagnosticsShape(true)).optional(),\n },\n \"feedback-bug-submission-request\",\n {\n ...strictOptions,\n schemaValidator: (value) =>\n value.issueType !== \"privacy-security\" &&\n (value.gameDiagnostics === undefined ||\n (isGameDiagnosticsConsistent(value.gameDiagnostics) &&\n value.gameDiagnostics.surfaceId === value.surfaceId)),\n },\n);\n\n/**\n * Explicit authenticated satisfaction-review submission request. Transport\n * idempotency belongs only in the HTTP Idempotency-Key header.\n */\nexport const FeedbackReviewSubmissionRequestSchema = createSchema(\n {\n draftId: draftIdField().optional(),\n satisfaction: ratingField(),\n analysisReceiptId: transientCorrelationIdField().optional(),\n },\n \"feedback-review-submission-request\",\n strictOptions,\n);\n\n/** Identifier-free response after an immutable packet is accepted. */\nexport const FeedbackAcceptanceReceiptSchema = createSchema(\n {\n packetId: uuidField(),\n kind: field.string().enum([\"bug\", \"review\"] as const),\n acceptedAt: field.dateTimeISO(),\n nextEligibleAt: field.dateTimeISO(),\n },\n \"feedback-acceptance-receipt\",\n {\n ...strictOptions,\n schemaValidator: (value) => {\n const acceptedAt = Date.parse(String(value.acceptedAt));\n const nextEligibleAt = Date.parse(String(value.nextEligibleAt));\n const cooldownMilliseconds = nextEligibleAt - acceptedAt;\n if (\n !Number.isFinite(acceptedAt) ||\n !Number.isFinite(nextEligibleAt) ||\n cooldownMilliseconds <= 0 ||\n cooldownMilliseconds % 1_000 !== 0\n ) {\n return false;\n }\n const cooldownSeconds = cooldownMilliseconds / 1_000;\n return value.kind === \"review\"\n ? cooldownSeconds === FEEDBACK_REVIEW_COOLDOWN_SECONDS\n : (FEEDBACK_BUG_COOLDOWN_SECONDS as readonly number[]).includes(\n cooldownSeconds,\n );\n },\n },\n);\n\n/** Safe analysis fallback; it contains neither a receipt nor narrative. */\nexport const FeedbackStructuredOnlyAnalysisResultSchema = createSchema(\n {\n status: field.string().enum([\"structured-only-required\"] as const),\n reasonCode: field.string().enum(FEEDBACK_STRUCTURED_ONLY_REASON_CODES),\n },\n \"feedback-structured-only-analysis-result\",\n strictOptions,\n);\n\n/** Immutable structured bug packet for private blob storage. */\nexport const FeedbackBugPacketSchema = createSchema(\n {\n packetId: uuidField(),\n acceptedAt: field.dateTimeISO(),\n surfaceId: surfaceIdField(),\n issueType: field.string().enum(FEEDBACK_PERSISTABLE_ISSUE_TYPES),\n severity: ratingField(),\n releaseId: safeIdField(128),\n buildId: safeIdField(128),\n analysis: field.object(analysisProjectionShape(true)).optional(),\n gameDiagnostics: field.object(gameDiagnosticsShape(true)).optional(),\n },\n \"feedback-bug-packet\",\n {\n ...strictOptions,\n schemaValidator: (value) =>\n (value.analysis === undefined ||\n isAnalysisProjectionConsistent(value.analysis)) &&\n (value.gameDiagnostics === undefined ||\n (isGameDiagnosticsConsistent(value.gameDiagnostics) &&\n value.gameDiagnostics.surfaceId === value.surfaceId)),\n },\n);\n\n/** Immutable structured review packet for private blob storage. */\nexport const FeedbackReviewPacketSchema = createSchema(\n {\n packetId: uuidField(),\n acceptedAt: field.dateTimeISO(),\n satisfaction: ratingField(),\n analysis: field.object(analysisProjectionShape(true)).optional(),\n },\n \"feedback-review-packet\",\n {\n ...strictOptions,\n schemaValidator: (value) =>\n value.analysis === undefined ||\n isAnalysisProjectionConsistent(value.analysis),\n },\n);\n\n/**\n * Immutable proof that a structured packet completed the control-plane commit.\n * The schema deliberately excludes correlation, request, locator, and content\n * metadata so report materializers can retain it without retaining an actor.\n */\nexport const FeedbackCommittedAcceptanceEvidenceSchema = createSchema(\n {\n packetId: uuidField(),\n packetKind: field.string().enum([\"bug\", \"review\"] as const),\n acceptedAt: canonicalServerUtcField(),\n },\n \"feedback-committed-acceptance-evidence\",\n strictOptions,\n);\n\n/**\n * Immutable identifier-free input for one exact UTC bug-health hour.\n *\n * The trusted producer owns the deterministic projection identifier. The\n * schema validates its canonical UUID representation while consumers bind it\n * to the requested window before using the projection.\n */\nexport const FeedbackBugHealthMetricsProjectionSchema = createSchema(\n {\n projectionId: uuidField(),\n windowStart: canonicalServerUtcField(),\n windowEnd: canonicalServerUtcField(),\n observedAt: canonicalServerUtcField(),\n finalized: field.boolean().validator((value) => value === true),\n rejectedCount: countField(),\n trafficDenominator: countField(),\n abuseBlockBands: field\n .array(\n field.object({\n id: field.string().enum(FEEDBACK_ABUSE_BLOCK_BANDS),\n count: positiveCountField(),\n }),\n )\n .max(FEEDBACK_ABUSE_BLOCK_BANDS.length),\n },\n \"feedback-bug-health-metrics-projection\",\n {\n ...strictOptions,\n schemaValidator: (value) => {\n const blockBands = value.abuseBlockBands as readonly FeedbackAbuseBlockBucket[];\n let previousIndex = -1;\n const canonicalBands = blockBands.every((bucket) => {\n const index = FEEDBACK_ABUSE_BLOCK_BANDS.indexOf(bucket.id);\n if (index <= previousIndex) {\n return false;\n }\n previousIndex = index;\n return true;\n });\n\n return (\n orderedWindow(\n { ...value, generatedAt: value.observedAt },\n 60 * 60 * 1_000,\n ) &&\n Date.parse(String(value.observedAt)) >=\n Date.parse(String(value.windowEnd)) &&\n canonicalBands\n );\n },\n },\n);\n\n/** Safe facts used to reconstruct a representative in-game view server-side. */\nexport const FeedbackGameReconstructionManifestSchema = createSchema(\n {\n reconstructionId: uuidField(),\n bugPacketId: uuidField(),\n createdAt: field.dateTimeISO(),\n expiresAt: field.dateTimeISO(),\n curatedAssetSetId: safeIdField(128),\n noticeKey: safeIdField(160),\n diagnostics: field.object(gameDiagnosticsShape(true)),\n },\n \"feedback-game-reconstruction-manifest\",\n {\n ...strictOptions,\n schemaValidator: (value) => {\n const createdAt = Date.parse(String(value.createdAt));\n const expiresAt = Date.parse(String(value.expiresAt));\n return (\n isGameDiagnosticsConsistent(value.diagnostics) &&\n Number.isFinite(createdAt) &&\n Number.isFinite(expiresAt) &&\n expiresAt > createdAt &&\n expiresAt - createdAt <= 30 * 24 * 60 * 60 * 1_000\n );\n },\n },\n);\n\n/** Materialized report for one previous UTC bug-health hour. */\nexport const FeedbackHourlyBugReportSchema = createSchema(\n {\n reportId: uuidField(),\n windowStart: field.dateTimeISO(),\n windowEnd: field.dateTimeISO(),\n revision: revisionField(),\n generatedAt: field.dateTimeISO(),\n acceptedCount: countField(),\n rejectedCount: countField(),\n diagnosticsAttachedCount: countField(),\n deterministicRedactionCount: countField(),\n scannerRedactionCount: countField(),\n processorLagSeconds: countField(),\n rates: field.object({\n rejectionRate: field.number().min(0).max(1),\n deterministicRedactionsPerAccepted: field.number().min(0).max(4_000),\n scannerRedactionsPerAccepted: field.number().min(0).max(4_000),\n }),\n traffic: field.object({\n denominator: countField(),\n acceptedPerTenThousand: field\n .number()\n .min(0)\n .max(MAX_COUNT)\n .optional(),\n }),\n targetDistribution: field\n .array(field.object(distributionShape(surfaceIdField)))\n .max(256),\n issueTypeDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_PERSISTABLE_ISSUE_TYPES),\n ),\n ),\n )\n .max(FEEDBACK_ISSUE_TYPES.length),\n severityDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum([\"1\", \"2\", \"3\", \"4\", \"5\"] as const),\n ),\n ),\n )\n .max(5),\n intentDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_INTENT_IDS),\n ),\n ),\n )\n .max(FEEDBACK_INTENT_IDS.length),\n buildDistribution: field\n .array(field.object(distributionShape()))\n .max(128),\n rendererDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_RENDERER_BUCKETS),\n ),\n ),\n )\n .max(FEEDBACK_RENDERER_BUCKETS.length),\n backendDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_BACKEND_BUCKETS),\n ),\n ),\n )\n .max(FEEDBACK_BACKEND_BUCKETS.length),\n viewportDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_VIEWPORT_BUCKETS),\n ),\n ),\n )\n .max(FEEDBACK_VIEWPORT_BUCKETS.length),\n frameRateDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_FRAME_RATE_BUCKETS),\n ),\n ),\n )\n .max(FEEDBACK_FRAME_RATE_BUCKETS.length),\n frameTimeDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_FRAME_TIME_BUCKETS),\n ),\n ),\n )\n .max(FEEDBACK_FRAME_TIME_BUCKETS.length),\n diagnosticFeatureDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_GAME_FEATURE_IDS),\n ),\n ),\n )\n .max(FEEDBACK_GAME_FEATURE_IDS.length),\n diagnosticCounterDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_GAME_COUNTER_CODES),\n ),\n ),\n )\n .max(FEEDBACK_GAME_COUNTER_CODES.length),\n diagnosticErrorDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_GAME_ERROR_CODES),\n ),\n ),\n )\n .max(FEEDBACK_GAME_ERROR_CODES.length),\n abuseBlockBands: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_ABUSE_BLOCK_BANDS),\n ),\n ),\n )\n .max(FEEDBACK_ABUSE_BLOCK_BANDS.length),\n comparison: field.object({\n previousHourRatio: field.number().min(0).max(1_000),\n sevenDaySameHourRatio: field.number().min(0).max(1_000),\n }),\n advisories: field.array(field.object(advisoryShape())).max(32),\n },\n \"feedback-hourly-bug-report\",\n {\n ...strictOptions,\n schemaValidator: (value) => {\n const distributions = [\n value.targetDistribution,\n value.issueTypeDistribution,\n value.severityDistribution,\n value.intentDistribution,\n value.buildDistribution,\n value.rendererDistribution,\n value.backendDistribution,\n value.viewportDistribution,\n value.frameRateDistribution,\n value.frameTimeDistribution,\n value.diagnosticFeatureDistribution,\n value.diagnosticCounterDistribution,\n value.diagnosticErrorDistribution,\n value.abuseBlockBands,\n ];\n const submittedCount = value.acceptedCount + value.rejectedCount;\n const expectedRejectionRate =\n submittedCount === 0 ? 0 : value.rejectedCount / submittedCount;\n const expectedDeterministicRate =\n value.acceptedCount === 0\n ? 0\n : value.deterministicRedactionCount / value.acceptedCount;\n const expectedScannerRate =\n value.acceptedCount === 0\n ? 0\n : value.scannerRedactionCount / value.acceptedCount;\n const trafficIsConsistent =\n (value.traffic.denominator === 0 &&\n value.traffic.acceptedPerTenThousand === undefined) ||\n (value.traffic.denominator > 0 &&\n rateMatches(\n value.traffic.acceptedPerTenThousand,\n (value.acceptedCount * 10_000) / value.traffic.denominator,\n ));\n const severityFiveCount = distributionCountFor(\n value.severityDistribution,\n \"5\",\n );\n const criticalRegression =\n severityFiveCount >= 3 ||\n (value.acceptedCount >= 5 &&\n value.comparison.sevenDaySameHourRatio >= 3);\n const lagSeconds = Math.floor(\n (Date.parse(String(value.generatedAt)) -\n Date.parse(String(value.windowEnd))) /\n 1_000,\n );\n return (\n orderedWindow(value, 60 * 60 * 1_000) &&\n value.revision >= 1 &&\n value.processorLagSeconds === lagSeconds &&\n value.diagnosticsAttachedCount <= value.acceptedCount &&\n (value.acceptedCount > 0 ||\n (value.deterministicRedactionCount === 0 &&\n value.scannerRedactionCount === 0)) &&\n rateMatches(value.rates.rejectionRate, expectedRejectionRate) &&\n rateMatches(\n value.rates.deterministicRedactionsPerAccepted,\n expectedDeterministicRate,\n ) &&\n rateMatches(\n value.rates.scannerRedactionsPerAccepted,\n expectedScannerRate,\n ) &&\n trafficIsConsistent &&\n distributions.every(hasUniqueIds) &&\n advisoryCodesAreConsistent(value.advisories, {\n \"severity-five\":\n severityFiveCount > 0\n ? {\n level: \"advisory\",\n triggerCount: severityFiveCount,\n recommendationIds: [\"inspect-release\"],\n }\n : undefined,\n \"critical-regression\": criticalRegression\n ? {\n level: \"critical\",\n triggerCount:\n severityFiveCount >= 3\n ? severityFiveCount\n : value.acceptedCount,\n recommendationIds: [\n \"inspect-release\",\n \"verify-renderer-health\",\n ],\n }\n : undefined,\n \"processor-stale\":\n lagSeconds > 10 * 60\n ? {\n level: \"critical\",\n triggerCount: lagSeconds,\n recommendationIds: [\"verify-processor-health\"],\n }\n : undefined,\n }) &&\n distributionTotal(value.targetDistribution) === value.acceptedCount &&\n distributionTotal(value.issueTypeDistribution) ===\n value.acceptedCount &&\n distributionTotal(value.severityDistribution) ===\n value.acceptedCount &&\n distributionCountsAtMost(\n value.intentDistribution,\n value.acceptedCount,\n ) &&\n distributionTotal(value.intentDistribution) <=\n value.acceptedCount * 8 &&\n distributionTotal(value.buildDistribution) === value.acceptedCount &&\n distributionTotal(value.rendererDistribution) ===\n value.diagnosticsAttachedCount &&\n distributionTotal(value.backendDistribution) ===\n value.diagnosticsAttachedCount &&\n distributionTotal(value.viewportDistribution) ===\n value.diagnosticsAttachedCount &&\n distributionTotal(value.frameRateDistribution) ===\n value.diagnosticsAttachedCount &&\n distributionTotal(value.frameTimeDistribution) ===\n value.diagnosticsAttachedCount &&\n distributionTotal(value.diagnosticFeatureDistribution) <=\n value.diagnosticsAttachedCount * FEEDBACK_GAME_FEATURE_IDS.length &&\n distributionCountsAtMost(\n value.diagnosticFeatureDistribution,\n value.diagnosticsAttachedCount,\n ) &&\n distributionTotal(value.diagnosticCounterDistribution) <=\n value.diagnosticsAttachedCount *\n FEEDBACK_GAME_COUNTER_CODES.length *\n 10_000 &&\n distributionCountsAtMost(\n value.diagnosticCounterDistribution,\n value.diagnosticsAttachedCount * 10_000,\n ) &&\n distributionTotal(value.diagnosticErrorDistribution) <=\n value.diagnosticsAttachedCount *\n FEEDBACK_GAME_ERROR_CODES.length &&\n distributionCountsAtMost(\n value.diagnosticErrorDistribution,\n value.diagnosticsAttachedCount,\n )\n );\n },\n },\n);\n\nconst rollingSatisfactionShape = () => ({\n period: field.string().enum([\"7-days\", \"30-days\", \"90-days\"] as const),\n reviewCount: countField(),\n meanStars: field.number().min(1).max(5).optional(),\n});\n\nconst satisfactionStatistics = (\n distribution: unknown,\n total: number,\n): { mean: number; median: number } | undefined => {\n if (!Array.isArray(distribution) || total <= 0) {\n return undefined;\n }\n const counts = [1, 2, 3, 4, 5].map((star) =>\n distributionCountFor(distribution, String(star)),\n );\n const weightedTotal = counts.reduce(\n (sum, count, index) => sum + count * (index + 1),\n 0,\n );\n const valueAtPosition = (position: number): number => {\n let cumulative = 0;\n for (let index = 0; index < counts.length; index += 1) {\n cumulative += counts[index] ?? 0;\n if (cumulative >= position) {\n return index + 1;\n }\n }\n return 5;\n };\n const lower = valueAtPosition(Math.ceil(total / 2));\n const upper = valueAtPosition(Math.floor(total / 2) + 1);\n return {\n mean: Math.round((weightedTotal / total) * 10) / 10,\n median: (lower + upper) / 2,\n };\n};\n\n/** Materialized daily satisfaction report. */\nexport const FeedbackDailySatisfactionReportSchema = createSchema(\n {\n reportId: uuidField(),\n windowStart: field.dateTimeISO(),\n windowEnd: field.dateTimeISO(),\n revision: revisionField(),\n generatedAt: field.dateTimeISO(),\n processorLagSeconds: countField(),\n acceptedReviewCount: countField(),\n meanStars: field.number().min(1).max(5).optional(),\n medianStars: field.number().min(1).max(5).optional(),\n starDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum([\"1\", \"2\", \"3\", \"4\", \"5\"] as const),\n ),\n ),\n )\n .max(5),\n sentimentDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_SENTIMENT_BUCKETS),\n ),\n ),\n )\n .max(FEEDBACK_SENTIMENT_BUCKETS.length),\n intentDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_INTENT_IDS),\n ),\n ),\n )\n .max(FEEDBACK_INTENT_IDS.length),\n rollingWindows: field\n .array(field.object(rollingSatisfactionShape()))\n .max(3),\n previousPeriodDeltaStars: field.number().min(-4).max(4).optional(),\n advisories: field.array(field.object(advisoryShape())).max(32),\n },\n \"feedback-daily-satisfaction-report\",\n {\n ...strictOptions,\n schemaValidator: (value) => {\n if (!orderedWindow(value, 24 * 60 * 60 * 1_000)) {\n return false;\n }\n if (\n value.acceptedReviewCount === 0 &&\n (value.meanStars !== undefined || value.medianStars !== undefined)\n ) {\n return false;\n }\n if (\n value.acceptedReviewCount > 0 &&\n (value.meanStars === undefined || value.medianStars === undefined)\n ) {\n return false;\n }\n const distributions = [\n value.starDistribution,\n value.sentimentDistribution,\n value.intentDistribution,\n ];\n const periods = value.rollingWindows.map(\n (window: { period: string }) => window.period,\n );\n const sevenDayWindow = value.rollingWindows.find(\n (window: { period: string }) => window.period === \"7-days\",\n );\n const thirtyDayWindow = value.rollingWindows.find(\n (window: { period: string }) => window.period === \"30-days\",\n );\n const ninetyDayWindow = value.rollingWindows.find(\n (window: { period: string }) => window.period === \"90-days\",\n );\n if (\n sevenDayWindow === undefined ||\n thirtyDayWindow === undefined ||\n ninetyDayWindow === undefined\n ) {\n return false;\n }\n const statistics = satisfactionStatistics(\n value.starDistribution,\n value.acceptedReviewCount,\n );\n const lagSeconds = Math.floor(\n (Date.parse(String(value.generatedAt)) -\n Date.parse(String(value.windowEnd))) /\n 1_000,\n );\n const satisfactionDrop =\n sevenDayWindow.reviewCount >= 20 &&\n typeof value.previousPeriodDeltaStars === \"number\" &&\n value.previousPeriodDeltaStars <= -0.3;\n return (\n value.revision >= 1 &&\n value.processorLagSeconds === lagSeconds &&\n distributions.every(hasUniqueIds) &&\n distributionTotal(value.starDistribution) ===\n value.acceptedReviewCount &&\n distributionTotal(value.sentimentDistribution) <=\n value.acceptedReviewCount &&\n distributionCountsAtMost(\n value.sentimentDistribution,\n value.acceptedReviewCount,\n ) &&\n distributionTotal(value.intentDistribution) <=\n value.acceptedReviewCount * 8 &&\n distributionCountsAtMost(\n value.intentDistribution,\n value.acceptedReviewCount,\n ) &&\n periods.length === 3 &&\n new Set(periods).size === 3 &&\n ((statistics === undefined &&\n value.meanStars === undefined &&\n value.medianStars === undefined) ||\n (statistics !== undefined &&\n value.meanStars === statistics.mean &&\n value.medianStars === statistics.median)) &&\n advisoryCodesAreConsistent(value.advisories, {\n \"satisfaction-drop\": satisfactionDrop\n ? {\n level: \"advisory\",\n triggerCount: sevenDayWindow.reviewCount,\n recommendationIds: [\"review-top-intents\"],\n }\n : undefined,\n \"processor-stale\":\n lagSeconds > 2.5 * 60 * 60\n ? {\n level: \"critical\",\n triggerCount: lagSeconds,\n recommendationIds: [\"verify-processor-health\"],\n }\n : undefined,\n }) &&\n value.rollingWindows.every(\n (window: { reviewCount: number; meanStars?: number }) =>\n (window.reviewCount === 0 && window.meanStars === undefined) ||\n (window.reviewCount > 0 && window.meanStars !== undefined),\n ) &&\n value.acceptedReviewCount <= sevenDayWindow.reviewCount &&\n sevenDayWindow.reviewCount <= thirtyDayWindow.reviewCount &&\n thirtyDayWindow.reviewCount <= ninetyDayWindow.reviewCount\n );\n },\n },\n);\n\nconst publicWeeklyPointShape = () => ({\n weekStart: field.dateTimeISO(),\n state: field.string().enum([\"published\", \"suppressed\"] as const),\n acceptedReviewCount: positiveCountField().optional(),\n averageStars: field.number().min(1).max(5).optional(),\n});\n\nconst publicComparisonShape = () => ({\n previousAcceptedReviewCount: positiveCountField(),\n previousAverageStars: field.number().min(1).max(5),\n deltaStars: field.number().min(-4).max(4),\n});\n\n/** Privacy-thresholded public honesty snapshot materialized once per day. */\nexport const FeedbackPublicSummarySchema = createSchema(\n {\n snapshotId: uuidField(),\n generatedAt: field.dateTimeISO(),\n asOf: field.dateTimeISO(),\n freshness: field.string().enum([\"fresh\", \"stale\"] as const),\n reportAgeSeconds: countField(),\n rollingWindowDays: field.number().enum([90] as const),\n state: field.string().enum([\"published\", \"suppressed\"] as const),\n acceptedReviewCount: positiveCountField().optional(),\n averageStars: field.number().min(1).max(5).optional(),\n trend: field.string().enum([\"up\", \"flat\", \"down\"] as const).optional(),\n comparison: field.object(publicComparisonShape()).optional(),\n weeklyPoints: field\n .array(field.object(publicWeeklyPointShape()))\n .min(13)\n .max(13),\n },\n \"feedback-public-summary\",\n {\n ...strictOptions,\n schemaValidator: (value) => {\n const summaryIsSuppressed =\n value.state === \"suppressed\" &&\n value.acceptedReviewCount === undefined &&\n value.averageStars === undefined &&\n value.trend === undefined &&\n value.comparison === undefined;\n const comparisonDelta =\n value.comparison === undefined\n ? undefined\n : roundRate(\n value.averageStars -\n value.comparison.previousAverageStars,\n );\n const expectedTrend =\n comparisonDelta === undefined\n ? undefined\n : comparisonDelta >= 0.1\n ? \"up\"\n : comparisonDelta <= -0.1\n ? \"down\"\n : \"flat\";\n const comparisonIsConsistent =\n (value.comparison === undefined && value.trend === undefined) ||\n (value.comparison !== undefined &&\n value.comparison.previousAcceptedReviewCount >= 10 &&\n value.comparison.deltaStars === comparisonDelta &&\n value.trend === expectedTrend);\n const summaryIsPublished =\n value.state === \"published\" &&\n typeof value.acceptedReviewCount === \"number\" &&\n value.acceptedReviewCount >= 10 &&\n typeof value.averageStars === \"number\" &&\n comparisonIsConsistent;\n if (!summaryIsSuppressed && !summaryIsPublished) {\n return false;\n }\n const weekStarts = value.weeklyPoints.map(\n (point: { weekStart: string }) => point.weekStart,\n );\n const asOf = Date.parse(String(value.asOf));\n const generatedAt = Date.parse(String(value.generatedAt));\n if (\n !Number.isFinite(asOf) ||\n !Number.isFinite(generatedAt) ||\n new Date(asOf).toISOString() !== value.asOf ||\n new Date(asOf).getUTCHours() !== 0 ||\n new Date(asOf).getUTCMinutes() !== 0 ||\n new Date(asOf).getUTCSeconds() !== 0 ||\n new Date(asOf).getUTCMilliseconds() !== 0 ||\n generatedAt < asOf ||\n value.reportAgeSeconds !== Math.floor((generatedAt - asOf) / 1_000)\n ) {\n return false;\n }\n const daysSinceMonday = (new Date(asOf).getUTCDay() + 6) % 7;\n const lastWeekStart = asOf - daysSinceMonday * 24 * 60 * 60 * 1_000;\n const weeksAreCanonical = weekStarts.every(\n (weekStart: string, index: number) =>\n Date.parse(weekStart) ===\n lastWeekStart - (12 - index) * 7 * 24 * 60 * 60 * 1_000,\n );\n return (\n new Set(weekStarts).size === weekStarts.length &&\n weeksAreCanonical &&\n (value.state !== \"suppressed\" ||\n value.weeklyPoints.every(\n (point: { state: string }) => point.state === \"suppressed\",\n )) &&\n value.weeklyPoints.every(\n (point: {\n state: \"published\" | \"suppressed\";\n acceptedReviewCount?: number;\n averageStars?: number;\n }) =>\n (point.state === \"suppressed\" &&\n point.acceptedReviewCount === undefined &&\n point.averageStars === undefined) ||\n (point.state === \"published\" &&\n typeof point.acceptedReviewCount === \"number\" &&\n point.acceptedReviewCount >= 10 &&\n typeof point.averageStars === \"number\" &&\n (value.state !== \"published\" ||\n point.acceptedReviewCount <= value.acceptedReviewCount)),\n )\n );\n },\n },\n);\n\n/** Conditional-write checkpoint for replay-safe timer processors. */\nexport const FeedbackProcessorCheckpointSchema = createSchema(\n {\n checkpointId: safeIdField(160),\n processor: field\n .string()\n .enum([\"bug-hourly\", \"review-daily\", \"commit-reconciliation\"] as const),\n windowKey: safeIdField(160),\n revision: revisionField(),\n completedAt: field.dateTimeISO(),\n reportId: uuidField().optional(),\n },\n \"feedback-processor-checkpoint\",\n {\n ...strictOptions,\n schemaValidator: (value) =>\n isProcessorArtifactConsistent(value, \"checkpoint\") &&\n value.revision >= 1 &&\n ((value.processor === \"commit-reconciliation\" &&\n value.reportId === undefined) ||\n (value.processor !== \"commit-reconciliation\" &&\n value.reportId !== undefined)),\n },\n);\n\n/** Immutable manifest describing one bounded materialization attempt. */\nexport const FeedbackMaterializationManifestSchema = createSchema(\n {\n manifestId: uuidField(),\n processor: field\n .string()\n .enum([\"bug-hourly\", \"review-daily\", \"commit-reconciliation\"] as const),\n windowKey: safeIdField(160),\n revision: revisionField(),\n generatedAt: field.dateTimeISO(),\n sourcePacketCount: countField(),\n lateArrivalCount: countField(),\n outputReportId: uuidField().optional(),\n status: field\n .string()\n .enum([\"published\", \"corrected\", \"no-op\"] as const),\n },\n \"feedback-materialization-manifest\",\n {\n ...strictOptions,\n schemaValidator: (value) => {\n if (\n !isProcessorArtifactConsistent(value, \"manifest\") ||\n value.lateArrivalCount > value.sourcePacketCount\n ) {\n return false;\n }\n if (value.processor === \"commit-reconciliation\") {\n return (\n value.status === \"no-op\" &&\n value.revision >= 1 &&\n value.outputReportId === undefined &&\n value.lateArrivalCount === 0\n );\n }\n return (\n (value.status === \"published\" &&\n value.revision === 1 &&\n value.lateArrivalCount === 0 &&\n value.outputReportId !== undefined) ||\n (value.status === \"corrected\" &&\n value.revision >= 2 &&\n value.lateArrivalCount > 0 &&\n value.outputReportId !== undefined)\n );\n },\n },\n);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAO,IAAM,mBAAmB,oBAAI,IAAI;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,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","names":[]}
1
+ {"version":3,"sources":["../src/validation/currencyCode.ISO4217.ts","../src/validation/percentage.ISO80000-1.ts","../src/validation/name.OWASP.ts","../src/validation/user.MS-GOOGLE-APPLE.ts","../src/components.ts","../src/player-system-events.ts","../src/feedback.ts"],"sourcesContent":["export const isoCurrencyCodes = new Set([\n \"AED\",\n \"AFN\",\n \"ALL\",\n \"AMD\",\n \"ANG\",\n \"AOA\",\n \"ARS\",\n \"AUD\",\n \"AWG\",\n \"AZN\",\n \"BAM\",\n \"BBD\",\n \"BDT\",\n \"BGN\",\n \"BHD\",\n \"BIF\",\n \"BMD\",\n \"BND\",\n \"BOB\",\n \"BOV\",\n \"BRL\",\n \"BSD\",\n \"BTN\",\n \"BWP\",\n \"BYN\",\n \"BZD\",\n \"CAD\",\n \"CDF\",\n \"CHE\",\n \"CHF\",\n \"CHW\",\n \"CLF\",\n \"CLP\",\n \"CNY\",\n \"COP\",\n \"COU\",\n \"CRC\",\n \"CUC\",\n \"CUP\",\n \"CVE\",\n \"CZK\",\n \"DJF\",\n \"DKK\",\n \"DOP\",\n \"DZD\",\n \"EGP\",\n \"ERN\",\n \"ETB\",\n \"EUR\",\n \"FJD\",\n \"FKP\",\n \"GBP\",\n \"GEL\",\n \"GHS\",\n \"GIP\",\n \"GMD\",\n \"GNF\",\n \"GTQ\",\n \"GYD\",\n \"HKD\",\n \"HNL\",\n \"HRK\",\n \"HTG\",\n \"HUF\",\n \"IDR\",\n \"ILS\",\n \"INR\",\n \"IQD\",\n \"IRR\",\n \"ISK\",\n \"JMD\",\n \"JOD\",\n \"JPY\",\n \"KES\",\n \"KGS\",\n \"KHR\",\n \"KMF\",\n \"KPW\",\n \"KRW\",\n \"KWD\",\n \"KYD\",\n \"KZT\",\n \"LAK\",\n \"LBP\",\n \"LKR\",\n \"LRD\",\n \"LSL\",\n \"LYD\",\n \"MAD\",\n \"MDL\",\n \"MGA\",\n \"MKD\",\n \"MMK\",\n \"MNT\",\n \"MOP\",\n \"MRU\",\n \"MUR\",\n \"MVR\",\n \"MWK\",\n \"MXN\",\n \"MXV\",\n \"MYR\",\n \"MZN\",\n \"NAD\",\n \"NGN\",\n \"NIO\",\n \"NOK\",\n \"NPR\",\n \"NZD\",\n \"OMR\",\n \"PAB\",\n \"PEN\",\n \"PGK\",\n \"PHP\",\n \"PKR\",\n \"PLN\",\n \"PYG\",\n \"QAR\",\n \"RON\",\n \"RSD\",\n \"RUB\",\n \"RWF\",\n \"SAR\",\n \"SBD\",\n \"SCR\",\n \"SDG\",\n \"SEK\",\n \"SGD\",\n \"SHP\",\n \"SLE\",\n \"SLL\",\n \"SOS\",\n \"SRD\",\n \"SSP\",\n \"STN\",\n \"SVC\",\n \"SYP\",\n \"SZL\",\n \"THB\",\n \"TJS\",\n \"TMT\",\n \"TND\",\n \"TOP\",\n \"TRY\",\n \"TTD\",\n \"TWD\",\n \"TZS\",\n \"UAH\",\n \"UGX\",\n \"USD\",\n \"USN\",\n \"UYI\",\n \"UYU\",\n \"UYW\",\n \"UZS\",\n \"VES\",\n \"VND\",\n \"VUV\",\n \"WST\",\n \"XAF\",\n \"XAG\",\n \"XAU\",\n \"XBA\",\n \"XBB\",\n \"XBC\",\n \"XBD\",\n \"XCD\",\n \"XDR\",\n \"XOF\",\n \"XPD\",\n \"XPF\",\n \"XPT\",\n \"XSU\",\n \"XTS\",\n \"XUA\",\n \"XXX\",\n \"YER\",\n \"ZAR\",\n \"ZMW\",\n \"ZWL\",\n]);\n\n\n/** \n * Validates whether a string is a valid ISO 4217 currency code. \n * Performs a case-insensitive lookup against a predefined set of known codes.\n */\nexport const validateCurrencyCode = (value: unknown): boolean => {\n if (typeof value !== \"string\") return false;\n return isoCurrencyCodes.has(value.toUpperCase());\n};\n","/**\n * Validates that a number is a percentage value (0 to 100 inclusive).\n * Global Standard: ISO 80000-1 percentage definition.\n */\nexport function validatePercentage(value: unknown): boolean {\n if (typeof value !== \"number\") return false;\n return value >= 0 && value <= 100;\n}\n","function validateNameLike(value: unknown, pattern: RegExp): boolean {\n if (typeof value !== \"string\") return false;\n\n const trimmed = value.trim();\n if (trimmed.length === 0) return false;\n\n // Limit length (ISO guidance: max 256 is typical)\n if (trimmed.length > 256) return false;\n\n // Reject ASCII control chars (U+0000–U+001F and U+007F)\n for (const ch of trimmed) {\n const cp = ch.codePointAt(0)!;\n if ((cp >= 0x00 && cp <= 0x1F) || cp === 0x7F) return false;\n }\n\n if (!pattern.test(trimmed)) return false;\n\n return true;\n}\n\n/**\n * Validates that a personal name is safe and culturally inclusive.\n *\n * Decimal digits remain unsupported because first, middle, and last names are\n * personal-name components rather than public display identifiers.\n *\n * Global Standard: OWASP Input Validation Cheat Sheet + ICAO Doc 9303 + IETF PRECIS\n */\nexport function validateName(value: unknown): boolean {\n return validateNameLike(value, /^[\\p{L}\\p{M}'\\-. ]+$/u);\n}\n\n/**\n * Validates a public display name independently from personal-name fields.\n *\n * Unicode decimal digits are supported alongside letters and combining marks\n * so legitimate display names such as `Player 2` remain representable without\n * relaxing first, middle, or last-name validation.\n *\n * Global Standard: OWASP Input Validation Cheat Sheet + IETF PRECIS\n */\nexport function validateDisplayName(value: unknown): boolean {\n return validateNameLike(value, /^[\\p{L}\\p{M}\\p{Nd}'\\-. ]+$/u);\n}\n","/**\n * Validates that a user ID is a valid `sub` from one of the supported identity providers.\n * Global Standard: OpenID Connect Core 1.0 `sub` claim.\n */\nexport function validateUserId(value: unknown): boolean {\n if (typeof value !== \"string\") return false;\n\n const trimmed = value.trim();\n if (trimmed.length === 0) return false;\n\n // Google: all digits\n const googlePattern = /^\\d{21,22}$/;\n\n // Microsoft: UUID v4\n const microsoftPattern =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n // Apple: opaque, usually UUID but allow any printable string up to 255 chars\n const applePattern = /^[\\w\\-.]{6,255}$/; // Alphanumeric + - . _ (common safe characters)\n\n return (\n googlePattern.test(trimmed) ||\n microsoftPattern.test(trimmed) ||\n applePattern.test(trimmed)\n );\n}\n\nexport function validateUserIdArray(value: unknown): boolean {\n if (!Array.isArray(value)) return false;\n return value.every(validateUserId);\n}","import { Infer } from \"./infer.js\";\nimport { createSchema } from \"./schema.js\";\nimport { Schema, SchemaShape } from \"./types.js\";\n// This module provides a registry for component schemas, allowing components to be registered and retrieved by type.\nconst componentSchemaRegistry = new Map<string, Schema<SchemaShape>>();\n\nexport function createComponentSchema<T extends SchemaShape>(\n shape: SchemaShape,\n name: string,\n version: string,\n tableName: string = \"\",\n schemaValidator: (entity: Infer<T>) => boolean = () => true\n): Schema<SchemaShape> {\n const schema = createSchema<T>(shape as T, name, {\n version: version,\n piiEnforcement: \"strict\",\n table: tableName,\n schemaValidator,\n });\n registerComponentSchema(name, schema as Schema<SchemaShape>);\n return schema as Schema<SchemaShape>;\n}\n\nexport function registerComponentSchema(\n type: string,\n schema: Schema<SchemaShape>\n) {\n componentSchemaRegistry.set(type, schema);\n}\n\nexport function getComponentSchema(\n type: string\n): Schema<SchemaShape> | undefined {\n return componentSchemaRegistry.get(type);\n}\n\nexport function getAllComponentSchemas(): [string, Schema<SchemaShape>][] {\n return Array.from(componentSchemaRegistry.entries());\n}\n","import { field } from \"./field.js\";\nimport { createSchema } from \"./schema.js\";\n\n/** Event classes that can be observed by a player. */\nexport const PLAYER_SYSTEM_EVENT_KINDS = [\n \"combat\",\n \"social\",\n \"mission\",\n \"crafting\",\n \"world\",\n] as const;\n\nexport type PlayerSystemEventKind = (typeof PLAYER_SYSTEM_EVENT_KINDS)[number];\n\n/** Achievement tiers exposed by the curated player projection. */\nexport const PLAYER_SYSTEM_ACHIEVEMENT_TIERS = [\n \"bronze\",\n \"silver\",\n \"gold\",\n] as const;\n\nexport type PlayerSystemAchievementTier =\n (typeof PLAYER_SYSTEM_ACHIEVEMENT_TIERS)[number];\n\n/** Projection states for an achievement progress track. */\nexport const PLAYER_SYSTEM_ACHIEVEMENT_TRACK_STATUSES = [\n \"tracking\",\n \"earned\",\n] as const;\n\nexport type PlayerSystemAchievementTrackStatus =\n (typeof PLAYER_SYSTEM_ACHIEVEMENT_TRACK_STATUSES)[number];\n\nconst playerIdField = () =>\n field\n .string()\n .min(1)\n .max(128)\n .PID({\n classification: \"low\",\n action: \"none\",\n logHandling: \"pseudonym\",\n purpose: \"a stable player-scoped storage identifier\",\n })\n .description(\n \"Stable player identifier; the only personal identifier retained in event projections\",\n );\n\nconst eventIdField = () => field.string().min(1).max(128);\n\nconst eventKindField = () =>\n field.string().enum(PLAYER_SYSTEM_EVENT_KINDS);\n\nconst eventTitleField = () =>\n field\n .generalText()\n .min(1)\n .max(120)\n .description(\"Player-visible event title\");\n\nconst eventSummaryField = () =>\n field\n .generalText()\n .min(1)\n .max(320)\n .description(\"Player-visible event summary\");\n\nconst observedEventFields = (defaultHighlighted = true) => ({\n id: eventIdField(),\n playerId: playerIdField(),\n occurredAt: field.dateTimeISO(),\n kind: eventKindField(),\n title: eventTitleField(),\n summary: eventSummaryField(),\n highlighted: defaultHighlighted\n ? field.boolean().default(false)\n : field.boolean(),\n});\n\nconst eventHighlightFields = () => ({\n id: eventIdField(),\n title: eventTitleField(),\n summary: eventSummaryField(),\n occurredAt: field.dateTimeISO(),\n kind: eventKindField(),\n});\n\nconst eventEntryFields = () => ({\n id: eventIdField(),\n title: eventTitleField(),\n summary: eventSummaryField(),\n occurredAt: field.dateTimeISO(),\n kind: eventKindField(),\n highlighted: field.boolean(),\n});\n\nconst achievementFields = () => ({\n id: eventIdField(),\n title: eventTitleField(),\n tier: field.string().enum(PLAYER_SYSTEM_ACHIEVEMENT_TIERS),\n progressLabel: eventSummaryField(),\n earnedAt: field.dateTimeISO().optional(),\n});\n\nconst achievementTrackFields = () => ({\n id: eventIdField(),\n title: eventTitleField(),\n current: field.number().min(0).max(1000),\n target: field.number().min(1).max(1000),\n status: field.string().enum(PLAYER_SYSTEM_ACHIEVEMENT_TRACK_STATUSES),\n});\n\n/** A player-observable event accepted at the ingestion boundary. */\nexport interface PlayerSystemObservedEvent {\n id: string;\n playerId: string;\n occurredAt: string;\n kind: PlayerSystemEventKind;\n title: string;\n summary: string;\n highlighted: boolean;\n}\n\n/** A raw event batch written to the blob-backed ingestion zone. */\nexport interface PlayerSystemObservedEventBatch {\n source: string;\n emittedAt: string;\n events: readonly PlayerSystemObservedEvent[];\n}\n\n/** A normalized event enriched with its deterministic deduplication key. */\nexport interface PlayerSystemNormalizedObservedEvent\n extends PlayerSystemObservedEvent {\n deterministicKey: string;\n}\n\n/** A normalized event batch written by the projection processor. */\nexport interface PlayerSystemNormalizedEventBatch {\n sourceBlobName: string;\n processedAt: string;\n events: readonly PlayerSystemNormalizedObservedEvent[];\n}\n\n/** A highlighted event shown in the curated player Event Log. */\nexport interface PlayerSystemEventHighlight {\n id: string;\n title: string;\n summary: string;\n occurredAt: string;\n kind: PlayerSystemEventKind;\n}\n\n/** A recent event shown in the curated player Event Log. */\nexport interface PlayerSystemEventEntry extends PlayerSystemEventHighlight {\n highlighted: boolean;\n}\n\n/** An earned or explainable achievement projected from observed events. */\nexport interface PlayerSystemAchievementEntry {\n id: string;\n title: string;\n tier: PlayerSystemAchievementTier;\n progressLabel: string;\n earnedAt?: string;\n}\n\n/** Progress toward an achievement projected from observed events. */\nexport interface PlayerSystemAchievementTrack {\n id: string;\n title: string;\n current: number;\n target: number;\n status: PlayerSystemAchievementTrackStatus;\n}\n\n/** Curated per-player Event Log and Achievement read model. */\nexport interface PlayerSystemCuratedSnapshot {\n playerId: string;\n projectedAt: string;\n lastObservedAt: string;\n highlights: readonly PlayerSystemEventHighlight[];\n events: readonly PlayerSystemEventEntry[];\n achievements: readonly PlayerSystemAchievementEntry[];\n tracks: readonly PlayerSystemAchievementTrack[];\n}\n\n/** Schema for raw player-observable event batches. */\nexport const PlayerSystemObservedEventBatchSchema = createSchema(\n {\n source: field.string().min(1).max(120),\n emittedAt: field.dateTimeISO(),\n events: field.array(field.object(observedEventFields())),\n },\n \"player-system-observed-event-batch\",\n {\n version: \"1.0.0\",\n piiEnforcement: \"strict\",\n },\n);\n\n/** Schema for normalized event batches used by projections and gossip sourcing. */\nexport const PlayerSystemNormalizedEventBatchSchema = createSchema(\n {\n sourceBlobName: field.string().min(1).max(512),\n processedAt: field.dateTimeISO(),\n events: field.array(\n field.object({\n ...observedEventFields(false),\n deterministicKey: field.string().min(1).max(256),\n }),\n ),\n },\n \"player-system-normalized-event-batch\",\n {\n version: \"1.0.0\",\n piiEnforcement: \"strict\",\n },\n);\n\n/** Schema for curated per-player Event Log and Achievement read models. */\nexport const PlayerSystemCuratedSnapshotSchema = createSchema(\n {\n playerId: playerIdField(),\n projectedAt: field.dateTimeISO(),\n lastObservedAt: field.dateTimeISO(),\n highlights: field.array(field.object(eventHighlightFields())),\n events: field.array(field.object(eventEntryFields())),\n achievements: field.array(field.object(achievementFields())),\n tracks: field.array(field.object(achievementTrackFields())),\n },\n \"player-system-curated-snapshot\",\n {\n version: \"1.0.0\",\n piiEnforcement: \"strict\",\n },\n);\n\nexport type PlayerSystemObservedEventBatchEntity =\n PlayerSystemObservedEventBatch & {\n type: \"player-system-observed-event-batch\";\n version: \"1.0.0\";\n };\n\nexport type PlayerSystemNormalizedEventBatchEntity =\n PlayerSystemNormalizedEventBatch & {\n type: \"player-system-normalized-event-batch\";\n version: \"1.0.0\";\n };\n\nexport type PlayerSystemCuratedSnapshotEntity = PlayerSystemCuratedSnapshot & {\n type: \"player-system-curated-snapshot\";\n version: \"1.0.0\";\n};\n","import { field } from \"./field.js\";\nimport { FEEDBACK_CONTRACT_VERSION } from \"./feedback-contract-version.js\";\nimport {\n FEEDBACK_BACKEND_BUCKETS,\n FEEDBACK_FRAME_RATE_BUCKETS,\n FEEDBACK_FRAME_TIME_BUCKETS,\n FEEDBACK_GAME_COUNTER_CODES,\n FEEDBACK_GAME_COUNTER_MAX_COUNT,\n FEEDBACK_GAME_COUNTER_MAX_ITEMS,\n FEEDBACK_GAME_ERROR_CODES,\n FEEDBACK_GAME_FEATURE_IDS,\n FEEDBACK_GAME_PROVENANCE_CONTRACT_IDS,\n FEEDBACK_GAME_PROVENANCE_CONTRACTS,\n FEEDBACK_GAME_SURFACE_IDS,\n FEEDBACK_RENDERER_BUCKETS,\n FEEDBACK_VIEWPORT_BUCKETS,\n FeedbackGameDiagnosticsSchema,\n feedbackGameDiagnosticsShape as gameDiagnosticsShape,\n isFeedbackGameDiagnosticsConsistent as isGameDiagnosticsConsistent,\n validateFeedbackGameDiagnostics,\n} from \"./feedback-diagnostics.contract.js\";\nimport type {\n FeedbackGameDiagnostics,\n FeedbackGameDiagnosticsValidationResult,\n} from \"./feedback-diagnostics.contract.js\";\nimport {\n FEEDBACK_UNICODE_PROFILE_ID,\n containsFeedbackUnicodeProfileUnsupportedText,\n} from \"./feedback-unicode-profile.js\";\nimport { createSchema } from \"./schema.js\";\nimport type { ValidationIssue } from \"./validation.types.js\";\n\nexport { FEEDBACK_CONTRACT_VERSION };\nexport {\n FEEDBACK_BACKEND_BUCKETS,\n FEEDBACK_FRAME_RATE_BUCKETS,\n FEEDBACK_FRAME_TIME_BUCKETS,\n FEEDBACK_GAME_COUNTER_CODES,\n FEEDBACK_GAME_COUNTER_MAX_COUNT,\n FEEDBACK_GAME_COUNTER_MAX_ITEMS,\n FEEDBACK_GAME_ERROR_CODES,\n FEEDBACK_GAME_FEATURE_IDS,\n FEEDBACK_GAME_PROVENANCE_CONTRACT_IDS,\n FEEDBACK_GAME_PROVENANCE_CONTRACTS,\n FEEDBACK_GAME_SURFACE_IDS,\n FEEDBACK_RENDERER_BUCKETS,\n FEEDBACK_VIEWPORT_BUCKETS,\n FeedbackGameDiagnosticsSchema,\n validateFeedbackGameDiagnostics,\n};\nexport type {\n FeedbackGameDiagnostics,\n FeedbackGameDiagnosticsValidationResult,\n};\n\n/**\n * Canonical Unicode normalization data shared by every v1 narrative\n * processor.\n */\nexport const FEEDBACK_UNICODE_NORMALIZATION_PROFILE =\n FEEDBACK_UNICODE_PROFILE_ID;\n\n/** Exact progressive bug cooldown ladder, in seconds. */\nexport const FEEDBACK_BUG_COOLDOWN_SECONDS = Object.freeze([\n 5 * 60,\n 15 * 60,\n 60 * 60,\n 6 * 60 * 60,\n 24 * 60 * 60,\n] as const);\n\n/** Exact post-review suppression period, in seconds. */\nexport const FEEDBACK_REVIEW_COOLDOWN_SECONDS = 30 * 24 * 60 * 60;\n\n/** Closed abuse-control bands safe to aggregate without reporter identity. */\nexport const FEEDBACK_ABUSE_BLOCK_BANDS = Object.freeze([\n \"five-minutes\",\n \"fifteen-minutes\",\n \"one-hour\",\n \"six-hours\",\n \"twenty-four-hours\",\n \"fail-closed\",\n \"edge-blocked\",\n] as const);\n\n/** Stable issue types accepted by bug-report intake. */\nexport const FEEDBACK_ISSUE_TYPES = [\n \"visual-layout\",\n \"functionality\",\n \"gameplay\",\n \"performance-stability\",\n \"accessibility\",\n \"content-localisation\",\n \"account-access\",\n \"privacy-security\",\n \"other\",\n] as const;\n\n/** Issue types that may be persisted after intake routing. */\nexport const FEEDBACK_PERSISTABLE_ISSUE_TYPES = FEEDBACK_ISSUE_TYPES.filter(\n (issueType) => issueType !== \"privacy-security\",\n);\n\n/** Stable severity scale and translation keys for accessible star controls. */\nexport const FEEDBACK_SEVERITY_LEVELS = [\n { value: 1, id: \"cosmetic\", labelKey: \"feedback.severity.cosmetic\" },\n { value: 2, id: \"minor\", labelKey: \"feedback.severity.minor\" },\n { value: 3, id: \"disruptive\", labelKey: \"feedback.severity.disruptive\" },\n { value: 4, id: \"blocking\", labelKey: \"feedback.severity.blocking\" },\n { value: 5, id: \"critical\", labelKey: \"feedback.severity.critical\" },\n] as const;\n\n/** Stable satisfaction scale and translation keys for accessible stars. */\nexport const FEEDBACK_SATISFACTION_LEVELS = [\n { value: 1, id: \"very-poor\", labelKey: \"feedback.satisfaction.very-poor\" },\n { value: 2, id: \"poor\", labelKey: \"feedback.satisfaction.poor\" },\n { value: 3, id: \"fair\", labelKey: \"feedback.satisfaction.fair\" },\n { value: 4, id: \"good\", labelKey: \"feedback.satisfaction.good\" },\n { value: 5, id: \"excellent\", labelKey: \"feedback.satisfaction.excellent\" },\n] as const;\n\n/** Closed sentiment output from the transient English classifier. */\nexport const FEEDBACK_SENTIMENT_BUCKETS = [\n \"very-negative\",\n \"negative\",\n \"mixed\",\n \"neutral\",\n \"positive\",\n \"very-positive\",\n \"not-detected\",\n] as const;\n\n/** Closed intent output from the transient classifier. */\nexport const FEEDBACK_INTENT_IDS = [\n \"visual-layout\",\n \"functionality\",\n \"gameplay\",\n \"performance-stability\",\n \"accessibility\",\n \"content-localisation\",\n \"account-access\",\n \"other\",\n \"praise\",\n \"suggestion\",\n \"confusion\",\n \"frustration\",\n] as const;\n\n/** Closed theme output from the transient classifier. */\nexport const FEEDBACK_THEME_IDS = [\n \"navigation\",\n \"visual-design\",\n \"game-controls\",\n \"rendering\",\n \"responsiveness\",\n \"stability\",\n \"accessibility\",\n \"localisation\",\n \"account-access\",\n \"overall-experience\",\n \"other\",\n] as const;\n\n/** Closed site-section identifiers; arbitrary routes and URLs are forbidden. */\nexport const FEEDBACK_SURFACE_IDS = [\n \"site.about\",\n \"admin.analytics\",\n \"admin.capabilities\",\n \"admin.feature-flags\",\n \"admin.feedback\",\n \"admin.moderation\",\n \"admin.users\",\n \"site.chatbot\",\n \"site.generator\",\n \"site.gpu-demo\",\n \"site.home\",\n \"game.player-system\",\n \"account.profile\",\n \"site.video\",\n] as const;\n\n/** Canonical capability-projection metadata for every feedback surface. */\nexport const FEEDBACK_SURFACE_DEFINITIONS = [\n {\n id: \"site.about\",\n labelKey: \"feedback.surface.about\",\n kind: \"public\",\n gameDiagnosticsEligible: false,\n },\n {\n id: \"admin.analytics\",\n labelKey: \"feedback.surface.adminAnalytics\",\n kind: \"admin\",\n gameDiagnosticsEligible: false,\n },\n {\n id: \"admin.capabilities\",\n labelKey: \"feedback.surface.adminCapabilities\",\n kind: \"admin\",\n gameDiagnosticsEligible: false,\n },\n {\n id: \"admin.feature-flags\",\n labelKey: \"feedback.surface.adminFeatureFlags\",\n kind: \"admin\",\n gameDiagnosticsEligible: false,\n },\n {\n id: \"admin.feedback\",\n labelKey: \"feedback.surface.adminFeedback\",\n kind: \"admin\",\n gameDiagnosticsEligible: false,\n },\n {\n id: \"admin.moderation\",\n labelKey: \"feedback.surface.adminModeration\",\n kind: \"admin\",\n gameDiagnosticsEligible: false,\n },\n {\n id: \"admin.users\",\n labelKey: \"feedback.surface.adminUsers\",\n kind: \"admin\",\n gameDiagnosticsEligible: false,\n },\n {\n id: \"site.chatbot\",\n labelKey: \"feedback.surface.chatbot\",\n kind: \"public\",\n gameDiagnosticsEligible: false,\n },\n {\n id: \"site.generator\",\n labelKey: \"feedback.surface.generator\",\n kind: \"game\",\n gameDiagnosticsEligible: true,\n },\n {\n id: \"site.gpu-demo\",\n labelKey: \"feedback.surface.gpuDemo\",\n kind: \"game\",\n gameDiagnosticsEligible: true,\n },\n {\n id: \"site.home\",\n labelKey: \"feedback.surface.home\",\n kind: \"public\",\n gameDiagnosticsEligible: false,\n },\n {\n id: \"game.player-system\",\n labelKey: \"feedback.surface.playerSystem\",\n kind: \"game\",\n gameDiagnosticsEligible: false,\n },\n {\n id: \"account.profile\",\n labelKey: \"feedback.surface.profile\",\n kind: \"authenticated\",\n gameDiagnosticsEligible: false,\n },\n {\n id: \"site.video\",\n labelKey: \"feedback.surface.video\",\n kind: \"public\",\n gameDiagnosticsEligible: false,\n },\n] as const;\n\n/** Closed reasons for falling back to explicit structured-only submission. */\nexport const FEEDBACK_STRUCTURED_ONLY_REASON_CODES = [\n \"analysis-unavailable\",\n \"invalid-envelope\",\n \"invalid-sensitive-payload\",\n \"language-not-enabled\",\n \"request-too-large\",\n \"length-required\",\n] as const;\n\n/** Pinned privacy policy versions permitted in retained analysis. */\nexport const FEEDBACK_PRIVACY_POLICY_VERSIONS = [\n \"feedback-privacy-en-v1\",\n] as const;\n\n/** Pinned local model versions permitted in retained analysis. */\nexport const FEEDBACK_ANALYSIS_MODEL_VERSIONS = [\n \"feedback-en-rules-v1\",\n] as const;\n\nfor (const vocabulary of [\n FEEDBACK_BUG_COOLDOWN_SECONDS,\n FEEDBACK_ISSUE_TYPES,\n FEEDBACK_PERSISTABLE_ISSUE_TYPES,\n FEEDBACK_SEVERITY_LEVELS,\n FEEDBACK_SATISFACTION_LEVELS,\n FEEDBACK_SENTIMENT_BUCKETS,\n FEEDBACK_INTENT_IDS,\n FEEDBACK_THEME_IDS,\n FEEDBACK_SURFACE_IDS,\n FEEDBACK_SURFACE_DEFINITIONS,\n FEEDBACK_STRUCTURED_ONLY_REASON_CODES,\n FEEDBACK_PRIVACY_POLICY_VERSIONS,\n FEEDBACK_ANALYSIS_MODEL_VERSIONS,\n]) {\n Object.freeze(vocabulary);\n}\nfor (const entry of [\n ...FEEDBACK_SEVERITY_LEVELS,\n ...FEEDBACK_SATISFACTION_LEVELS,\n ...FEEDBACK_SURFACE_DEFINITIONS,\n]) {\n Object.freeze(entry);\n}\n\n/** Bug issue-type identifier. */\nexport type FeedbackIssueType = (typeof FEEDBACK_ISSUE_TYPES)[number];\n\n/** Persistable issue type after confidential security routing. */\nexport type FeedbackPersistableIssueType =\n (typeof FEEDBACK_PERSISTABLE_ISSUE_TYPES)[number];\n\n/** One-to-five bug severity. */\nexport type FeedbackSeverity =\n (typeof FEEDBACK_SEVERITY_LEVELS)[number][\"value\"];\n\n/** One-to-five satisfaction score. */\nexport type FeedbackSatisfaction =\n (typeof FEEDBACK_SATISFACTION_LEVELS)[number][\"value\"];\n\n/** Closed transient sentiment bucket. */\nexport type FeedbackSentiment =\n (typeof FEEDBACK_SENTIMENT_BUCKETS)[number];\n\n/** Closed transient intent identifier. */\nexport type FeedbackIntentId = (typeof FEEDBACK_INTENT_IDS)[number];\n\n/** Closed transient theme identifier. */\nexport type FeedbackThemeId = (typeof FEEDBACK_THEME_IDS)[number];\n\n/** Closed site-section identifier eligible for capability projection. */\nexport type FeedbackSurfaceId = (typeof FEEDBACK_SURFACE_IDS)[number];\n\n/** Closed abuse-control aggregation band. */\nexport type FeedbackAbuseBlockBand =\n (typeof FEEDBACK_ABUSE_BLOCK_BANDS)[number];\n\n/** Supported rich-text mark. */\nexport type FeedbackRichTextMark = \"bold\" | \"italic\" | \"underline\";\n\n/** Text leaf in the transient rich-text AST. */\nexport interface FeedbackRichTextNode {\n type: \"text\";\n text: string;\n marks?: readonly FeedbackRichTextMark[];\n}\n\n/** Paragraph or bullet-list item in the transient rich-text AST. */\nexport type FeedbackRichTextBlock =\n | {\n type: \"paragraph\";\n depth: number;\n children: readonly FeedbackRichTextNode[];\n }\n | {\n type: \"listItem\";\n listType: \"bullet\";\n depth: number;\n children: readonly FeedbackRichTextNode[];\n };\n\n/** Browser/scanner interoperable transient document. */\nexport interface FeedbackRichTextDocument {\n type: \"doc\";\n schemaVersion: \"1\";\n children: readonly FeedbackRichTextBlock[];\n version: typeof FEEDBACK_CONTRACT_VERSION;\n}\n\n/** Browser/scanner interoperable encrypted narrative envelope. */\nexport interface FeedbackEncryptedNarrativeEnvelope {\n type: \"feedback-encrypted-narrative-envelope\";\n version: typeof FEEDBACK_CONTRACT_VERSION;\n schemaVersion: \"1\";\n keyId: string;\n algorithm: \"RSA-OAEP-256+A256GCM\";\n wrappedKey: string;\n iv: string;\n ciphertext: string;\n authenticationTag: string;\n}\n\ninterface FeedbackTransientAnalysisRequestBase {\n type: \"feedback-transient-analysis-request\";\n version: typeof FEEDBACK_CONTRACT_VERSION;\n schemaVersion: \"1\";\n requestId: string;\n deterministicRedactionCount: number;\n envelope: FeedbackEncryptedNarrativeEnvelope;\n}\n\n/**\n * One-use bug analysis request bound to a closed surface that the service\n * must authorise before handing ciphertext to the private scanner.\n */\nexport interface FeedbackBugTransientAnalysisRequest\n extends FeedbackTransientAnalysisRequestBase {\n purpose: \"bug\";\n surfaceId: FeedbackSurfaceId;\n}\n\n/** One-use satisfaction-review analysis request with no site surface. */\nexport interface FeedbackReviewTransientAnalysisRequest\n extends FeedbackTransientAnalysisRequestBase {\n purpose: \"review\";\n surfaceId?: never;\n}\n\n/** Closed purpose-discriminated request that must never be persisted or logged. */\nexport type FeedbackTransientAnalysisRequest =\n | FeedbackBugTransientAnalysisRequest\n | FeedbackReviewTransientAnalysisRequest;\n\n/** Typed result for the purpose-discriminated transient request validator. */\nexport type FeedbackTransientAnalysisRequestValidationResult =\n | {\n readonly valid: true;\n readonly value: FeedbackTransientAnalysisRequest;\n readonly errors?: never;\n readonly issues?: never;\n }\n | {\n readonly valid: false;\n readonly value?: never;\n readonly errors: readonly string[];\n readonly issues?: readonly ValidationIssue[];\n };\n\n/** Closed classifier fields that may be persisted. */\nexport interface FeedbackDerivedAnalysis {\n type: \"feedback-derived-analysis\";\n version: typeof FEEDBACK_CONTRACT_VERSION;\n status: \"analyzed\" | \"structured-only\";\n sentiment?: FeedbackSentiment;\n intentIds: readonly FeedbackIntentId[];\n themeIds: readonly FeedbackThemeId[];\n confidence?: \"low\" | \"medium\" | \"high\";\n policyVersion: string;\n modelVersion: string;\n deterministicRedactionCount: number;\n scannerRedactionCount: number;\n}\n\n/** Ephemeral one-use scanner receipt. */\nexport interface FeedbackAnalysisReceipt\n extends Omit<FeedbackDerivedAnalysis, \"type\" | \"status\"> {\n type: \"feedback-analysis-receipt\";\n status: \"analyzed\";\n receiptId: string;\n analyzedAt: string;\n}\n\n/** Identifier-free immutable bug packet. */\nexport interface FeedbackBugPacket {\n type: \"feedback-bug-packet\";\n version: typeof FEEDBACK_CONTRACT_VERSION;\n packetId: string;\n acceptedAt: string;\n surfaceId: string;\n issueType: FeedbackPersistableIssueType;\n severity: FeedbackSeverity;\n releaseId: string;\n buildId: string;\n analysis?: FeedbackDerivedAnalysis;\n gameDiagnostics?: FeedbackGameDiagnostics;\n}\n\n/** Identifier-free immutable satisfaction packet. */\nexport interface FeedbackReviewPacket {\n type: \"feedback-review-packet\";\n version: typeof FEEDBACK_CONTRACT_VERSION;\n packetId: string;\n acceptedAt: string;\n satisfaction: FeedbackSatisfaction;\n analysis?: FeedbackDerivedAnalysis;\n}\n\n/**\n * Durable identifier-free proof that feedback intake committed a packet.\n *\n * This projection is emitted only by the trusted acceptance-evidence worker;\n * the public intake contract never accepts it from a caller.\n */\nexport interface FeedbackCommittedAcceptanceEvidence {\n type: \"feedback-committed-acceptance-evidence\";\n version: typeof FEEDBACK_CONTRACT_VERSION;\n packetId: string;\n packetKind: \"bug\" | \"review\";\n acceptedAt: string;\n}\n\n/** Count bucket used by materialized feedback reports. */\nexport interface FeedbackCountBucket {\n id: string;\n count: number;\n}\n\n/** Allowlisted abuse-control count safe for identifier-free reports. */\nexport interface FeedbackAbuseBlockBucket extends FeedbackCountBucket {\n id: FeedbackAbuseBlockBand;\n}\n\n/** Identifier-free finalized facts supplied to one hourly bug-health window. */\nexport interface FeedbackBugHealthMetricsProjection {\n type: \"feedback-bug-health-metrics-projection\";\n version: typeof FEEDBACK_CONTRACT_VERSION;\n projectionId: string;\n windowStart: string;\n windowEnd: string;\n observedAt: string;\n finalized: true;\n rejectedCount: number;\n trafficDenominator: number;\n abuseBlockBands: readonly FeedbackAbuseBlockBucket[];\n}\n\n/** A weekly public point that reveals nothing when the privacy threshold fails. */\nexport type FeedbackPublicWeeklyPoint =\n | {\n weekStart: string;\n state: \"suppressed\";\n }\n | {\n weekStart: string;\n state: \"published\";\n acceptedReviewCount: number;\n averageStars: number;\n };\n\n/** Thresholded preceding-window facts used to derive the public trend. */\nexport interface FeedbackPublicComparison {\n previousAcceptedReviewCount: number;\n previousAverageStars: number;\n deltaStars: number;\n}\n\ninterface FeedbackPublicSummaryBase {\n type: \"feedback-public-summary\";\n version: typeof FEEDBACK_CONTRACT_VERSION;\n snapshotId: string;\n generatedAt: string;\n asOf: string;\n freshness: \"fresh\" | \"stale\";\n reportAgeSeconds: number;\n rollingWindowDays: 90;\n weeklyPoints: readonly FeedbackPublicWeeklyPoint[];\n}\n\n/** Daily read model that omits every public metric below ten reviews. */\nexport type FeedbackPublicSummary =\n | (FeedbackPublicSummaryBase & {\n state: \"suppressed\";\n })\n | (FeedbackPublicSummaryBase & {\n state: \"published\";\n acceptedReviewCount: number;\n averageStars: number;\n comparison?: FeedbackPublicComparison;\n trend?: \"up\" | \"flat\" | \"down\";\n });\n\nconst SAFE_ID_PATTERN = /^[a-z0-9][a-z0-9._:-]*$/i;\nconst INGESTION_KEY_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;\nconst BASE64URL_PATTERN = /^[A-Za-z0-9_-]+$/;\nconst OPAQUE_UUID_V4_PATTERN =\n /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/;\nconst DISALLOWED_NARRATIVE_SYNTAX_PATTERN =\n /<|>|(?:https?|ftp|mailto|javascript|data|blob|file):|\\/\\/|www\\.|\\]\\s*\\(/i;\nconst DISALLOWED_UNICODE_FORMAT_PATTERN = /\\p{Cf}/u;\nconst MAX_NARRATIVE_CHARACTERS = 4_000;\nconst MAX_NARRATIVE_UTF16_CODE_UNITS = 8_000;\nconst MAX_COUNT = 1_000_000_000;\nconst BASE64URL_ALPHABET =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\";\nconst BUG_HOUR_WINDOW_PATTERN =\n /^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])T(?:[01]\\d|2[0-3])$/;\nconst REVIEW_DAY_WINDOW_PATTERN =\n /^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$/;\nconst RECONCILIATION_WINDOW_PATTERN =\n /^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])T(?:[01]\\d|2[0-3]):(?:[0-5]\\d)$/;\nconst CANONICAL_SERVER_UTC_PATTERN =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$/;\n\nconst strictOptions = {\n version: FEEDBACK_CONTRACT_VERSION,\n piiEnforcement: \"strict\" as const,\n unknownFields: \"reject\" as const,\n identity: \"exact\" as const,\n};\n\nconst uuidField = () =>\n field\n .string()\n .validator((value) => OPAQUE_UUID_V4_PATTERN.test(value))\n .description(\"Opaque UUID generated for the feedback workflow\");\n\nconst isCanonicalServerUtc = (value: unknown): value is string => {\n if (\n typeof value !== \"string\" ||\n !CANONICAL_SERVER_UTC_PATTERN.test(value)\n ) {\n return false;\n }\n\n const timestamp = Date.parse(value);\n return (\n Number.isFinite(timestamp) && new Date(timestamp).toISOString() === value\n );\n};\n\nconst canonicalServerUtcField = () =>\n field\n .dateTimeISO()\n .validator(isCanonicalServerUtc)\n .description(\n \"Canonical millisecond-precision UTC timestamp supplied by the trusted server\",\n );\n\nconst draftIdField = () =>\n field\n .string()\n .validator((value) => OPAQUE_UUID_V4_PATTERN.test(value))\n .description(\"Opaque identifier for one short-lived structured draft\")\n .PID({\n classification: \"low\",\n action: \"none\",\n logHandling: \"omit\",\n purpose: \"short-lived feedback draft lookup that must never enter logs\",\n });\n\nconst safeIdField = (maximum = 128) =>\n field.string().min(1).max(maximum).pattern(SAFE_ID_PATTERN);\n\nconst ingestionKeyIdField = () =>\n field\n .string()\n .min(1)\n .max(80)\n .pattern(INGESTION_KEY_ID_PATTERN);\n\nconst decodeCanonicalBase64Url = (value: string): Uint8Array | undefined => {\n if (\n !BASE64URL_PATTERN.test(value) ||\n value.length % 4 === 1\n ) {\n return undefined;\n }\n const finalValue = BASE64URL_ALPHABET.indexOf(value.at(-1) ?? \"\");\n if (\n finalValue < 0 ||\n (value.length % 4 === 2 && (finalValue & 0b1111) !== 0) ||\n (value.length % 4 === 3 && (finalValue & 0b11) !== 0)\n ) {\n return undefined;\n }\n\n const output: number[] = [];\n let accumulator = 0;\n let bitCount = 0;\n for (const character of value) {\n const sextet = BASE64URL_ALPHABET.indexOf(character);\n if (sextet < 0) {\n return undefined;\n }\n accumulator = (accumulator << 6) | sextet;\n bitCount += 6;\n while (bitCount >= 8) {\n bitCount -= 8;\n output.push((accumulator >> bitCount) & 0xff);\n accumulator &= (1 << bitCount) - 1;\n }\n }\n return Uint8Array.from(output);\n};\n\nconst isCanonicalRsaModulus = (value: string): boolean => {\n const bytes = decodeCanonicalBase64Url(value);\n return (\n bytes !== undefined &&\n (bytes.length === 256 ||\n bytes.length === 384 ||\n bytes.length === 512) &&\n (bytes[0] ?? 0) >= 0x80 &&\n ((bytes.at(-1) ?? 0) & 1) === 1\n );\n};\n\nconst isCanonicalRsaExponent = (value: string): boolean => {\n const bytes = decodeCanonicalBase64Url(value);\n if (\n bytes === undefined ||\n bytes.length < 1 ||\n bytes.length > 4 ||\n bytes[0] === 0\n ) {\n return false;\n }\n const exponent = bytes.reduce(\n (total, byte) => total * 256 + byte,\n 0,\n );\n return exponent >= 3 && exponent % 2 === 1;\n};\n\nconst surfaceIdField = () =>\n field.string().enum(FEEDBACK_SURFACE_IDS);\n\nconst countField = () =>\n field\n .number()\n .validator((value) => Number.isSafeInteger(value))\n .min(0)\n .max(MAX_COUNT);\n\nconst positiveCountField = (maximum = MAX_COUNT) =>\n field\n .number()\n .validator((value) => Number.isSafeInteger(value))\n .min(1)\n .max(maximum);\n\nconst redactionCountField = () =>\n field\n .number()\n .validator((value) => Number.isSafeInteger(value))\n .min(0)\n .max(MAX_NARRATIVE_CHARACTERS);\n\nconst revisionField = () =>\n field\n .number()\n .validator((value) => Number.isSafeInteger(value))\n .min(0)\n .max(1_000_000);\n\nconst ratingField = () =>\n field\n .number()\n .validator((value) => Number.isInteger(value))\n .min(1)\n .max(5);\n\nconst narrativeTextField = () =>\n field\n .string()\n .validator(\n (value) =>\n typeof value === \"string\" &&\n value.length >= 1 &&\n value.length <= MAX_NARRATIVE_UTF16_CODE_UNITS &&\n !containsFeedbackUnicodeProfileUnsupportedText(value) &&\n value.normalize(\"NFKC\") === value &&\n [...value].length <= MAX_NARRATIVE_CHARACTERS &&\n !DISALLOWED_NARRATIVE_SYNTAX_PATTERN.test(value) &&\n !DISALLOWED_UNICODE_FORMAT_PATTERN.test(value) &&\n ![...value].some((character) => {\n const codePoint = character.codePointAt(0);\n return (\n codePoint !== undefined &&\n (codePoint < 32 || codePoint === 127)\n );\n }),\n )\n .min(1)\n .max(MAX_NARRATIVE_UTF16_CODE_UNITS)\n .PID({\n classification: \"high\",\n action: \"clear\",\n logHandling: \"omit\",\n purpose:\n \"transient feedback narrative that must be discarded after classification\",\n });\n\nconst transientCorrelationIdField = () =>\n field\n .string()\n .validator((value) => OPAQUE_UUID_V4_PATTERN.test(value))\n .PID({\n classification: \"low\",\n action: \"clear\",\n logHandling: \"omit\",\n purpose: \"one-use transient feedback correlation\",\n });\n\nconst transientEncryptedField = (\n minimum: number,\n maximum: number,\n allowedLengths?: readonly number[],\n) =>\n field\n .string()\n .min(minimum)\n .max(maximum)\n .pattern(BASE64URL_PATTERN)\n .validator(\n (value) => {\n const decoded = decodeCanonicalBase64Url(value);\n return (\n decoded !== undefined &&\n decoded.length > 0 &&\n (allowedLengths === undefined ||\n allowedLengths.includes(value.length))\n );\n },\n )\n .PID({\n classification: \"high\",\n action: \"clear\",\n logHandling: \"omit\",\n purpose: \"encrypted transient feedback narrative material\",\n });\n\nconst richTextNodeShape = () => ({\n type: field.string().enum([\"text\"] as const),\n text: narrativeTextField(),\n marks: field\n .array(\n field.string().enum([\"bold\", \"italic\", \"underline\"] as const),\n )\n .max(3)\n .optional(),\n});\n\nconst richTextBlockShape = () => ({\n type: field.string().enum([\"paragraph\", \"listItem\"] as const),\n depth: field\n .number()\n .validator((value) => Number.isInteger(value))\n .min(0)\n .max(4),\n listType: field.string().enum([\"bullet\"] as const).optional(),\n children: field\n .array(field.object(richTextNodeShape()))\n .min(1)\n .max(128),\n});\n\nconst nestedIdentityShape = <T extends string>(type: T) => ({\n type: field.string().enum([type] as const),\n version: field.string().enum([FEEDBACK_CONTRACT_VERSION] as const),\n});\n\nconst envelopeShape = (includeIdentity = false) => ({\n ...(includeIdentity\n ? nestedIdentityShape(\"feedback-encrypted-narrative-envelope\")\n : {}),\n schemaVersion: field.string().enum([\"1\"] as const),\n keyId: ingestionKeyIdField(),\n algorithm: field\n .string()\n .enum([\"RSA-OAEP-256+A256GCM\"] as const),\n wrappedKey: transientEncryptedField(342, 683, [342, 512, 683]),\n iv: transientEncryptedField(16, 16, [16]),\n ciphertext: transientEncryptedField(2, 49_152),\n authenticationTag: transientEncryptedField(22, 22, [22]),\n});\n\nconst analysisProjectionShape = (includeIdentity = false) => ({\n ...(includeIdentity\n ? nestedIdentityShape(\"feedback-derived-analysis\")\n : {}),\n status: field.string().enum([\"analyzed\", \"structured-only\"] as const),\n sentiment: field.string().enum(FEEDBACK_SENTIMENT_BUCKETS).optional(),\n intentIds: field\n .array(field.string().enum(FEEDBACK_INTENT_IDS))\n .max(8),\n themeIds: field\n .array(field.string().enum(FEEDBACK_THEME_IDS))\n .max(8),\n confidence: field\n .string()\n .enum([\"low\", \"medium\", \"high\"] as const)\n .optional(),\n policyVersion: field.string().enum(FEEDBACK_PRIVACY_POLICY_VERSIONS),\n modelVersion: field.string().enum(FEEDBACK_ANALYSIS_MODEL_VERSIONS),\n deterministicRedactionCount: redactionCountField(),\n scannerRedactionCount: redactionCountField(),\n});\n\nconst analysisReceiptShape = () => ({\n receiptId: transientCorrelationIdField(),\n ...analysisProjectionShape(),\n analyzedAt: field.dateTimeISO(),\n});\n\nconst isAnalysisProjectionConsistent = (\n value: Record<string, unknown>,\n): boolean => {\n const status = value.status;\n const intentIds = value.intentIds;\n const themeIds = value.themeIds;\n if (!Array.isArray(intentIds) || !Array.isArray(themeIds)) {\n return false;\n }\n if (\n new Set(intentIds).size !== intentIds.length ||\n new Set(themeIds).size !== themeIds.length\n ) {\n return false;\n }\n if (status === \"structured-only\") {\n return (\n value.sentiment === undefined &&\n value.confidence === undefined &&\n intentIds.length === 0 &&\n themeIds.length === 0\n );\n }\n return (\n status === \"analyzed\" &&\n value.sentiment !== undefined &&\n value.confidence !== undefined\n );\n};\n\nconst optionalDraftFields = () => ({\n surfaceId: surfaceIdField().optional(),\n issueType: field.string().enum(FEEDBACK_ISSUE_TYPES).optional(),\n severity: ratingField().optional(),\n satisfaction: ratingField().optional(),\n analysisReceiptId: transientCorrelationIdField().optional(),\n});\n\nconst surfaceEntryShape = () => ({\n id: surfaceIdField(),\n labelKey: safeIdField(160),\n kind: field\n .string()\n .enum([\"public\", \"authenticated\", \"admin\", \"game\"] as const),\n gameDiagnosticsEligible: field.boolean(),\n});\n\nconst areSurfacesConsistent = (surfaces: unknown): boolean => {\n if (!Array.isArray(surfaces)) {\n return false;\n }\n const surfaceIds = surfaces.map(\n (surface: { id?: unknown }) => surface.id,\n );\n return (\n new Set(surfaceIds).size === surfaceIds.length &&\n surfaces.every(\n (surface: {\n id?: unknown;\n labelKey?: unknown;\n kind?: unknown;\n gameDiagnosticsEligible?: unknown;\n }) => {\n const definition = FEEDBACK_SURFACE_DEFINITIONS.find(\n ({ id }) => id === surface.id,\n );\n return (\n definition !== undefined &&\n surface.labelKey === definition.labelKey &&\n surface.kind === definition.kind &&\n surface.gameDiagnosticsEligible ===\n definition.gameDiagnosticsEligible\n );\n },\n )\n );\n};\n\nconst isDraftShapeConsistent = (value: Record<string, unknown>): boolean => {\n const hasDirtyField =\n value.surfaceId !== undefined ||\n value.issueType !== undefined ||\n value.severity !== undefined ||\n value.satisfaction !== undefined ||\n value.analysisReceiptId !== undefined ||\n value.analysis !== undefined;\n if (!hasDirtyField) {\n return false;\n }\n if (value.kind === \"bug\") {\n return value.satisfaction === undefined;\n }\n if (value.kind === \"review\") {\n return (\n value.surfaceId === undefined &&\n value.issueType === undefined &&\n value.severity === undefined\n );\n }\n return false;\n};\n\nconst isContextConsistent = (value: Record<string, any>): boolean => {\n if (!areSurfacesConsistent(value.surfaces)) {\n return false;\n }\n if (\n value.selectedSurfaceId !== undefined &&\n !value.surfaces.some(\n (surface: { id?: unknown }) => surface.id === value.selectedSurfaceId,\n )\n ) {\n return false;\n }\n const hasProjectedSurface = value.surfaces.length > 0;\n const hasDiagnosticsSurface = value.surfaces.some(\n (surface: { gameDiagnosticsEligible?: unknown }) =>\n surface.gameDiagnosticsEligible === true,\n );\n if (\n (value.eligibility.bugReport && !hasProjectedSurface) ||\n (value.eligibility.gameDiagnostics &&\n (!value.eligibility.bugReport || !hasDiagnosticsSurface))\n ) {\n return false;\n }\n\n const generatedAt = Date.parse(String(value.generatedAt));\n if (!Number.isFinite(generatedAt)) {\n return false;\n }\n const boundedFutureAvailabilityIsValid = (\n candidate: unknown,\n maximumSeconds: number,\n ): boolean => {\n if (candidate === undefined) {\n return true;\n }\n const availableAt = Date.parse(String(candidate));\n return (\n Number.isFinite(availableAt) &&\n availableAt > generatedAt &&\n availableAt - generatedAt <= maximumSeconds * 1_000\n );\n };\n const maximumBugCooldownSeconds =\n FEEDBACK_BUG_COOLDOWN_SECONDS[\n FEEDBACK_BUG_COOLDOWN_SECONDS.length - 1\n ] ?? 0;\n if (\n !boundedFutureAvailabilityIsValid(\n value.eligibility.bugAvailableAt,\n maximumBugCooldownSeconds,\n ) ||\n !boundedFutureAvailabilityIsValid(\n value.eligibility.reviewAvailableAt,\n FEEDBACK_REVIEW_COOLDOWN_SECONDS,\n )\n ) {\n return false;\n }\n const bugAvailableAt =\n value.eligibility.bugAvailableAt === undefined\n ? undefined\n : Date.parse(String(value.eligibility.bugAvailableAt));\n const bugRetryAfterSeconds =\n value.eligibility.bugRetryAfterSeconds;\n const bugCooldownIsConsistent =\n (bugAvailableAt === undefined &&\n bugRetryAfterSeconds === undefined) ||\n (bugAvailableAt !== undefined &&\n typeof bugRetryAfterSeconds === \"number\" &&\n bugRetryAfterSeconds ===\n Math.ceil((bugAvailableAt - generatedAt) / 1_000));\n if (\n !bugCooldownIsConsistent ||\n (value.eligibility.bugReport &&\n (value.eligibility.bugAvailableAt !== undefined ||\n value.eligibility.bugRetryAfterSeconds !== undefined)) ||\n (value.eligibility.review &&\n value.eligibility.reviewAvailableAt !== undefined) ||\n (value.eligibility.bugReport && !value.flags.bugReport) ||\n (value.eligibility.review && !value.flags.review) ||\n (value.eligibility.gameDiagnostics && !value.flags.gameDiagnostics)\n ) {\n return false;\n }\n\n if (!value.flags.transientAnalysis) {\n return value.ingestionKey === undefined;\n }\n if (value.ingestionKey === undefined) {\n return false;\n }\n const expiresAt = Date.parse(String(value.ingestionKey.expiresAt));\n return (\n Number.isFinite(expiresAt) &&\n expiresAt > generatedAt &&\n expiresAt - generatedAt <= 10 * 60 * 1_000\n );\n};\n\nconst distributionShape = (\n idField: () => ReturnType<typeof safeIdField> = () => safeIdField(128),\n) => ({\n id: idField(),\n count: countField(),\n});\n\nconst hasUniqueIds = (values: unknown): boolean =>\n Array.isArray(values) &&\n new Set(\n values.map((value) =>\n typeof value === \"object\" && value !== null\n ? (value as { id?: unknown }).id\n : undefined,\n ),\n ).size === values.length;\n\nconst distributionTotal = (values: unknown): number =>\n Array.isArray(values)\n ? values.reduce(\n (total, value) =>\n total +\n (typeof value === \"object\" &&\n value !== null &&\n typeof (value as { count?: unknown }).count === \"number\"\n ? (value as { count: number }).count\n : 0),\n 0,\n )\n : 0;\n\nconst distributionCountsAtMost = (\n values: unknown,\n maximum: number,\n): boolean =>\n Array.isArray(values) &&\n values.every(\n (value) =>\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { count?: unknown }).count === \"number\" &&\n (value as { count: number }).count <= maximum,\n );\n\nconst advisoryShape = () => ({\n code: field\n .string()\n .enum(\n [\n \"severity-five\",\n \"critical-regression\",\n \"satisfaction-drop\",\n \"processor-stale\",\n ] as const,\n ),\n level: field.string().enum([\"advisory\", \"critical\"] as const),\n triggerCount: positiveCountField(),\n recommendationIds: field\n .array(\n field\n .string()\n .enum(\n [\n \"inspect-release\",\n \"verify-renderer-health\",\n \"review-top-intents\",\n \"verify-processor-health\",\n ] as const,\n ),\n )\n .min(1)\n .max(8),\n});\n\nconst orderedWindow = (\n value: Record<string, unknown>,\n durationMilliseconds: number,\n): boolean => {\n const start = Date.parse(String(value.windowStart));\n const end = Date.parse(String(value.windowEnd));\n const generatedAt = Date.parse(String(value.generatedAt));\n return (\n Number.isFinite(start) &&\n Number.isFinite(end) &&\n Number.isFinite(generatedAt) &&\n new Date(start).toISOString() === value.windowStart &&\n new Date(end).toISOString() === value.windowEnd &&\n start % durationMilliseconds === 0 &&\n end - start === durationMilliseconds &&\n generatedAt >= end\n );\n};\n\ntype FeedbackProcessor =\n | \"bug-hourly\"\n | \"review-daily\"\n | \"commit-reconciliation\";\n\nconst processorWindow = (\n processor: FeedbackProcessor,\n windowKey: string,\n): { start: number; duration: number } | undefined => {\n let iso: string;\n let expectedLength: number;\n let duration: number;\n if (processor === \"bug-hourly\") {\n if (!BUG_HOUR_WINDOW_PATTERN.test(windowKey)) {\n return undefined;\n }\n iso = `${windowKey}:00:00.000Z`;\n expectedLength = 13;\n duration = 60 * 60 * 1_000;\n } else if (processor === \"review-daily\") {\n if (!REVIEW_DAY_WINDOW_PATTERN.test(windowKey)) {\n return undefined;\n }\n iso = `${windowKey}T00:00:00.000Z`;\n expectedLength = 10;\n duration = 24 * 60 * 60 * 1_000;\n } else {\n if (!RECONCILIATION_WINDOW_PATTERN.test(windowKey)) {\n return undefined;\n }\n const minute = Number(windowKey.slice(-2));\n if (minute % 5 !== 0) {\n return undefined;\n }\n iso = `${windowKey}:00.000Z`;\n expectedLength = 16;\n duration = 5 * 60 * 1_000;\n }\n const start = Date.parse(iso);\n if (\n !Number.isFinite(start) ||\n new Date(start).toISOString().slice(0, expectedLength) !== windowKey\n ) {\n return undefined;\n }\n return { start, duration };\n};\n\nconst isProcessorArtifactConsistent = (\n value: Record<string, unknown>,\n artifact: \"checkpoint\" | \"manifest\",\n): boolean => {\n const processor = value.processor as FeedbackProcessor;\n const windowKey = String(value.windowKey);\n const window = processorWindow(processor, windowKey);\n if (window === undefined) {\n return false;\n }\n const completedAt = Date.parse(\n String(\n artifact === \"checkpoint\" ? value.completedAt : value.generatedAt,\n ),\n );\n if (\n !Number.isFinite(completedAt) ||\n completedAt < window.start + window.duration\n ) {\n return false;\n }\n if (\n artifact === \"checkpoint\" &&\n value.checkpointId !==\n `checkpoint:${processor}:${windowKey}`\n ) {\n return false;\n }\n return true;\n};\n\nconst roundRate = (value: number): number =>\n Math.round((value + Number.EPSILON) * 1_000_000) / 1_000_000;\n\nconst rateMatches = (actual: unknown, expected: number): boolean =>\n typeof actual === \"number\" && actual === roundRate(expected);\n\nconst distributionCountFor = (values: unknown, id: string): number => {\n if (!Array.isArray(values)) {\n return 0;\n }\n const entry = values.find(\n (value) =>\n typeof value === \"object\" &&\n value !== null &&\n (value as { id?: unknown }).id === id,\n );\n return typeof entry === \"object\" &&\n entry !== null &&\n typeof (entry as { count?: unknown }).count === \"number\"\n ? (entry as { count: number }).count\n : 0;\n};\n\ntype FeedbackAdvisoryCode =\n | \"severity-five\"\n | \"critical-regression\"\n | \"satisfaction-drop\"\n | \"processor-stale\";\n\ninterface FeedbackAdvisoryExpectation {\n level: \"advisory\" | \"critical\";\n triggerCount: number;\n recommendationIds: readonly (\n | \"inspect-release\"\n | \"verify-renderer-health\"\n | \"review-top-intents\"\n | \"verify-processor-health\"\n )[];\n}\n\nconst advisoryCodesAreConsistent = (\n advisories: unknown,\n expected: Readonly<\n Partial<Record<FeedbackAdvisoryCode, FeedbackAdvisoryExpectation>>\n >,\n): boolean => {\n if (!Array.isArray(advisories)) {\n return false;\n }\n const expectedCodes = Object.entries(expected)\n .filter((entry): entry is [string, FeedbackAdvisoryExpectation] =>\n entry[1] !== undefined,\n )\n .map(([code]) => code);\n const codes = advisories.map(\n (advisory) =>\n (advisory as { code?: unknown } | null)?.code,\n );\n return (\n new Set(codes).size === codes.length &&\n codes.every(\n (code) =>\n typeof code === \"string\" &&\n expectedCodes.includes(code),\n ) &&\n codes.length === expectedCodes.length &&\n expectedCodes.every((code) => codes.includes(code)) &&\n advisories.every((advisory) => {\n const value = advisory as {\n code?: unknown;\n level?: unknown;\n triggerCount?: unknown;\n recommendationIds?: unknown;\n };\n const code =\n typeof value.code === \"string\"\n ? (value.code as FeedbackAdvisoryCode)\n : undefined;\n const expectation = code === undefined ? undefined : expected[code];\n if (\n expectation === undefined ||\n value.level !== expectation.level ||\n value.triggerCount !== expectation.triggerCount ||\n !Array.isArray(value.recommendationIds) ||\n value.recommendationIds.length !==\n expectation.recommendationIds.length\n ) {\n return false;\n }\n return value.recommendationIds.every(\n (recommendation, index) =>\n recommendation === expectation.recommendationIds[index],\n );\n })\n );\n};\n\n/** AST used only inside the transient no-retention narrative scanner. */\nexport const FeedbackRichTextAstSchema = createSchema(\n {\n schemaVersion: field.string().enum([\"1\"] as const),\n children: field\n .array(field.object(richTextBlockShape()))\n .min(1)\n .max(128),\n },\n \"doc\",\n {\n ...strictOptions,\n schemaValidator: (value) => {\n const blocks = Array.isArray(value.children) ? value.children : [];\n const blocksAreConsistent = blocks.every(\n (block: {\n type?: unknown;\n listType?: unknown;\n children?: Array<{ marks?: unknown }>;\n }) => {\n const listShapeIsValid =\n (block.type === \"paragraph\" && block.listType === undefined) ||\n (block.type === \"listItem\" && block.listType === \"bullet\");\n const marksAreUnique =\n Array.isArray(block.children) &&\n block.children.every(\n (child) =>\n child.marks === undefined ||\n (Array.isArray(child.marks) &&\n new Set(child.marks).size === child.marks.length),\n );\n return listShapeIsValid && marksAreUnique;\n },\n );\n const characterCount = blocks.reduce(\n (blockTotal: number, block: { children?: unknown }) =>\n blockTotal +\n (Array.isArray(block.children)\n ? block.children.reduce(\n (nodeTotal: number, node: { text?: unknown }) =>\n nodeTotal +\n (typeof node.text === \"string\"\n ? [...node.text].length\n : 0),\n 0,\n )\n : 0),\n 0,\n );\n const extractedCharacterCount =\n characterCount + Math.max(0, blocks.length - 1);\n const nodeCount = blocks.reduce(\n (total: number, block: { children?: unknown }) =>\n total + (Array.isArray(block.children) ? block.children.length : 0),\n 0,\n );\n return (\n value.type === \"doc\" &&\n value.schemaVersion === \"1\" &&\n blocksAreConsistent &&\n nodeCount <= 256 &&\n extractedCharacterCount > 0 &&\n extractedCharacterCount <= MAX_NARRATIVE_CHARACTERS\n );\n },\n },\n);\n\n/** Encrypted outer envelope accepted by privacy-specific middleware. */\nexport const FeedbackEncryptedNarrativeEnvelopeSchema = createSchema(\n envelopeShape(),\n \"feedback-encrypted-narrative-envelope\",\n strictOptions,\n);\n\n/** Transient scanner request; this contract must never be stored or logged. */\nexport const FeedbackTransientAnalysisRequestSchema = createSchema(\n {\n schemaVersion: field.string().enum([\"1\"] as const),\n requestId: transientCorrelationIdField(),\n purpose: field.string().enum([\"bug\", \"review\"] as const),\n surfaceId: surfaceIdField().optional(),\n deterministicRedactionCount: redactionCountField(),\n envelope: field.object(envelopeShape(true)),\n },\n \"feedback-transient-analysis-request\",\n {\n ...strictOptions,\n schemaValidator: (value, context) => {\n const surfaceWasProvided =\n context?.wasProvided(\"surfaceId\") ??\n Object.prototype.hasOwnProperty.call(value, \"surfaceId\");\n return (\n (value.purpose === \"bug\" && value.surfaceId !== undefined) ||\n (value.purpose === \"review\" && !surfaceWasProvided)\n );\n },\n },\n);\n\n/**\n * Validate and clone a transient request while preserving its purpose\n * discriminator for TypeScript consumers.\n */\nexport const validateFeedbackTransientAnalysisRequest = (\n input: unknown,\n): FeedbackTransientAnalysisRequestValidationResult => {\n const result = FeedbackTransientAnalysisRequestSchema.validate(input);\n if (!result.valid || result.value === undefined) {\n return {\n valid: false,\n errors: result.errors ?? [\"Transient analysis validation failed.\"],\n ...(result.issues === undefined ? {} : { issues: result.issues }),\n };\n }\n return {\n valid: true,\n value: result.value as unknown as FeedbackTransientAnalysisRequest,\n };\n};\n\n/** Identifier-free, closed classifier output safe to copy into a packet. */\nexport const FeedbackAnalysisReceiptSchema = createSchema(\n analysisReceiptShape(),\n \"feedback-analysis-receipt\",\n {\n ...strictOptions,\n schemaValidator: (value) =>\n value.status === \"analyzed\" &&\n isAnalysisProjectionConsistent(value),\n },\n);\n\n/**\n * Persistable classifier projection. Unlike the transient receipt it contains\n * no receipt identifier or scanner timestamp that could enable cross-boundary\n * joining.\n */\nexport const FeedbackDerivedAnalysisSchema = createSchema(\n analysisProjectionShape(),\n \"feedback-derived-analysis\",\n {\n ...strictOptions,\n schemaValidator: isAnalysisProjectionConsistent,\n },\n);\n\n/** Capability-filtered surface catalog with no hidden entitlement metadata. */\nexport const FeedbackSurfaceCatalogSchema = createSchema(\n {\n generatedAt: field.dateTimeISO(),\n catalogVersion: safeIdField(64),\n surfaces: field\n .array(field.object(surfaceEntryShape()))\n .max(256),\n },\n \"feedback-surface-catalog\",\n {\n ...strictOptions,\n schemaValidator: (value) => areSurfacesConsistent(value.surfaces),\n },\n);\n\n/** Capability-filtered surface catalog and effective feedback eligibility. */\nexport const FeedbackContextSchema = createSchema(\n {\n generatedAt: field.dateTimeISO(),\n catalogVersion: safeIdField(64),\n surfaces: field\n .array(field.object(surfaceEntryShape()))\n .max(256),\n selectedSurfaceId: surfaceIdField().optional(),\n flags: field.object({\n bugReport: field.boolean(),\n review: field.boolean(),\n transientAnalysis: field.boolean(),\n reporting: field.boolean(),\n admin: field.boolean(),\n mcp: field.boolean(),\n publicHonesty: field.boolean(),\n gameDiagnostics: field.boolean(),\n anonymous: field.boolean(),\n }),\n eligibility: field.object({\n bugReport: field.boolean(),\n review: field.boolean(),\n gameDiagnostics: field.boolean(),\n bugAvailableAt: field.dateTimeISO().optional(),\n reviewAvailableAt: field.dateTimeISO().optional(),\n bugRetryAfterSeconds: positiveCountField().optional(),\n }),\n ingestionKey: field\n .object({\n keyId: ingestionKeyIdField(),\n algorithm: field.string().enum([\"RSA-OAEP-256\"] as const),\n publicJwk: field.object({\n kty: field.string().enum([\"RSA\"] as const),\n alg: field.string().enum([\"RSA-OAEP-256\"] as const),\n use: field.string().enum([\"enc\"] as const),\n key_ops: field\n .array(field.string().enum([\"wrapKey\"] as const))\n .min(1)\n .max(1),\n n: field\n .string()\n .min(342)\n .max(683)\n .pattern(BASE64URL_PATTERN)\n .validator(isCanonicalRsaModulus),\n e: field\n .string()\n .min(2)\n .max(6)\n .pattern(BASE64URL_PATTERN)\n .validator(isCanonicalRsaExponent),\n ext: field.boolean().validator((value) => value === true),\n }),\n expiresAt: field.dateTimeISO(),\n })\n .optional(),\n },\n \"feedback-context\",\n {\n ...strictOptions,\n schemaValidator: isContextConsistent,\n },\n);\n\n/** Dirty structured fields sent by focus-loss autosave. */\nexport const FeedbackDraftUpsertRequestSchema = createSchema(\n {\n draftId: draftIdField(),\n kind: field.string().enum([\"bug\", \"review\"] as const),\n revision: revisionField(),\n ...optionalDraftFields(),\n },\n \"feedback-draft-upsert-request\",\n {\n ...strictOptions,\n schemaValidator: isDraftShapeConsistent,\n },\n);\n\n/** Short-lived structured draft packet; narrative and ciphertext are excluded. */\nexport const FeedbackDraftPacketSchema = createSchema(\n {\n draftId: draftIdField(),\n kind: field.string().enum([\"bug\", \"review\"] as const),\n revision: revisionField(),\n surfaceId: surfaceIdField().optional(),\n issueType: field.string().enum(FEEDBACK_ISSUE_TYPES).optional(),\n severity: ratingField().optional(),\n satisfaction: ratingField().optional(),\n analysis: field.object(analysisProjectionShape(true)).optional(),\n serverUpdatedAt: field.dateTimeISO(),\n expiresAt: field.dateTimeISO(),\n },\n \"feedback-draft-packet\",\n {\n ...strictOptions,\n schemaValidator: (value) => {\n if (!isDraftShapeConsistent(value)) {\n return false;\n }\n if (\n value.analysis !== undefined &&\n !isAnalysisProjectionConsistent(value.analysis)\n ) {\n return false;\n }\n const updatedAt = Date.parse(String(value.serverUpdatedAt));\n const expiresAt = Date.parse(String(value.expiresAt));\n return (\n Number.isFinite(updatedAt) &&\n Number.isFinite(expiresAt) &&\n expiresAt > updatedAt &&\n expiresAt - updatedAt <= 24 * 60 * 60 * 1_000\n );\n },\n },\n);\n\n/** ETag-external response after a structured draft is durably saved. */\nexport const FeedbackDraftReceiptSchema = createSchema(\n {\n draftId: draftIdField(),\n revision: revisionField(),\n savedAt: field.dateTimeISO(),\n expiresAt: field.dateTimeISO(),\n },\n \"feedback-draft-receipt\",\n {\n ...strictOptions,\n schemaValidator: (value) => {\n const savedAt = Date.parse(String(value.savedAt));\n const expiresAt = Date.parse(String(value.expiresAt));\n return (\n Number.isFinite(savedAt) &&\n Number.isFinite(expiresAt) &&\n expiresAt > savedAt &&\n expiresAt - savedAt <= 24 * 60 * 60 * 1_000\n );\n },\n },\n);\n\n/**\n * Explicit final bug submission request. Transport idempotency belongs only\n * in the HTTP Idempotency-Key header and is not part of this JSON contract.\n */\nexport const FeedbackBugSubmissionRequestSchema = createSchema(\n {\n draftId: draftIdField().optional(),\n surfaceId: surfaceIdField(),\n issueType: field.string().enum(FEEDBACK_ISSUE_TYPES),\n severity: ratingField(),\n analysisReceiptId: transientCorrelationIdField().optional(),\n gameDiagnostics: field.object(gameDiagnosticsShape(true)).optional(),\n },\n \"feedback-bug-submission-request\",\n {\n ...strictOptions,\n schemaValidator: (value) =>\n value.issueType !== \"privacy-security\" &&\n (value.gameDiagnostics === undefined ||\n (isGameDiagnosticsConsistent(value.gameDiagnostics) &&\n value.gameDiagnostics.surfaceId === value.surfaceId)),\n },\n);\n\n/**\n * Explicit authenticated satisfaction-review submission request. Transport\n * idempotency belongs only in the HTTP Idempotency-Key header.\n */\nexport const FeedbackReviewSubmissionRequestSchema = createSchema(\n {\n draftId: draftIdField().optional(),\n satisfaction: ratingField(),\n analysisReceiptId: transientCorrelationIdField().optional(),\n },\n \"feedback-review-submission-request\",\n strictOptions,\n);\n\n/** Identifier-free response after an immutable packet is accepted. */\nexport const FeedbackAcceptanceReceiptSchema = createSchema(\n {\n packetId: uuidField(),\n kind: field.string().enum([\"bug\", \"review\"] as const),\n acceptedAt: field.dateTimeISO(),\n nextEligibleAt: field.dateTimeISO(),\n },\n \"feedback-acceptance-receipt\",\n {\n ...strictOptions,\n schemaValidator: (value) => {\n const acceptedAt = Date.parse(String(value.acceptedAt));\n const nextEligibleAt = Date.parse(String(value.nextEligibleAt));\n const cooldownMilliseconds = nextEligibleAt - acceptedAt;\n if (\n !Number.isFinite(acceptedAt) ||\n !Number.isFinite(nextEligibleAt) ||\n cooldownMilliseconds <= 0 ||\n cooldownMilliseconds % 1_000 !== 0\n ) {\n return false;\n }\n const cooldownSeconds = cooldownMilliseconds / 1_000;\n return value.kind === \"review\"\n ? cooldownSeconds === FEEDBACK_REVIEW_COOLDOWN_SECONDS\n : (FEEDBACK_BUG_COOLDOWN_SECONDS as readonly number[]).includes(\n cooldownSeconds,\n );\n },\n },\n);\n\n/** Safe analysis fallback; it contains neither a receipt nor narrative. */\nexport const FeedbackStructuredOnlyAnalysisResultSchema = createSchema(\n {\n status: field.string().enum([\"structured-only-required\"] as const),\n reasonCode: field.string().enum(FEEDBACK_STRUCTURED_ONLY_REASON_CODES),\n },\n \"feedback-structured-only-analysis-result\",\n strictOptions,\n);\n\n/** Immutable structured bug packet for private blob storage. */\nexport const FeedbackBugPacketSchema = createSchema(\n {\n packetId: uuidField(),\n acceptedAt: field.dateTimeISO(),\n surfaceId: surfaceIdField(),\n issueType: field.string().enum(FEEDBACK_PERSISTABLE_ISSUE_TYPES),\n severity: ratingField(),\n releaseId: safeIdField(128),\n buildId: safeIdField(128),\n analysis: field.object(analysisProjectionShape(true)).optional(),\n gameDiagnostics: field.object(gameDiagnosticsShape(true)).optional(),\n },\n \"feedback-bug-packet\",\n {\n ...strictOptions,\n schemaValidator: (value) =>\n (value.analysis === undefined ||\n isAnalysisProjectionConsistent(value.analysis)) &&\n (value.gameDiagnostics === undefined ||\n (isGameDiagnosticsConsistent(value.gameDiagnostics) &&\n value.gameDiagnostics.surfaceId === value.surfaceId)),\n },\n);\n\n/** Immutable structured review packet for private blob storage. */\nexport const FeedbackReviewPacketSchema = createSchema(\n {\n packetId: uuidField(),\n acceptedAt: field.dateTimeISO(),\n satisfaction: ratingField(),\n analysis: field.object(analysisProjectionShape(true)).optional(),\n },\n \"feedback-review-packet\",\n {\n ...strictOptions,\n schemaValidator: (value) =>\n value.analysis === undefined ||\n isAnalysisProjectionConsistent(value.analysis),\n },\n);\n\n/**\n * Immutable proof that a structured packet completed the control-plane commit.\n * The schema deliberately excludes correlation, request, locator, and content\n * metadata so report materializers can retain it without retaining an actor.\n */\nexport const FeedbackCommittedAcceptanceEvidenceSchema = createSchema(\n {\n packetId: uuidField(),\n packetKind: field.string().enum([\"bug\", \"review\"] as const),\n acceptedAt: canonicalServerUtcField(),\n },\n \"feedback-committed-acceptance-evidence\",\n strictOptions,\n);\n\n/**\n * Immutable identifier-free input for one exact UTC bug-health hour.\n *\n * The trusted producer owns the deterministic projection identifier. The\n * schema validates its canonical UUID representation while consumers bind it\n * to the requested window before using the projection.\n */\nexport const FeedbackBugHealthMetricsProjectionSchema = createSchema(\n {\n projectionId: uuidField(),\n windowStart: canonicalServerUtcField(),\n windowEnd: canonicalServerUtcField(),\n observedAt: canonicalServerUtcField(),\n finalized: field.boolean().validator((value) => value === true),\n rejectedCount: countField(),\n trafficDenominator: countField(),\n abuseBlockBands: field\n .array(\n field.object({\n id: field.string().enum(FEEDBACK_ABUSE_BLOCK_BANDS),\n count: positiveCountField(),\n }),\n )\n .max(FEEDBACK_ABUSE_BLOCK_BANDS.length),\n },\n \"feedback-bug-health-metrics-projection\",\n {\n ...strictOptions,\n schemaValidator: (value) => {\n const blockBands = value.abuseBlockBands as readonly FeedbackAbuseBlockBucket[];\n let previousIndex = -1;\n const canonicalBands = blockBands.every((bucket) => {\n const index = FEEDBACK_ABUSE_BLOCK_BANDS.indexOf(bucket.id);\n if (index <= previousIndex) {\n return false;\n }\n previousIndex = index;\n return true;\n });\n\n return (\n orderedWindow(\n { ...value, generatedAt: value.observedAt },\n 60 * 60 * 1_000,\n ) &&\n Date.parse(String(value.observedAt)) >=\n Date.parse(String(value.windowEnd)) &&\n canonicalBands\n );\n },\n },\n);\n\n/** Safe facts used to reconstruct a representative in-game view server-side. */\nexport const FeedbackGameReconstructionManifestSchema = createSchema(\n {\n reconstructionId: uuidField(),\n bugPacketId: uuidField(),\n createdAt: field.dateTimeISO(),\n expiresAt: field.dateTimeISO(),\n curatedAssetSetId: safeIdField(128),\n noticeKey: safeIdField(160),\n diagnostics: field.object(gameDiagnosticsShape(true)),\n },\n \"feedback-game-reconstruction-manifest\",\n {\n ...strictOptions,\n schemaValidator: (value) => {\n const createdAt = Date.parse(String(value.createdAt));\n const expiresAt = Date.parse(String(value.expiresAt));\n return (\n isGameDiagnosticsConsistent(value.diagnostics) &&\n Number.isFinite(createdAt) &&\n Number.isFinite(expiresAt) &&\n expiresAt > createdAt &&\n expiresAt - createdAt <= 30 * 24 * 60 * 60 * 1_000\n );\n },\n },\n);\n\n/** Materialized report for one previous UTC bug-health hour. */\nexport const FeedbackHourlyBugReportSchema = createSchema(\n {\n reportId: uuidField(),\n windowStart: field.dateTimeISO(),\n windowEnd: field.dateTimeISO(),\n revision: revisionField(),\n generatedAt: field.dateTimeISO(),\n acceptedCount: countField(),\n rejectedCount: countField(),\n diagnosticsAttachedCount: countField(),\n deterministicRedactionCount: countField(),\n scannerRedactionCount: countField(),\n processorLagSeconds: countField(),\n rates: field.object({\n rejectionRate: field.number().min(0).max(1),\n deterministicRedactionsPerAccepted: field.number().min(0).max(4_000),\n scannerRedactionsPerAccepted: field.number().min(0).max(4_000),\n }),\n traffic: field.object({\n denominator: countField(),\n acceptedPerTenThousand: field\n .number()\n .min(0)\n .max(MAX_COUNT)\n .optional(),\n }),\n targetDistribution: field\n .array(field.object(distributionShape(surfaceIdField)))\n .max(256),\n issueTypeDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_PERSISTABLE_ISSUE_TYPES),\n ),\n ),\n )\n .max(FEEDBACK_ISSUE_TYPES.length),\n severityDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum([\"1\", \"2\", \"3\", \"4\", \"5\"] as const),\n ),\n ),\n )\n .max(5),\n intentDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_INTENT_IDS),\n ),\n ),\n )\n .max(FEEDBACK_INTENT_IDS.length),\n buildDistribution: field\n .array(field.object(distributionShape()))\n .max(128),\n rendererDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_RENDERER_BUCKETS),\n ),\n ),\n )\n .max(FEEDBACK_RENDERER_BUCKETS.length),\n backendDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_BACKEND_BUCKETS),\n ),\n ),\n )\n .max(FEEDBACK_BACKEND_BUCKETS.length),\n viewportDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_VIEWPORT_BUCKETS),\n ),\n ),\n )\n .max(FEEDBACK_VIEWPORT_BUCKETS.length),\n frameRateDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_FRAME_RATE_BUCKETS),\n ),\n ),\n )\n .max(FEEDBACK_FRAME_RATE_BUCKETS.length),\n frameTimeDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_FRAME_TIME_BUCKETS),\n ),\n ),\n )\n .max(FEEDBACK_FRAME_TIME_BUCKETS.length),\n diagnosticFeatureDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_GAME_FEATURE_IDS),\n ),\n ),\n )\n .max(FEEDBACK_GAME_FEATURE_IDS.length),\n diagnosticCounterDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_GAME_COUNTER_CODES),\n ),\n ),\n )\n .max(FEEDBACK_GAME_COUNTER_CODES.length),\n diagnosticErrorDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_GAME_ERROR_CODES),\n ),\n ),\n )\n .max(FEEDBACK_GAME_ERROR_CODES.length),\n abuseBlockBands: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_ABUSE_BLOCK_BANDS),\n ),\n ),\n )\n .max(FEEDBACK_ABUSE_BLOCK_BANDS.length),\n comparison: field.object({\n previousHourRatio: field.number().min(0).max(1_000),\n sevenDaySameHourRatio: field.number().min(0).max(1_000),\n }),\n advisories: field.array(field.object(advisoryShape())).max(32),\n },\n \"feedback-hourly-bug-report\",\n {\n ...strictOptions,\n schemaValidator: (value) => {\n const distributions = [\n value.targetDistribution,\n value.issueTypeDistribution,\n value.severityDistribution,\n value.intentDistribution,\n value.buildDistribution,\n value.rendererDistribution,\n value.backendDistribution,\n value.viewportDistribution,\n value.frameRateDistribution,\n value.frameTimeDistribution,\n value.diagnosticFeatureDistribution,\n value.diagnosticCounterDistribution,\n value.diagnosticErrorDistribution,\n value.abuseBlockBands,\n ];\n const submittedCount = value.acceptedCount + value.rejectedCount;\n const expectedRejectionRate =\n submittedCount === 0 ? 0 : value.rejectedCount / submittedCount;\n const expectedDeterministicRate =\n value.acceptedCount === 0\n ? 0\n : value.deterministicRedactionCount / value.acceptedCount;\n const expectedScannerRate =\n value.acceptedCount === 0\n ? 0\n : value.scannerRedactionCount / value.acceptedCount;\n const trafficIsConsistent =\n (value.traffic.denominator === 0 &&\n value.traffic.acceptedPerTenThousand === undefined) ||\n (value.traffic.denominator > 0 &&\n rateMatches(\n value.traffic.acceptedPerTenThousand,\n (value.acceptedCount * 10_000) / value.traffic.denominator,\n ));\n const severityFiveCount = distributionCountFor(\n value.severityDistribution,\n \"5\",\n );\n const criticalRegression =\n severityFiveCount >= 3 ||\n (value.acceptedCount >= 5 &&\n value.comparison.sevenDaySameHourRatio >= 3);\n const lagSeconds = Math.floor(\n (Date.parse(String(value.generatedAt)) -\n Date.parse(String(value.windowEnd))) /\n 1_000,\n );\n return (\n orderedWindow(value, 60 * 60 * 1_000) &&\n value.revision >= 1 &&\n value.processorLagSeconds === lagSeconds &&\n value.diagnosticsAttachedCount <= value.acceptedCount &&\n (value.acceptedCount > 0 ||\n (value.deterministicRedactionCount === 0 &&\n value.scannerRedactionCount === 0)) &&\n rateMatches(value.rates.rejectionRate, expectedRejectionRate) &&\n rateMatches(\n value.rates.deterministicRedactionsPerAccepted,\n expectedDeterministicRate,\n ) &&\n rateMatches(\n value.rates.scannerRedactionsPerAccepted,\n expectedScannerRate,\n ) &&\n trafficIsConsistent &&\n distributions.every(hasUniqueIds) &&\n advisoryCodesAreConsistent(value.advisories, {\n \"severity-five\":\n severityFiveCount > 0\n ? {\n level: \"advisory\",\n triggerCount: severityFiveCount,\n recommendationIds: [\"inspect-release\"],\n }\n : undefined,\n \"critical-regression\": criticalRegression\n ? {\n level: \"critical\",\n triggerCount:\n severityFiveCount >= 3\n ? severityFiveCount\n : value.acceptedCount,\n recommendationIds: [\n \"inspect-release\",\n \"verify-renderer-health\",\n ],\n }\n : undefined,\n \"processor-stale\":\n lagSeconds > 10 * 60\n ? {\n level: \"critical\",\n triggerCount: lagSeconds,\n recommendationIds: [\"verify-processor-health\"],\n }\n : undefined,\n }) &&\n distributionTotal(value.targetDistribution) === value.acceptedCount &&\n distributionTotal(value.issueTypeDistribution) ===\n value.acceptedCount &&\n distributionTotal(value.severityDistribution) ===\n value.acceptedCount &&\n distributionCountsAtMost(\n value.intentDistribution,\n value.acceptedCount,\n ) &&\n distributionTotal(value.intentDistribution) <=\n value.acceptedCount * 8 &&\n distributionTotal(value.buildDistribution) === value.acceptedCount &&\n distributionTotal(value.rendererDistribution) ===\n value.diagnosticsAttachedCount &&\n distributionTotal(value.backendDistribution) ===\n value.diagnosticsAttachedCount &&\n distributionTotal(value.viewportDistribution) ===\n value.diagnosticsAttachedCount &&\n distributionTotal(value.frameRateDistribution) ===\n value.diagnosticsAttachedCount &&\n distributionTotal(value.frameTimeDistribution) ===\n value.diagnosticsAttachedCount &&\n distributionTotal(value.diagnosticFeatureDistribution) <=\n value.diagnosticsAttachedCount * FEEDBACK_GAME_FEATURE_IDS.length &&\n distributionCountsAtMost(\n value.diagnosticFeatureDistribution,\n value.diagnosticsAttachedCount,\n ) &&\n distributionTotal(value.diagnosticCounterDistribution) <=\n value.diagnosticsAttachedCount *\n FEEDBACK_GAME_COUNTER_CODES.length *\n 10_000 &&\n distributionCountsAtMost(\n value.diagnosticCounterDistribution,\n value.diagnosticsAttachedCount * 10_000,\n ) &&\n distributionTotal(value.diagnosticErrorDistribution) <=\n value.diagnosticsAttachedCount *\n FEEDBACK_GAME_ERROR_CODES.length &&\n distributionCountsAtMost(\n value.diagnosticErrorDistribution,\n value.diagnosticsAttachedCount,\n )\n );\n },\n },\n);\n\nconst rollingSatisfactionShape = () => ({\n period: field.string().enum([\"7-days\", \"30-days\", \"90-days\"] as const),\n reviewCount: countField(),\n meanStars: field.number().min(1).max(5).optional(),\n});\n\nconst satisfactionStatistics = (\n distribution: unknown,\n total: number,\n): { mean: number; median: number } | undefined => {\n if (!Array.isArray(distribution) || total <= 0) {\n return undefined;\n }\n const counts = [1, 2, 3, 4, 5].map((star) =>\n distributionCountFor(distribution, String(star)),\n );\n const weightedTotal = counts.reduce(\n (sum, count, index) => sum + count * (index + 1),\n 0,\n );\n const valueAtPosition = (position: number): number => {\n let cumulative = 0;\n for (let index = 0; index < counts.length; index += 1) {\n cumulative += counts[index] ?? 0;\n if (cumulative >= position) {\n return index + 1;\n }\n }\n return 5;\n };\n const lower = valueAtPosition(Math.ceil(total / 2));\n const upper = valueAtPosition(Math.floor(total / 2) + 1);\n return {\n mean: Math.round((weightedTotal / total) * 10) / 10,\n median: (lower + upper) / 2,\n };\n};\n\n/** Materialized daily satisfaction report. */\nexport const FeedbackDailySatisfactionReportSchema = createSchema(\n {\n reportId: uuidField(),\n windowStart: field.dateTimeISO(),\n windowEnd: field.dateTimeISO(),\n revision: revisionField(),\n generatedAt: field.dateTimeISO(),\n processorLagSeconds: countField(),\n acceptedReviewCount: countField(),\n meanStars: field.number().min(1).max(5).optional(),\n medianStars: field.number().min(1).max(5).optional(),\n starDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum([\"1\", \"2\", \"3\", \"4\", \"5\"] as const),\n ),\n ),\n )\n .max(5),\n sentimentDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_SENTIMENT_BUCKETS),\n ),\n ),\n )\n .max(FEEDBACK_SENTIMENT_BUCKETS.length),\n intentDistribution: field\n .array(\n field.object(\n distributionShape(() =>\n field.string().enum(FEEDBACK_INTENT_IDS),\n ),\n ),\n )\n .max(FEEDBACK_INTENT_IDS.length),\n rollingWindows: field\n .array(field.object(rollingSatisfactionShape()))\n .max(3),\n previousPeriodDeltaStars: field.number().min(-4).max(4).optional(),\n advisories: field.array(field.object(advisoryShape())).max(32),\n },\n \"feedback-daily-satisfaction-report\",\n {\n ...strictOptions,\n schemaValidator: (value) => {\n if (!orderedWindow(value, 24 * 60 * 60 * 1_000)) {\n return false;\n }\n if (\n value.acceptedReviewCount === 0 &&\n (value.meanStars !== undefined || value.medianStars !== undefined)\n ) {\n return false;\n }\n if (\n value.acceptedReviewCount > 0 &&\n (value.meanStars === undefined || value.medianStars === undefined)\n ) {\n return false;\n }\n const distributions = [\n value.starDistribution,\n value.sentimentDistribution,\n value.intentDistribution,\n ];\n const periods = value.rollingWindows.map(\n (window: { period: string }) => window.period,\n );\n const sevenDayWindow = value.rollingWindows.find(\n (window: { period: string }) => window.period === \"7-days\",\n );\n const thirtyDayWindow = value.rollingWindows.find(\n (window: { period: string }) => window.period === \"30-days\",\n );\n const ninetyDayWindow = value.rollingWindows.find(\n (window: { period: string }) => window.period === \"90-days\",\n );\n if (\n sevenDayWindow === undefined ||\n thirtyDayWindow === undefined ||\n ninetyDayWindow === undefined\n ) {\n return false;\n }\n const statistics = satisfactionStatistics(\n value.starDistribution,\n value.acceptedReviewCount,\n );\n const lagSeconds = Math.floor(\n (Date.parse(String(value.generatedAt)) -\n Date.parse(String(value.windowEnd))) /\n 1_000,\n );\n const satisfactionDrop =\n sevenDayWindow.reviewCount >= 20 &&\n typeof value.previousPeriodDeltaStars === \"number\" &&\n value.previousPeriodDeltaStars <= -0.3;\n return (\n value.revision >= 1 &&\n value.processorLagSeconds === lagSeconds &&\n distributions.every(hasUniqueIds) &&\n distributionTotal(value.starDistribution) ===\n value.acceptedReviewCount &&\n distributionTotal(value.sentimentDistribution) <=\n value.acceptedReviewCount &&\n distributionCountsAtMost(\n value.sentimentDistribution,\n value.acceptedReviewCount,\n ) &&\n distributionTotal(value.intentDistribution) <=\n value.acceptedReviewCount * 8 &&\n distributionCountsAtMost(\n value.intentDistribution,\n value.acceptedReviewCount,\n ) &&\n periods.length === 3 &&\n new Set(periods).size === 3 &&\n ((statistics === undefined &&\n value.meanStars === undefined &&\n value.medianStars === undefined) ||\n (statistics !== undefined &&\n value.meanStars === statistics.mean &&\n value.medianStars === statistics.median)) &&\n advisoryCodesAreConsistent(value.advisories, {\n \"satisfaction-drop\": satisfactionDrop\n ? {\n level: \"advisory\",\n triggerCount: sevenDayWindow.reviewCount,\n recommendationIds: [\"review-top-intents\"],\n }\n : undefined,\n \"processor-stale\":\n lagSeconds > 2.5 * 60 * 60\n ? {\n level: \"critical\",\n triggerCount: lagSeconds,\n recommendationIds: [\"verify-processor-health\"],\n }\n : undefined,\n }) &&\n value.rollingWindows.every(\n (window: { reviewCount: number; meanStars?: number }) =>\n (window.reviewCount === 0 && window.meanStars === undefined) ||\n (window.reviewCount > 0 && window.meanStars !== undefined),\n ) &&\n value.acceptedReviewCount <= sevenDayWindow.reviewCount &&\n sevenDayWindow.reviewCount <= thirtyDayWindow.reviewCount &&\n thirtyDayWindow.reviewCount <= ninetyDayWindow.reviewCount\n );\n },\n },\n);\n\nconst publicWeeklyPointShape = () => ({\n weekStart: field.dateTimeISO(),\n state: field.string().enum([\"published\", \"suppressed\"] as const),\n acceptedReviewCount: positiveCountField().optional(),\n averageStars: field.number().min(1).max(5).optional(),\n});\n\nconst publicComparisonShape = () => ({\n previousAcceptedReviewCount: positiveCountField(),\n previousAverageStars: field.number().min(1).max(5),\n deltaStars: field.number().min(-4).max(4),\n});\n\n/** Privacy-thresholded public honesty snapshot materialized once per day. */\nexport const FeedbackPublicSummarySchema = createSchema(\n {\n snapshotId: uuidField(),\n generatedAt: field.dateTimeISO(),\n asOf: field.dateTimeISO(),\n freshness: field.string().enum([\"fresh\", \"stale\"] as const),\n reportAgeSeconds: countField(),\n rollingWindowDays: field.number().enum([90] as const),\n state: field.string().enum([\"published\", \"suppressed\"] as const),\n acceptedReviewCount: positiveCountField().optional(),\n averageStars: field.number().min(1).max(5).optional(),\n trend: field.string().enum([\"up\", \"flat\", \"down\"] as const).optional(),\n comparison: field.object(publicComparisonShape()).optional(),\n weeklyPoints: field\n .array(field.object(publicWeeklyPointShape()))\n .min(13)\n .max(13),\n },\n \"feedback-public-summary\",\n {\n ...strictOptions,\n schemaValidator: (value) => {\n const summaryIsSuppressed =\n value.state === \"suppressed\" &&\n value.acceptedReviewCount === undefined &&\n value.averageStars === undefined &&\n value.trend === undefined &&\n value.comparison === undefined;\n const comparisonDelta =\n value.comparison === undefined\n ? undefined\n : roundRate(\n value.averageStars -\n value.comparison.previousAverageStars,\n );\n const expectedTrend =\n comparisonDelta === undefined\n ? undefined\n : comparisonDelta >= 0.1\n ? \"up\"\n : comparisonDelta <= -0.1\n ? \"down\"\n : \"flat\";\n const comparisonIsConsistent =\n (value.comparison === undefined && value.trend === undefined) ||\n (value.comparison !== undefined &&\n value.comparison.previousAcceptedReviewCount >= 10 &&\n value.comparison.deltaStars === comparisonDelta &&\n value.trend === expectedTrend);\n const summaryIsPublished =\n value.state === \"published\" &&\n typeof value.acceptedReviewCount === \"number\" &&\n value.acceptedReviewCount >= 10 &&\n typeof value.averageStars === \"number\" &&\n comparisonIsConsistent;\n if (!summaryIsSuppressed && !summaryIsPublished) {\n return false;\n }\n const weekStarts = value.weeklyPoints.map(\n (point: { weekStart: string }) => point.weekStart,\n );\n const asOf = Date.parse(String(value.asOf));\n const generatedAt = Date.parse(String(value.generatedAt));\n if (\n !Number.isFinite(asOf) ||\n !Number.isFinite(generatedAt) ||\n new Date(asOf).toISOString() !== value.asOf ||\n new Date(asOf).getUTCHours() !== 0 ||\n new Date(asOf).getUTCMinutes() !== 0 ||\n new Date(asOf).getUTCSeconds() !== 0 ||\n new Date(asOf).getUTCMilliseconds() !== 0 ||\n generatedAt < asOf ||\n value.reportAgeSeconds !== Math.floor((generatedAt - asOf) / 1_000)\n ) {\n return false;\n }\n const daysSinceMonday = (new Date(asOf).getUTCDay() + 6) % 7;\n const lastWeekStart = asOf - daysSinceMonday * 24 * 60 * 60 * 1_000;\n const weeksAreCanonical = weekStarts.every(\n (weekStart: string, index: number) =>\n Date.parse(weekStart) ===\n lastWeekStart - (12 - index) * 7 * 24 * 60 * 60 * 1_000,\n );\n return (\n new Set(weekStarts).size === weekStarts.length &&\n weeksAreCanonical &&\n (value.state !== \"suppressed\" ||\n value.weeklyPoints.every(\n (point: { state: string }) => point.state === \"suppressed\",\n )) &&\n value.weeklyPoints.every(\n (point: {\n state: \"published\" | \"suppressed\";\n acceptedReviewCount?: number;\n averageStars?: number;\n }) =>\n (point.state === \"suppressed\" &&\n point.acceptedReviewCount === undefined &&\n point.averageStars === undefined) ||\n (point.state === \"published\" &&\n typeof point.acceptedReviewCount === \"number\" &&\n point.acceptedReviewCount >= 10 &&\n typeof point.averageStars === \"number\" &&\n (value.state !== \"published\" ||\n point.acceptedReviewCount <= value.acceptedReviewCount)),\n )\n );\n },\n },\n);\n\n/** Conditional-write checkpoint for replay-safe timer processors. */\nexport const FeedbackProcessorCheckpointSchema = createSchema(\n {\n checkpointId: safeIdField(160),\n processor: field\n .string()\n .enum([\"bug-hourly\", \"review-daily\", \"commit-reconciliation\"] as const),\n windowKey: safeIdField(160),\n revision: revisionField(),\n completedAt: field.dateTimeISO(),\n reportId: uuidField().optional(),\n },\n \"feedback-processor-checkpoint\",\n {\n ...strictOptions,\n schemaValidator: (value) =>\n isProcessorArtifactConsistent(value, \"checkpoint\") &&\n value.revision >= 1 &&\n ((value.processor === \"commit-reconciliation\" &&\n value.reportId === undefined) ||\n (value.processor !== \"commit-reconciliation\" &&\n value.reportId !== undefined)),\n },\n);\n\n/** Immutable manifest describing one bounded materialization attempt. */\nexport const FeedbackMaterializationManifestSchema = createSchema(\n {\n manifestId: uuidField(),\n processor: field\n .string()\n .enum([\"bug-hourly\", \"review-daily\", \"commit-reconciliation\"] as const),\n windowKey: safeIdField(160),\n revision: revisionField(),\n generatedAt: field.dateTimeISO(),\n sourcePacketCount: countField(),\n lateArrivalCount: countField(),\n correctionReason: field\n .string()\n .enum([\"late-arrival\", \"metrics-source\"] as const)\n .optional(),\n outputReportId: uuidField().optional(),\n status: field\n .string()\n .enum([\"published\", \"corrected\", \"no-op\"] as const),\n },\n \"feedback-materialization-manifest\",\n {\n ...strictOptions,\n schemaValidator: (value) => {\n if (\n !isProcessorArtifactConsistent(value, \"manifest\") ||\n value.lateArrivalCount > value.sourcePacketCount\n ) {\n return false;\n }\n if (value.processor === \"commit-reconciliation\") {\n return (\n value.status === \"no-op\" &&\n value.revision >= 1 &&\n value.outputReportId === undefined &&\n value.correctionReason === undefined &&\n value.lateArrivalCount === 0\n );\n }\n return (\n (value.status === \"published\" &&\n value.revision === 1 &&\n value.lateArrivalCount === 0 &&\n value.correctionReason === undefined &&\n value.outputReportId !== undefined) ||\n (value.status === \"corrected\" &&\n value.revision >= 2 &&\n ((value.correctionReason === \"metrics-source\" &&\n value.lateArrivalCount === 0) ||\n ((value.correctionReason === undefined ||\n value.correctionReason === \"late-arrival\") &&\n value.lateArrivalCount > 0)) &&\n value.outputReportId !== undefined)\n );\n },\n },\n);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAO,IAAM,mBAAmB,oBAAI,IAAI;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,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","names":[]}