/* [referral-brief-v1] Service-fact contract for the referral landing v3 — the numbers and ruleset anchors the page may cite (prices, service commitments, qualifying period, AGB version). All values are derived upstream from PBP entities (offerings, policies, publicDocuments); every field is optional so a missing policy drops only its own claim — the copy layer must degrade truthfully rather than invent digits (DNA-103). No PBP imports — this is the pure contract consumed by the copy module and produced by the site-side derivation. No display strings — amounts/durations stay numeric; formatting happens in copy.ts. warpgogol-m000193: created — single typed fact set replacing per-copy literal economics. REVIEW-CODE-2026-10-08-02: new optional facts downtimeHours, priceFixMonths, cancellationDays, smallChangesPerMonth so every numeric claim the copy cites resolves from a PBP policy — no digits invented at the copy layer when a policy is absent. RFC-1258: capacity fact (month/free/total/updatedAt) from the PBP partner-program capacity block — the dated wave counter; absent → static range line. */ /** Canonical fact keys whose values link a landing row to a section anchor on the site's AGB page. Site-authored per language — the platform declares only the vocabulary. */ export const REFERRAL_AGB_ANCHOR_KEYS = [ "inquiryNonBinding", "responseHours", "launchWorkdays", "availabilitySla", "smallChangeHours", "handoverHours", "priorityReferral", "partnerProgram", "excludedServices", "unsupportedProjects", "smallBusiness", "priceFix", "cancellation", "b2b", "productScope", "activationFee", "reviewResult", ] as const; export type ReferralAgbAnchorKey = (typeof REFERRAL_AGB_ANCHOR_KEYS)[number]; export type ReferralAgbAnchors = Partial>; /** Landing v3 service facts — all derived from PBP entities. */ export interface ReferralServiceFacts { /** Activation price (one-time, e.g. 200). */ readonly activationPrice?: number; /** Monthly subscription (e.g. 70). */ readonly monthlyPrice?: number; /** Yearly subscription (e.g. 700). */ readonly yearlyPrice?: number; readonly priceCurrency?: string; /** Launch window in working days (delivery-guarantee threshold). */ readonly launchWorkdays?: number; /** Delay remedy type (delivery-guarantee remedy.type, e.g. "continued-performance" — the copy maps known tokens to truthful clauses; unknown tokens are omitted). */ readonly launchRemedy?: string; /** Delay credit per day (delivery-guarantee terms.delayCreditPerDay). */ readonly delayCreditPerDay?: number; /** Availability objective percent (availability-sla threshold). */ readonly availabilityPercent?: number; /** Downtime threshold in hours — beyond it the next month is free (availability-sla terms.downtimeThreshold). */ readonly downtimeHours?: number; /** Price-fix period in months (price-changes priceFixPeriod). */ readonly priceFixMonths?: number; /** Ordinary cancellation notice in days (cancellation ordinaryNotice.period). */ readonly cancellationDays?: number; /** Included small changes per month (offering package.allowances.smallChanges). */ readonly smallChangesPerMonth?: number; /** Small-changes window in hours (small-changes threshold). */ readonly smallChangeHours?: number; /** Support response window in hours (support-response threshold). */ readonly responseHours?: number; /** Exit handover window in hours (exit-package deliveryTarget). */ readonly handoverHours?: number; /** Reward qualifying period in days (partner-program qualifyingPeriod). */ readonly qualifyingDays?: number; /** Studio intake wave slots (digital-foundation availability.slotRange). */ readonly waveSlots?: { readonly min: number; readonly max: number }; /** RFC-1258: dated wave-capacity fact (partner-program capacity block) — the "Nächste Welle: n von m Plätzen frei" line. Absent → the landing degrades to the static waveSlots range line. */ readonly capacity?: { readonly month: string; readonly free: number; readonly total: number; readonly updatedAt: string; }; /** AGB document version (documents/terms presentation.version). */ readonly termsVersion?: string; /** AGB document effective date (documents/terms governance.effectiveFrom). */ readonly termsEffectiveFrom?: string; }