# Functional Weave: every published capability > 442 capabilities. One per line: id@latest-version [status] summary :: signatures, in Functional Weave's language-neutral form. get_function on the MCP server (https://functionalweave.com/mcp) or the page https://functionalweave.com/functions/ gives them in TypeScript, Python or Rust, with the one-line reference, examples and README. Status: stable, unreviewed (passes its tests, awaiting an expert's sign-off), or deprecated. - agri.feed-ration@1.0.0 [stable] Ration costing and dry matter intake from each feed's fresh weight, DM % and price per tonne, in exact money. :: fn feedRation(feeds: RationFeed[], head: int, days: int, currency: string) -> RationCost - agri.fertiliser-application@1.0.0 [stable] Fertiliser product rate (kg/ha and total) to meet N, P2O5 and K2O targets from its analysis, limiting nutrient first. :: fn fertiliserApplication(analysis: NutrientAnalysis, targets: NutrientTargets, areaHectares: float) -> FertiliserPlan - agri.field-area@1.0.0 [stable] Field area in square metres, hectares and acres from a boundary polygon of latitude/longitude points. :: fn fieldArea(boundary: GeoPoint[]) -> FieldArea - agri.gross-margin@1.0.0 [stable] Enterprise gross margin (output less variable costs), in total and per hectare or per head, in exact money. :: fn grossMargin(outputs: MarginLine[], variableCosts: MarginLine[], per: MarginBasis, units: float, currency: string) -> GrossMargin - agri.growing-degree-days@1.0.0 [stable] Growing degree days (thermal time) from daily min/max temperatures, a base and an optional upper cap. :: fn growingDegreeDays(days: DailyTemperature[], baseCelsius: float, upperCelsius: float?, method: DegreeDayMethod) -> DegreeDays - agri.milk-price@1.0.0 [stable] Milk price per litre and payment from a contract's base price, butterfat/protein adjustments and bonuses. :: fn milkPrice(contract: MilkContract, supply: MilkSupply) -> MilkPrice - agri.seed-rate@1.0.0 [stable] Seed rate in kg/ha from target plants per m², thousand-grain weight and expected establishment. :: fn seedRate(targetPlantsPerSquareMetre: int, thousandGrainWeightGrams: float, establishmentBasisPoints: int) -> SeedRate - agri.spray-mix@1.0.1 [unreviewed] Sprayer tank mix: tank fills, and product and water per full and part tank, for an area, water volume and dose. :: fn sprayMix(areaHectares: float, waterVolumeLitresPerHectare: float, productDosePerHectare: float, doseUnit: DoseUnit, tankLitres: float) -> SprayMix - agri.stocking-rate@1.0.1 [stable] Stocking rate: livestock units and LU per hectare from animal numbers, by a published LU coefficient table. :: fn stockingRate(scheme: string, animals: LivestockCount[], areaHectares: float) -> StockingRate - agri.yield-per-hectare@1.0.1 [stable] Crop yield per hectare and per acre from harvested quantity and field area in any area unit, exactly, as decimal text. :: fn yieldPerHectare(quantity: string, area: string, areaUnit: string, decimals: int) -> YieldPerArea - auth.access-token@1.0.0 [stable] Issue an API's HS256 access token, read one from an Authorization header, and refuse revoked or superseded ones. :: fn issueAccessToken(subject: string, name: string, email: string, tokenVersion: int, jti: string, now: int, ttlSeconds: int, secret: int[]) -> AccessToken; fn readAccessToken(authorization: string?, secret: int[], now: int, leewaySeconds: int) -> AccessCheck; fn confirmAccessToken(check: AccessCheck, currentTokenVersion: int?, revoked: bool) -> AccessCheck - auth.bearer-token@1.0.0 [stable] The token from an HTTP Authorization header of the form "Bearer " (RFC 6750), or null if it has none. :: fn parseBearerToken(authorization: string?) -> string? - auth.jwt@1.0.0 [stable] Sign, verify and decode HS256 JSON Web Tokens (RFC 7519): signature, algorithm and exp/nbf/iat checked with leeway. :: fn signJwt(claims: record, secret: int[]) -> string; fn verifyJwt(token: string, secret: int[], now: int, leewaySeconds: int) -> JwtVerification; fn decodeJwt(token: string) -> record? - auth.login-throttle@1.0.0 [stable] Allow a login attempt or lock the account out, from its recent failed attempts, with the seconds until it may retry. :: fn loginThrottle(failures: int[], now: int, policy: ThrottlePolicy) -> ThrottleDecision - auth.normalise-email@1.0.0 [stable] Trim an email address and lower-case its domain for storage and lookup, or null if it is not a plausible address. :: fn normaliseEmail(value: string) -> string? - auth.password-hash@1.0.0 [stable] Hash a password for storage as pbkdf2_sha256$iterations$salt$hash, verify one in constant time, and spot weak hashes. :: fn hashPassword(password: string, salt: int[], iterations: int) -> string; fn verifyPassword(password: string, stored: string) -> bool; fn passwordNeedsRehash(stored: string, iterations: int) -> bool - auth.password-policy@1.0.1 [stable] Check a new password against a named policy (NIST SP 800-63B-4 by default): length, common passwords, name and email. :: fn passwordPolicy(name: string) -> PasswordPolicy; fn checkPassword(password: string, email: string?, name: string?, policy: PasswordPolicy) -> PasswordCheck - auth.validate-login@1.0.0 [stable] Check a login form (email, password): the normalised email to look up, or a message for each field to fix. :: fn validateLogin(email: string, password: string) -> LoginCheck - auth.validate-password-change@1.0.0 [stable] Check a change-password form: current password given and correct, new one meeting the policy and different. :: fn validatePasswordChange(currentPassword: string, newPassword: string, currentPasswordMatches: bool, email: string, name: string, policy: PasswordPolicy) -> PasswordChangeCheck - auth.validate-registration@1.0.0 [stable] Validate a sign-up form (email, password, name) in one call, with a message per field, in the browser and the API alike. :: fn validateRegistration(email: string, password: string, name: string, policy: PasswordPolicy) -> RegistrationCheck - banking.bacs-processing-date@1.0.0 [stable] Bacs three-day cycle: input, processing and entry (arrival) dates for a submission, skipping weekends and bank holidays. :: fn bacsProcessingDates(submissionIso: date, afterCutoff: bool) -> BacsCycle - banking.cheque-amount-words@1.0.0 [stable] The words and figures to write on a cheque: "One hundred and twenty pounds and fifty pence only", "£120.50". :: fn chequeAmountWords(amount: Money, penceStyle: ChequePenceStyle) -> ChequeWording - banking.faster-payments-limit@1.0.1 [stable] Whether a Faster Payment fits the scheme maximum, the bank's per-payment limit and what is left of its daily limit. :: fn fasterPaymentsCheck(amount: Money, sentToday: Money, perTransactionLimit: Money, dailyLimit: Money, onDate: date) -> FasterPaymentsCheck - banking.fees-cap@1.0.0 [stable] Apply a monthly fee cap to a list of account charges: charge up to the cap, waive the rest. :: fn applyFeeCap(charges: FeeCharge[], monthlyCap: Money, cycleDay: int) -> FeeCapResult - banking.overdraft-interest@1.0.0 [stable] Overdraft interest for a statement period from daily balances, with an interest-free buffer. :: fn overdraftInterest(balances: DatedBalance[], fromIso: date, toIso: date, annualRateBasisPoints: int, interestFreeBuffer: Money, convention: DayCountConvention, mode: RoundingMode) -> OverdraftInterest - banking.savings-aer@1.0.0 [stable] AER (annual equivalent rate) from a gross nominal rate and how often interest is paid, to two decimal places. :: fn savingsAer(grossRateBasisPoints: int, paymentsPerYear: int) -> int - charity.donation-matching@1.0.0 [stable] Employer match on a donation: a ratio in basis points, limited by a per-donor cap and a programme budget. :: fn donationMatch(donation: Money, ratioBasisPoints: int, donorCap: Money?, donorMatchedSoFar: Money, programmeCap: Money?, programmeMatchedSoFar: Money) -> DonationMatch - charity.fundraising-ratio@1.0.0 [stable] Cost to raise £1 and charitable spend ratio for a charity, in exact basis points. :: fn fundraisingRatios(fundraisingCosts: Money, fundsRaised: Money, charitableSpend: Money, totalExpenditure: Money) -> FundraisingRatios - charity.gasds@1.0.2 [stable] Gift Aid Small Donations Scheme top-up for a tax year: the £8,000 limit, the matching rule and community buildings. :: fn gasds(smallDonations: Money, giftAidDonations: Money, communityBuildingDonations: Money[], onDate: date) -> GasdsClaim - charity.gift-aid@1.0.2 [stable] Gift Aid a UK charity can claim on a donation: basic rate tax grossed up, 25p per £1 at 20%. :: fn giftAid(donation: Money, onDate: date) -> GiftAid - charity.gift-aid-eligibility@1.0.2 [stable] Whether a UK donation qualifies for Gift Aid: declaration, enough tax paid, and the donor benefit limits. :: fn giftAidEligibility(donation: Money, benefitValue: Money, priorBenefitsThisYear: Money, hasDeclaration: bool, donorPaysEnoughTax: bool, onDate: date) -> GiftAidEligibility - charity.higher-rate-relief@1.0.0 [stable] A Gift Aid donor's extra tax relief at higher, intermediate, additional and top rates, by extending the tax bands. :: fn higherRateRelief(taxableIncome: Money, donations: Money, region: TaxRegion, onDate: date) -> HigherRateRelief - charity.payroll-giving@1.0.0 [stable] UK Payroll Giving for one pay period: the donation comes off pay before PAYE, and the tax it saves the employee. :: fn payrollGiving(taxCode: string, frequency: PayFrequency, period: int, pay: Money, donation: Money, previousPayToDate: Money, previousTaxToDate: Money, payDate: date) -> PayrollGiving - charity.reclaim-batch@1.0.1 [stable] Gift Aid claim totals for a period from donation records: donor lines, aggregated small gifts, tax due. :: fn giftAidClaimBatch(donations: GiftAidDonation[], periodStart: date, periodEnd: date, aggregateSmall: bool) -> GiftAidClaimBatch - charity.regular-giving-schedule@1.0.0 [stable] Collection dates for a regular gift: monthly, quarterly or annual on a day, clamped to short months, after a lead time. :: fn regularGivingSchedule(frequency: GivingFrequency, collectionDay: int, signUpDate: date, leadDays: int, endDate: date?, count: int) -> date[] - charity.restricted-funds@1.0.0 [stable] Allocate charity spending to restricted funds first, then unrestricted funds, never overdrawing a restricted fund. :: fn allocateFundSpend(funds: Fund[], spends: FundSpend[]) -> FundAllocation - charts.axis@1.0.1 [stable] Axis geometry as data: tick positions, tick marks, label anchors and gridlines for number, time and category axes. :: fn axisFromTicks(positions: float[], labels: string[], range: float[], orient: AxisOrient, position: float, tickSize: float) -> Axis; fn numberAxis(domain: float[], range: float[], count: int, orient: AxisOrient, position: float, tickSize: float) -> Axis; fn timeAxis(domain: date[], range: float[], count: int, orient: AxisOrient, position: float, tickSize: float) -> Axis; fn bandAxis(domain: string[], range: float[], paddingInner: float, paddingOuter: float, orient: AxisOrient, position: float, tickSize: float) -> Axis; fn gridLines(axis: Axis, length: float) -> Line[] - charts.bar-chart@1.0.0 [stable] Complete bar chart geometry as data, grouped or stacked: plot area, axes, gridlines, bar rectangles, colours, legend. :: fn barChart(spec: BarChartSpec) -> BarChart - charts.color@1.0.1 [stable] Hex colours to RGB and back, and sRGB channels to linear light and back, identically in every language. :: fn parseHex(hex: string) -> Rgb; fn toHex(rgb: Rgb) -> string; fn srgbToLinear(channel: int) -> float; fn linearToSrgb(value: float) -> int - charts.contrast@1.0.0 [stable] WCAG 2.x contrast ratio between two colours, and which text colour reads best on a background. :: fn contrastRatio(foreground: string, background: string) -> float; fn readableTextColor(background: string, candidates: string[]) -> string - charts.downsample@1.0.0 [stable] Reduce a long series to a few points that keep its visual shape, by Largest-Triangle-Three-Buckets (LTTB). :: fn downsample(points: Sample[], threshold: int) -> Sample[] - charts.extent@1.0.1 [stable] The minimum and maximum of a series as [min, max], skipping gaps (null), or null when there is no value. :: fn extent(values: float?[]) -> float[]? - charts.format@1.0.0 [stable] Axis and label text for charts: tick numbers, SI prefixes (1.2k, 3.4M), percentages, dates and money. :: fn formatTick(value: float, step: float) -> string; fn formatSi(value: float, significant: int) -> string; fn formatPercent(value: float, decimals: int) -> string; fn formatDate(iso: date, label: DateLabel) -> string; fn formatMoneyTick(minor: float, currency: string) -> string - charts.histogram-bins@1.0.0 [stable] Bin values into histogram bins on round edges, by Sturges' rule, Freedman-Diaconis, or a fixed width. :: fn histogramBins(values: float[], method: BinMethod, binWidth: float?) -> Bin[] - charts.interpolate-color@1.0.0 [stable] The colour at a point along a sequential or diverging ramp, mixed in OKLab so steps look even; hex in, hex out. :: fn interpolateColor(ramp: string[], t: float) -> string - charts.layout@1.0.1 [stable] Chart layout: the plot area inside margins, legend items wrapped into rows, and greedy label collision avoidance. :: fn plotArea(width: float, height: float, margins: Margins) -> PlotArea; fn legendRows(labels: string[], maxWidth: float, charWidth: float, swatchSize: float, gap: float, rowHeight: float) -> LegendItem[]; fn avoidCollisions(boxes: LabelBox[], padding: float) -> bool[] - charts.line-chart@1.0.0 [stable] Complete line chart geometry as data: plot area, number or date axes, gridlines, series paths, colours, legend. :: fn lineChart(spec: LineChartSpec) -> LineChart - charts.palette@1.0.0 [stable] A categorical palette of n colour-blind-safe colours for chart series: Okabe-Ito or Paul Tol's bright scheme. :: fn palette(scheme: string, count: int, cycle: bool) -> string[] - charts.scale@1.1.0 [stable] Map data values onto screen positions and back: linear, log, time, band and point scales, and nice domains. :: fn linearScale(domain: float[], range: float[], value: float, clamp: bool) -> float; fn invertLinear(domain: float[], range: float[], value: float) -> float; fn niceDomain(domain: float[], count: int) -> NiceDomain; fn logScale(domain: float[], range: float[], value: float, clamp: bool) -> float; fn timeScale(domain: date[], range: float[], value: date, clamp: bool) -> float; fn bandScale(domain: string[], range: float[], value: string, paddingInner: float, paddingOuter: float, align: float) -> Band; fn pointScale(domain: string[], range: float[], value: string, padding: float, align: float) -> float - charts.shape@1.0.1 [stable] SVG path strings for lines, areas, steps, monotone curves, bars, arcs and pie slices, identical in every language. :: fn linePath(points: Point[]) -> string; fn areaPath(points: AreaPoint[]) -> string; fn stepPath(points: Point[], position: StepPosition) -> string; fn monotoneCurve(points: Point[]) -> string; fn barRects(bars: BarSpec[], orientation: Orientation) -> Rect[]; fn arcPath(arc: Arc) -> string; fn pieAngles(values: float[], startAngle: float, endAngle: float, padAngle: float) -> PieSlice[] - charts.sparkline@1.0.0 [stable] A sparkline's SVG path and end marker from a series, fitted into a box, with gaps left as breaks. :: fn sparkline(values: float?[], width: float, height: float, padding: float) -> Sparkline - charts.stack@1.0.0 [stable] Stack several series for stacked bars and areas: on zero, normalised to 100%, or diverging around zero. :: fn stack(series: float[][], offset: StackOffset) -> StackedValue[][] - charts.ticks@1.0.0 [stable] Axis ticks: a round step (1, 2 or 5 x 10^k), the ticks on it, and calendar ticks from days to years. :: fn tickStep(start: float, stop: float, count: int) -> float; fn niceTicks(start: float, stop: float, count: int) -> float[]; fn timeTickInterval(start: date, stop: date, count: int) -> TimeTickInterval; fn timeTicks(start: date, stop: date, interval: TimeInterval, step: int) -> date[] - collections.chunk@1.0.0 [stable] Split a list into consecutive batches of at most n items, in order; the last batch may be short. :: fn chunk(items: T[], size: int) -> T[][] - collections.dedupe-by-key@1.0.0 [stable] Remove records that share a key value, keeping the first or the last of each, in input order. :: fn dedupeByKey(records: record[], key: string, keep: DedupeKeep) -> record[] - collections.diff@1.0.0 [stable] Compare two lists of records by key: which were added, which removed, and which changed and in what fields. :: fn diffByKey(before: record[], after: record[], key: string) -> RecordDiff - collections.group-by-key@1.0.0 [stable] Group records by the value at one key, preserving input order inside each group. :: fn groupByKey(records: record[], key: string) -> map - collections.paginate@1.0.0 [stable] Slice a list into a 1-based page and report the totals an API response needs. :: fn paginate(items: T[], page: int, perPage: int) -> Page - collections.search-text@1.0.0 [stable] Filter records by a case-insensitive substring match across named fields, in input order. :: fn searchText(records: record[], fields: string[], query: string) -> record[] - collections.sort-by@1.0.0 [stable] Stably sort records by one key, ascending or descending, with a total order across mixed types. :: fn sortBy(records: record[], key: string, direction: SortDirection) -> record[] - construction.brick-count@1.0.0 [stable] Bricks and mortar for a wall, openings subtracted, for UK standard 215 x 102.5 x 65 mm bricks with 10 mm joints. :: fn brickCount(wallLength: float, wallHeight: float, openings: Opening[], skins: int, wastageBasisPoints: int) -> BrickCount - construction.cis-deduction@1.0.2 [stable] Construction Industry Scheme deduction (0, 20 or 30%) on the labour part of a subcontractor payment. :: fn cisDeduction(payment: Money, materials: Money, status: CisStatus, onDate: date, mode: RoundingMode) -> CisDeduction - construction.concrete-volume@1.0.0 [stable] Concrete for slabs, strip footings, pads and round columns: volume to the litre and an order rounded up to 0.1 m³. :: fn concreteVolume(elements: ConcreteElement[], wastageBasisPoints: int) -> ConcreteVolume - construction.day-rate-quote@1.0.0 [stable] A trade quote from labour days at a day rate, materials with a markup, and VAT. :: fn dayRateQuote(labourDaysHundredths: int, dayRate: Money, materialsCost: Money, materialsMarkupBasisPoints: int, vatCategory: string?, onDate: date) -> DayRateQuote - construction.materials-area@1.0.0 [stable] Packs of tiles, paint, plasterboard or flooring to cover an area, with waste and coats, rounded up to whole packs. :: fn materialsArea(areaSquareMetres: float, coveragePerPack: float, coats: int, wastageBasisPoints: int) -> MaterialsQuantity - construction.payment-notice-dates@1.0.2 [stable] Construction Act default dates: payment due, payment notice, final date for payment and pay-less notice. :: fn paymentNoticeDates(kind: SchemePaymentKind, workDate: date, claimDate: date, contractDate: date, region: UkRegion) -> PaymentNoticeDates - construction.retention@1.0.0 [stable] Retention held and released on a construction valuation: full rate, half at practical completion, none at the end. :: fn retention(cumulativeValue: Money, basisPoints: int, stage: RetentionStage) -> Retention - construction.roof-pitch@1.0.0 [stable] Roof pitch in degrees, rafter length and roof slope area from span, rise and length. :: fn roofPitch(span: float, rise: float, roofLength: float, roofType: RoofType) -> RoofPitch - construction.timber-length@1.0.0 [stable] Cutting list: which stock lengths to buy and which pieces to cut from each, allowing for saw kerf. :: fn timberCuttingList(cuts: int[], stockLength: int, kerf: int) -> CuttingList - construction.valuation@1.0.0 [stable] Interim valuation: gross value to date, retention, previous payments, amount due, VAT or reverse charge, and CIS. :: fn interimValuation(input: ValuationInput) -> Valuation - construction.vat-reverse-charge@1.0.2 [stable] Whether the UK VAT domestic reverse charge applies to a construction supply, and the invoice wording. :: fn domesticReverseCharge(supply: ReverseChargeSupply) -> ReverseChargeDecision - crypto.constant-time-equal@1.0.0 [stable] Compare two byte strings in time that does not depend on where they differ, for checking MACs and hashes. :: fn constantTimeEqual(a: int[], b: int[]) -> bool - crypto.hmac-sha256@1.0.0 [stable] HMAC-SHA256 of a message under a secret key (RFC 2104, RFC 4231), in pure code that also runs in the browser. :: fn hmacSha256(key: int[], message: int[]) -> int[] - crypto.pbkdf2-sha256@1.0.0 [stable] PBKDF2 with HMAC-SHA256 (RFC 8018): derive a key from a password and salt, slowly, fast enough for a login request. :: fn pbkdf2Sha256(password: int[], salt: int[], iterations: int, keyLength: int) -> int[] - crypto.sha256@1.0.0 [stable] The SHA-256 digest of a byte string (FIPS 180-4), in pure code that also runs in the browser. :: fn sha256(bytes: int[]) -> int[] - dates.add-business-days@1.0.0 [stable] Move a date forward or back by working days, skipping weekends and a caller-supplied holiday list. :: fn addBusinessDays(iso: date, days: int, holidays: date[]) -> date - dates.add-days@1.0.0 [stable] Shift an ISO date by a whole number of days, forwards or backwards, with exact calendar arithmetic. :: fn addDays(iso: date, days: int) -> date - dates.add-months@1.0.0 [stable] Add calendar months to an ISO date, clamping to the month end: 31 Jan + 1 month is 28 or 29 Feb. :: fn addMonths(iso: date, months: int) -> date - dates.age@1.0.0 [stable] Age in whole years on a given date, with 29 February birthdays ageing on 1 March in other years. :: fn age(birthDate: date, onDate: date) -> int - dates.bank-holidays@1.0.1 [stable] UK bank and public holidays for a region and year, as published by gov.uk, including one-off holidays. :: fn bankHolidays(region: UkRegion, year: int) -> BankHoliday[] - dates.business-days-between@1.0.0 [stable] Working days between two dates, excluding weekends and a caller-supplied holiday list. :: fn businessDaysBetween(startIso: date, endIso: date, holidays: date[]) -> int - dates.day-count-fraction@1.0.0 [stable] Year fraction between two dates by ACT/365F, ACT/360, 30/360, 30E/360 or ACT/ACT ISDA, as an exact fraction. :: fn dayCountFraction(startIso: date, endIso: date, convention: DayCountConvention) -> YearFraction - dates.day-of-week@1.0.0 [stable] The ISO 8601 day of the week for a date: 1 is Monday through 7 is Sunday. :: fn dayOfWeek(iso: date) -> int - dates.days-between@1.0.0 [stable] Calendar days from one ISO date to another, signed: negative when the second date is earlier. :: fn daysBetween(startIso: date, endIso: date) -> int - dates.is-leap-year@1.0.0 [stable] Whether a year is a Gregorian leap year: every 4th, except centuries, except every 400th. :: fn isLeapYear(year: int) -> bool - dates.month-boundaries@1.0.0 [stable] The first day, last day and length of the calendar month containing a date. :: fn monthBoundaries(iso: date) -> MonthBoundaries - dates.overlap@1.0.0 [stable] Days two date ranges have in common, with the end of each range stated as inclusive or exclusive. :: fn overlapDays(aStart: date, aEnd: date, bStart: date, bEnd: date, endInclusive: bool) -> int - dates.quarter@1.0.0 [stable] Calendar quarter and fiscal quarter of a date, with the fiscal year and quarter date ranges, for any start month. :: fn quarter(iso: date, fiscalYearStartMonth: int) -> Quarter - dates.recurrence@1.0.0 [stable] The next n dates of a repeating rule: monthly on a day, last weekday of the month, every k days or weeks, yearly. :: fn recurrence(rule: RecurrenceRule, startIso: date, count: int) -> date[] - dates.uk-tax-year@1.0.0 [stable] The UK personal tax year containing a date: 6 April to 5 April, with HMRC's label. :: fn ukTaxYear(iso: date) -> UkTaxYear - dates.week-number@1.0.0 [stable] ISO 8601 week number and week-numbering year of a date: weeks start Monday, week 1 holds the first Thursday. :: fn weekNumber(iso: date) -> IsoWeek - education.academic-year@1.0.1 [stable] The academic year and term a date falls in: 1 September to 31 August by default, terms from the caller. :: fn academicYear(onDate: date, yearStart: string?, terms: Term[]) -> AcademicYear - education.attendance-rate@1.0.1 [stable] Pupil attendance and absence rates in basis points, with the DfE persistent and severe absence flags. :: fn attendanceRate(possibleSessions: int, missedSessions: int, onDate: date) -> AttendanceRate - education.cpd-hours@1.0.0 [stable] CPD logged against a requirement for a rolling or fixed period: minutes counted, shortfall and days left. :: fn cpdHours(entries: CpdEntry[], requirement: CpdRequirement, onDate: date) -> CpdProgress - education.degree-classification@1.0.0 [stable] UK honours degree class (First, 2:1, 2:2, Third) from module marks and credits, weighted by level. :: fn degreeClassification(modules: ModuleMark[], levelWeights: LevelWeight[], decimals: int, mode: RoundingMode) -> DegreeClassification - education.fee-instalments@1.0.0 [stable] Tuition fee instalment schedule from a total, shares and due dates, exact to the penny. :: fn feeInstalments(total: Money, shares: int[], dueDates: date[]) -> FeeInstalment[] - education.gpa@1.0.0 [stable] Grade point average on a 4.0 scale from letter grades and credit hours, weighted by credits and rounded once. :: fn gpa(courses: GpaCourse[], gradePoints: GradePoint[]?, mode: RoundingMode) -> GpaResult - education.grade-boundaries@1.0.0 [stable] Grade for a mark from the caller's boundary table: inclusive lower bounds, ungraded below the lowest. :: fn gradeForMark(mark: int, maxMark: int, boundaries: GradeBoundary[]) -> GradeResult - education.school-year-group@1.0.1 [stable] School year group from date of birth on a date, by UK nation: Reception to Year 13, P1 to S6, P1 to Year 14. :: fn schoolYearGroup(birthDate: date, onDate: date, nation: UkNation) -> SchoolYearGroup - education.student-loan-repayment@1.0.1 [stable] A graduate's student or postgraduate loan repayment for a tax year, as Self Assessment works it out. :: fn studentLoanRepayment(earnedIncome: Money, unearnedIncome: Money, plan: StudentLoanPlan, taxYearDate: date, deductedThroughPaye: Money) -> StudentLoanRepayment - education.timetable-clash@1.0.0 [stable] Find timetable clashes: overlapping sessions that share a room, a teacher or a student group, in a fixed order. :: fn timetableClashes(sessions: TimetableSession[]) -> TimetableClash[] - education.weighted-grade@1.0.0 [stable] Weighted percentage across coursework and exam components, exact as a fraction, then rounded once. :: fn weightedGrade(components: GradeComponent[], decimals: int, mode: RoundingMode) -> WeightedGrade - encoding.base64@1.0.0 [stable] Bytes to base64 and base64url text and back (RFC 4648), with strict decoding, identically in every language. :: fn base64Encode(bytes: int[]) -> string; fn base64Decode(text: string) -> int[]; fn base64UrlEncode(bytes: int[]) -> string; fn base64UrlDecode(text: string) -> int[] - encoding.hex@1.0.0 [stable] Bytes to lowercase hexadecimal text and back (RFC 4648 base16), strictly, identically in every language. :: fn hexEncode(bytes: int[]) -> string; fn hexDecode(text: string) -> int[] - encoding.utf8@1.0.0 [stable] Text to UTF-8 bytes and strictly back (RFC 3629), so hashing and signing see the same bytes in every language. :: fn utf8Encode(text: string) -> int[]; fn utf8Decode(bytes: int[]) -> string - energy.bill-calculate@1.0.0 [stable] Electricity or gas bill from two meter reads: energy, standing charge, Climate Change Levy and VAT. :: fn calculateEnergyBill(input: EnergyBillInput, mode: RoundingMode) -> EnergyBill - energy.carbon-emissions@1.0.1 [stable] kgCO2e from kWh or litres of a fuel, using the UK government GHG conversion factors for the year. :: fn carbonEmissions(fuel: string, quantity: int, year: int) -> CarbonEmissions - energy.climate-change-levy@1.0.2 [stable] Climate Change Levy on a business supply of electricity, gas, LPG or solid fuel, at the main rate in force on the date. :: fn climateChangeLevy(commodity: CclCommodity, quantity: int, onDate: date, qualifyingUse: bool, mode: RoundingMode) -> ClimateChangeLevy - energy.degree-days@1.0.0 [stable] Heating and cooling degree days from daily mean temperatures and a base temperature, exact to 0.1. :: fn degreeDays(dailyMeanTemperatures: int[], baseTemperature: int) -> DegreeDays - energy.estimate-read@1.0.0 [stable] Estimate a meter read for a date from the average daily consumption between two earlier reads, with rollover. :: fn estimateRead(earlierRead: MeterRead, latestRead: MeterRead, onDate: date, digits: int, mode: RoundingMode) -> EstimatedRead - energy.gas-kwh@1.0.0 [stable] Convert gas meter units (cubic metres or hundreds of cubic feet) to kWh with the calorific value and 1.02264 correction. :: fn gasKwh(volume: int, volumeUnit: GasVolumeUnit, calorificValue: int) -> GasEnergy - energy.meter-advance@1.0.0 [stable] Units consumed between two meter reads, counting the meter rolling over past all nines once. :: fn meterAdvance(openingRead: int, closingRead: int, digits: int) -> int - energy.price-cap@1.0.2 [stable] Ofgem energy price cap unit rate and daily standing charge for a fuel and payment method on a date (GB average). :: fn priceCap(fuel: EnergyFuel, paymentMethod: PaymentMethod, onDate: date) -> PriceCap - energy.solar-generation@1.0.0 [stable] Estimated annual solar PV generation by the MCS method: kWp x Kk x shade factor, per array and in total. :: fn solarGeneration(arrays: PvArray[]) -> SolarEstimate - energy.tariff-time-of-use@1.0.1 [stable] Cost half-hourly consumption against time-of-use rates: Economy 7 windows or Agile-style half-hourly prices. :: fn timeOfUseCost(usage: HalfHourUsage[], rates: TariffRate[], currency: string, mode: RoundingMode) -> TimeOfUseCost - energy.water-bill@1.0.0 [stable] Metered water and sewerage bill from two reads: volumetric charges, return to sewer, standing and surface water charges. :: fn waterBill(openingRead: MeterRead, closingRead: MeterRead, meterDigits: int, tariff: WaterTariff, surfaceWaterDrains: bool, currency: string, mode: RoundingMode) -> WaterBill - finance.accruals-prepayments@1.0.0 [stable] Split an invoice across accounting periods by days of service, for accruals, prepayments and deferred income. :: fn allocateToPeriods(amount: Money, serviceStart: date, serviceEnd: date, periods: AccountingPeriod[]) -> PeriodAllocation[] - finance.aged-debt@1.0.0 [stable] Aged debt report: open invoices bucketed as current, 1-30, 31-60, 61-90 and 90+ days overdue as at a date. :: fn agedDebt(invoices: OpenInvoice[], asAt: date, bucketDays: int[], currency: string) -> AgedDebt - finance.bank-reconcile-match@1.0.0 [stable] Match bank statement lines to ledger entries by exact amount, a date window and reference similarity, deterministically. :: fn matchBankLines(bankLines: ReconcileLine[], ledgerEntries: ReconcileLine[], dateWindowDays: int, minSimilarity: int) -> Reconciliation - finance.compound-interest@1.0.0 [stable] Compound interest accrued period by period in minor units, the way a statement is built. :: fn compoundInterest(principal: Money, annualRateBasisPoints: int, periodsPerYear: int, years: int) -> CompoundInterestResult - finance.credit-note.calculate@1.0.0 [stable] Credit note against an original invoice, by units or by amount, with VAT at the original tax point's rates. :: fn calculateCreditNote(originalLines: InvoiceLine[], credits: CreditRequest[], jurisdiction: string, originalTaxPoint: date) -> Invoice - finance.depreciation-reducing-balance@1.0.0 [stable] Reducing-balance depreciation schedule at a fixed rate, writing off to the residual value in the final year. :: fn reducingBalanceDepreciation(cost: Money, residualValue: Money, rateBasisPoints: int, years: int) -> DepreciationPeriod[] - finance.depreciation-straight-line@1.0.0 [stable] Straight-line depreciation schedule whose charges sum exactly to cost less residual value. :: fn straightLineDepreciation(cost: Money, residualValue: Money, years: int) -> DepreciationPeriod[] - finance.early-payment-discount@1.0.0 [stable] Early settlement discount available on a payment date under "2/10 net 30" style terms, and the amount to pay. :: fn earlyPaymentDiscount(invoiceTotal: Money, invoiceDate: date, terms: PaymentTerms, paymentDate: date) -> EarlyPaymentDiscount - finance.fx-revaluation@1.0.0 [stable] Unrealised foreign exchange gain or loss on foreign-currency balances revalued at a period-end rate. :: fn fxRevaluation(balances: ForeignBalance[], rates: ExchangeRate[], functionalCurrency: string) -> FxRevaluation - finance.invoice.calculate@1.0.1 [stable] Calculate a complete invoice: line nets, VAT per line, totals and a VAT summary grouped by rate. :: fn calculateInvoice(lines: InvoiceLine[], jurisdiction: string, invoiceDate: date) -> Invoice - finance.invoice.line-total@1.0.0 [stable] Net total for one invoice line: unit price by quantity, less a discount. :: fn lineTotal(unitPrice: Money, quantity: int, discountBasisPoints: int) -> Money - finance.late-payment-interest@1.0.1 [stable] UK statutory late payment interest (8% over Bank Rate) and fixed compensation under the Late Payment Act 1998. :: fn latePaymentInterest(debt: Money, dueDate: date, paymentDate: date) -> LatePaymentClaim - finance.ledger.journal-validate@1.0.0 [stable] Check a double-entry journal: debits equal credits, no zero or two-sided lines, one currency, well-formed account codes. :: fn validateJournal(lines: JournalLine[], currency: string) -> JournalCheck - finance.ledger.trial-balance@1.0.0 [stable] Trial balance from journal lines: debit or credit balance per account, and proof that debits equal credits. :: fn trialBalance(lines: JournalLine[], currency: string) -> TrialBalance - finance.margin@1.0.0 [stable] Profit on a sale with both the margin and the markup, so the two are never confused. :: fn margin(cost: Money, price: Money) -> MarginBreakdown - finance.markup-price@1.0.0 [stable] Selling price from a cost and a target margin or markup in basis points, with explicit rounding. :: fn markupPrice(cost: Money, basisPoints: int, basis: PricingBasis, mode: RoundingMode) -> Money - finance.payment-terms-due-date@1.0.0 [stable] Invoice due date from payment terms: net N days, end of month, N days after month end, day N of next month. :: fn paymentDueDate(invoiceDate: date, terms: PaymentTerms) -> date - finance.proration@1.0.0 [stable] Split an amount into the part used and the part unused over a billing period, losing nothing. :: fn prorate(amount: Money, totalDays: int, usedDays: int) -> ProrationSplit - finance.tax.add-vat@1.0.1 [unreviewed] Add VAT to a net amount using the rate in force on the date of supply. :: fn addVat(net: Money, jurisdiction: string, category: string, onDate: date) -> VatBreakdown - finance.tax.remove-vat@1.0.2 [unreviewed] Extract the VAT already included in a gross amount, using the rate in force on the date of supply. :: fn removeVat(gross: Money, jurisdiction: string, category: string, onDate: date) -> VatBreakdown - finance.tax.vat-flat-rate@1.0.1 [unreviewed] UK VAT Flat Rate Scheme: VAT due on gross turnover at the sector's dated rate, limited cost rate and first-year 1% off. :: fn flatRateVat(turnover: Money, sector: string, limitedCostBusiness: bool, registrationDate: date?, supplyDate: date) -> FlatRateVat - finance.tax.vat-rate@1.2.2 [unreviewed] Look up the VAT rate in force for a jurisdiction, category and date. :: fn vatRate(jurisdiction: string, category: string, onDate: date) -> VatRate - finance.tax.vat-return@1.0.1 [unreviewed] UK nine-box VAT return totals for a period from categorised sales and purchases (VAT Notice 700/12). :: fn vatReturn(transactions: VatTransaction[], periodStart: date, periodEnd: date) -> VatReturn - finance.uk-bank-rate@1.0.1 [stable] Bank of England Bank Rate (base rate) in force on a date, from the Bank's official history since 2001. :: fn ukBankRate(onDate: date) -> BankRate - fleet.company-car-bik@1.0.2 [unreviewed] UK company car benefit in kind: appropriate percentage by CO2 and electric range, car and fuel benefit for a tax year. :: fn companyCarBik(listPrice: Money, capitalContributions: Money, co2: int, electricRangeMiles: int, dieselSupplement: bool, firstRegistered: date, onDate: date, unavailableDays: int, privateUseContributions: Money, freeFuel: bool) -> CompanyCarBik - fleet.cost-per-mile@1.0.0 [stable] Whole-life cost per mile of a vehicle, in tenths of a penny, from depreciation, fuel, maintenance, insurance and tax. :: fn costPerMile(costs: WholeLifeCosts, miles: int) -> CostPerMile - fleet.drivers-hours@1.0.2 [unreviewed] Check a driver's activities against GB/EU drivers' hours: breaks after 4.5h, daily, weekly and fortnightly driving. :: fn checkDriversHours(startDate: date, startTime: string, activities: DriverActivity[]) -> DriversHoursCheck - fleet.emissions@1.0.1 [stable] Vehicle greenhouse gas emissions (grams CO2e) from fuel used or distance, using UK government DESNZ conversion factors. :: fn fleetEmissions(activity: string, quantity: string, unit: EmissionsUnit, factorYear: int) -> FleetEmissions - fleet.ev-charging-cost@1.0.0 [stable] Cost of an electric vehicle charge from the energy added, charger efficiency and power, and time-of-use tariff windows. :: fn evChargingCost(energyAddedWh: int, efficiencyBasisPoints: int, chargerPowerWatts: int, startTime: string, tariff: TariffWindow[], currency: string, mode: RoundingMode) -> EvChargingCost - fleet.fuel-cost@1.0.0 [stable] Fuel cost of a trip from distance, fuel economy (UK or US mpg, or L/100km) and price per litre, exactly. :: fn fuelCost(distance: string, distanceUnit: DistanceUnit, economy: string, economyUnit: EconomyUnit, pricePerLitreTenths: int, currency: string, mode: RoundingMode) -> FuelCost - fleet.mileage-allowance@1.0.2 [stable] HMRC approved mileage allowance payments for an employee's own vehicle: tax-free amount, taxable excess or relief. :: fn mileageAllowance(vehicle: MileageVehicle, previousMiles: int, miles: int, passengerMiles: int, paid: Money, passengerPaid: Money, onDate: date) -> MileageAllowance - fleet.service-due@1.0.0 [stable] Next vehicle service by months or miles, whichever comes first, projecting the mileage date, with an overdue flag. :: fn serviceDue(lastServiceDate: date, lastServiceMileage: int, intervalMonths: int, intervalMiles: int, onDate: date, currentMileage: int) -> ServiceDue - fleet.tachograph-rest@1.0.2 [unreviewed] Check daily and weekly rest against GB/EU drivers' hours: 11h daily (9h reduced, 3+9 split), 45h weekly (24h reduced). :: fn checkTachographRest(startDate: date, startTime: string, activities: DriverActivity[]) -> RestCheck - fleet.vehicle-depreciation@1.0.0 [stable] A vehicle's current value from its cost, age and mileage, on retention curves the caller supplies, exactly. :: fn vehicleDepreciation(cost: Money, ageMonths: int, mileage: int, retainedPerYearBasisPoints: int[], retainedPer10kMilesBasisPoints: int, mode: RoundingMode) -> VehicleValue - form.character-count@1.0.1 [stable] The GOV.UK character count message for a text box: characters or words left or over a limit, with a threshold. :: fn characterCount(text: string, limit: int, unit: CountUnit, threshold: int?) -> CharacterCount - form.date-parts@1.0.1 [stable] Check a date typed into day, month and year boxes, with GOV.UK's error messages and the boxes to mark in error. :: fn validateDateParts(parts: DateParts, label: string, rules: DateRules) -> DatePartsCheck - form.state@1.0.1 [stable] A form's state as a pure reducer: values, touched fields, validator errors and the submit, for useReducer. :: fn initialFormState(values: map) -> FormState; fn formReducer(state: FormState, action: FormAction) -> FormState; fn visibleErrors(state: FormState) -> map - geo.bounding-box@2.0.0 [stable] Latitude/longitude bounding box that contains every point within a distance of a centre point. :: fn boundingBox(lat: float, lng: float, distanceMetres: float) -> BoundingBox - geo.distance@2.0.0 [stable] Great-circle distance in metres between two latitude/longitude points (haversine), to the millimetre. :: fn distance(fromLat: float, fromLng: float, toLat: float, toLng: float) -> float - geo.point-in-polygon@1.0.0 [stable] Whether a latitude/longitude point lies inside a polygon (ray casting; the boundary counts as inside). :: fn pointInPolygon(point: GeoPoint, polygon: GeoPoint[]) -> bool - health.age-in-months@1.0.1 [unreviewed] Age in completed months and days on a given date, for paediatric charts and doses; month ends handled like birthdays. :: fn ageInMonths(birthDate: date, onDate: date) -> AgeInMonths - health.appointment-slots@1.0.1 [unreviewed] Bookable appointment slots from clinic sessions, a slot length, breaks and existing bookings. :: fn appointmentSlots(sessions: ClinicSession[], slotMinutes: int, breaks: ClinicBreak[], bookings: Booking[]) -> AppointmentSlot[] - health.bmi@1.0.1 [unreviewed] Adult body mass index (kg/m², 1 decimal place) and its NICE/WHO weight category. :: fn bmi(weightKg: float, heightCm: float) -> Bmi - health.bsa@1.0.1 [unreviewed] Body surface area in m² by the Mosteller and the DuBois & DuBois formulas, to 2 decimal places. :: fn bodySurfaceArea(weightKg: float, heightCm: float) -> BodySurfaceArea - health.dose-weight-based@1.0.1 [unreviewed] Weight-based dose (per kg) capped at a maximum single dose and rounded to a measurable volume, in exact micro-units. :: fn weightBasedDose(weightGrams: int, dosePerKgMicrograms: int, maxSingleDoseMicrograms: int?, strengthMicrograms: int, strengthVolumeMicrolitres: int, measuringIncrementMicrolitres: int) -> WeightBasedDose - health.egfr@1.0.1 [unreviewed] eGFR in mL/min/1.73 m² by the race-free CKD-EPI 2021 creatinine equation, from creatinine in µmol/L or mg/dL. :: fn egfrCkdEpi2021(creatinine: float, unit: CreatinineUnit, ageYears: int, sex: Sex) -> Egfr - health.gestational-age@1.0.1 [unreviewed] Gestational age (weeks+days) and estimated due date from the last menstrual period by Naegele's rule, cycle-adjusted. :: fn gestationalAge(lmpDate: date, onDate: date, cycleLengthDays: int) -> GestationalAge - health.news2@1.0.1 [unreviewed] NEWS2 early warning score from one set of observations: parameter scores, aggregate and RCP clinical risk band. :: fn news2Score(observations: News2Observations) -> News2Score - health.nhs-number-format@1.0.1 [unreviewed] Display an NHS number in the 3-3-4 format ("943 476 5919") after checking its modulus 11 check digit. :: fn formatNhsNumber(value: string) -> string - health.qrisk-inputs-validate@1.0.1 [unreviewed] Check a QRISK3 cardiovascular risk input set against the calculator's published ranges; does not compute risk. :: fn validateQriskInputs(inputs: QriskInputs) -> QriskInputsValidation - health.waiting-time@1.0.1 [unreviewed] NHS England referral-to-treatment (RTT) wait in days and weekly bands, with the 18-week breach flag. :: fn rttWaitingTime(clockStart: date, clockStop: date?, onDate: date) -> RttWait - hospitality.allergen-matrix@1.0.1 [unreviewed] Which of the 14 UK major allergens a dish contains or may contain, from its ingredients' declared allergens. :: fn allergenMatrix(ingredients: IngredientAllergens[], jurisdiction: string, onDate: date) -> AllergenRow[] - hospitality.bill-split@1.0.0 [stable] Split a restaurant bill evenly, by item or by share, exactly to the penny, with the service charge shared in proportion. :: fn billSplit(items: BillItem[], serviceCharge: Money, diners: int, method: SplitMethod, shares: int[]) -> DinerShare[] - hospitality.cancellation-charge@1.0.0 [stable] Cancellation fee for a booking from a policy of notice bands and the days of notice given. :: fn cancellationCharge(policy: CancellationBand[], nightlyRates: Money[], arrival: date, cancelledOn: date) -> CancellationCharge - hospitality.gross-profit-menu@1.0.0 [stable] Menu gross profit (GP%) on the VAT-exclusive price, and the menu price that reaches a target GP. :: fn menuGrossProfit(cost: Money, menuPrice: Money, jurisdiction: string, category: string, onDate: date) -> MenuGrossProfit; fn menuPriceForGp(cost: Money, targetGpBasisPoints: int, priceStep: int, jurisdiction: string, category: string, onDate: date) -> MenuGrossProfit - hospitality.occupancy-adr-revpar@1.0.0 [stable] Hotel occupancy, average daily rate (ADR) and revenue per available room (RevPAR) for a period. :: fn occupancyAdrRevpar(roomNightsAvailable: int, roomNightsSold: int, roomRevenue: Money) -> HotelPerformance - hospitality.recipe-cost@1.0.1 [stable] Cost a recipe and each portion from ingredient quantities, pack sizes and pack prices, allowing for trim and waste. :: fn recipeCost(ingredients: RecipeIngredient[], portions: int, currency: string) -> RecipeCost - hospitality.recipe-scale@1.0.1 [stable] Scale a recipe to a new number of portions, tidying metric units (g to kg, mL to L) and rounding to kitchen precision. :: fn scaleRecipe(ingredients: RecipeQuantity[], fromPortions: int, toPortions: int) -> RecipeQuantity[] - hospitality.room-rate@1.0.0 [stable] Price a hotel stay night by night from the caller's seasonal, day-of-week rate table, less any length-of-stay discount. :: fn roomRate(rates: NightlyRate[], stayDiscounts: StayDiscount[], arrival: date, nights: int) -> RoomRateQuote - hospitality.service-charge@1.0.0 [stable] A discretionary service charge on a bill's eligible lines, as a basis-point rate with explicit rounding. :: fn serviceCharge(lines: BillLine[], basisPoints: int, mode: RoundingMode) -> ServiceCharge - hospitality.tourist-tax@1.0.1 [stable] Visitor levy (tourist tax) on an overnight stay: Edinburgh's 5%, Cardiff's per person per night, or a caller's own rule. :: fn touristTax(locality: string, customRule: LevyRule?, stay: Stay) -> TouristTax - hospitality.tronc-allocation@1.0.0 [stable] Share a tips pool (tronc) between staff by hours worked, points, or hours times points, exactly to the penny. :: fn troncAllocation(pool: Money, staff: TroncMember[], method: TroncMethod) -> TroncShare[] - hr.absence-bradford-factor@1.0.0 [stable] Bradford factor for a set of absence spells: spells squared times total days, which weights frequent short absences. :: fn bradfordFactor(spellDays: int[]) -> BradfordFactor - hr.length-of-service@1.0.0 [stable] Continuous service between two dates in completed years, months and days, counting both end dates. :: fn lengthOfService(startDate: date, endDate: date) -> ServiceLength - http.retry-after@1.0.0 [stable] Seconds to wait from an HTTP Retry-After header (delay-seconds or an HTTP date), or null if missing or malformed. :: fn retryAfterSeconds(header: string?, now: int) -> int? - insurance.age-banding@1.0.1 [unreviewed] Age at policy inception and the rating band it falls in, from a table of age bands. :: fn ageBand(birthDate: date, inceptionDate: date, bands: AgeBand[]) -> AgeBanding - insurance.claim-reserve@1.0.1 [unreviewed] Claim reserve history: paid, recovered, outstanding and incurred after each transaction, and the movement. :: fn claimReserveHistory(transactions: ClaimTransaction[], currency: string) -> ReservePosition[] - insurance.excess-apply@1.0.1 [unreviewed] Claim payout after the compulsory and voluntary excess, capped at the policy limit. :: fn applyExcess(loss: Money, compulsoryExcess: Money, voluntaryExcess: Money, policyLimit: Money?, excessWithinLimit: bool) -> ExcessSettlement - insurance.instalment-plan@1.0.1 [unreviewed] Pay a premium by monthly instalments: deposit, flat credit charge, instalments exact to the penny, and the APR. :: fn instalmentPlan(premium: Money, deposit: Money, instalmentCount: int, creditChargeBasisPoints: int, firstInstalmentMonth: int) -> InstalmentPlan - insurance.ipt@1.0.2 [unreviewed] UK Insurance Premium Tax at the standard or higher rate in force on a date, added to or taken out of a premium. :: fn insurancePremiumTax(amount: Money, includesTax: bool, band: IptBand, onDate: date, mode: RoundingMode) -> IptBreakdown - insurance.loss-ratio@1.0.1 [unreviewed] Loss ratio, expense ratio and combined ratio in basis points, from earned premium, incurred claims and expenses. :: fn lossRatios(earnedPremium: Money, incurredClaims: Money, expenses: Money, mode: RoundingMode) -> LossRatios - insurance.mid-term-adjustment@1.0.1 [unreviewed] Additional or return premium for a mid-term policy change, pro rata on the days left, plus an admin fee. :: fn midTermAdjustment(oldPremium: Money, newPremium: Money, inceptionDate: date, expiryDate: date, changeDate: date, adminFee: Money, mode: RoundingMode) -> MidTermAdjustment - insurance.no-claims-discount@1.0.1 [unreviewed] No-claims discount at renewal: earn a year, or step back after claims on the insurer's scale, with NCD protection. :: fn nextNoClaimsDiscount(scale: NcdLevel[], currentYears: int, claims: int, protection: NcdProtection?) -> NcdOutcome - insurance.premium-proration@1.0.1 [unreviewed] Return premium on mid-term cancellation, pro rata or on a short-period scale, with an optional minimum retained premium. :: fn cancellationReturnPremium(premium: Money, inceptionDate: date, expiryDate: date, cancellationDate: date, basis: CancellationBasis, shortPeriodScale: ShortPeriodBand[], minimumRetained: Money?) -> CancellationRefund - insurance.rating-factors@1.0.1 [unreviewed] Premium from a base rate times factor-table lookups, loadings and discounts, within minimum and maximum premiums. :: fn ratePremium(basePremium: Money, tables: FactorTable[], risk: map, adjustments: PremiumAdjustment[], minimumPremium: Money?, maximumPremium: Money?, mode: RoundingMode) -> RatedPremium - insurance.sum-insured-average@1.0.1 [unreviewed] Average clause settlement for underinsurance: the loss times sum insured over value at risk, capped at the loss. :: fn averageClauseSettlement(loss: Money, sumInsured: Money, valueAtRisk: Money, conditionBasisPoints: int, mode: RoundingMode) -> AverageSettlement - inventory.abc-classification@1.0.0 [stable] ABC classes by annual consumption value (Pareto), with configurable cut-offs such as 80/15/5 and deterministic ties. :: fn abcClassification(items: ConsumptionItem[], cutoffBasisPoints: int[]) -> AbcItem[] - inventory.cycle-count-schedule@1.0.0 [stable] Cycle count schedule: spread each item's counts evenly over the working days of a period, by ABC class frequency. :: fn cycleCountSchedule(items: CountItem[], countsPerPeriod: map, startDate: date, endDate: date, holidays: date[]) -> CountDay[] - inventory.eoq@1.0.0 [stable] Economic order quantity (Harris/Wilson): the order size that minimises ordering plus holding cost, in whole units. :: fn economicOrderQuantity(annualDemand: int, orderCost: Money, holdingCost: Money, mode: RoundingMode) -> int - inventory.expiry-fefo@1.0.0 [stable] First-expiry-first-out pick list for a quantity across batches, skipping expired and short-dated stock. :: fn fefoPick(batches: StockBatch[], quantity: int, asAt: date, minShelfLifeDays: int) -> FefoPick - inventory.pallet-fit@1.0.0 [stable] How many cartons fit per layer and per pallet (UK 1200x1000 or EUR 1200x800), within a height and weight limit. :: fn palletFit(carton: Carton, pallet: PalletType, maxLoadHeightMm: int, maxLoadWeightGrams: int?, upright: bool) -> PalletFit - inventory.reorder-point@1.0.0 [stable] Reorder point: demand over the supplier lead time, rounded up to whole units, plus safety stock. :: fn reorderPoint(demand: int, demandPeriodDays: int, leadTimeDays: int, safetyStock: int) -> int - inventory.safety-stock@1.0.0 [stable] Safety stock in whole units, by service level and demand variability (z-score) or by max-minus-average. :: fn safetyStock(input: SafetyStockInput) -> int - inventory.stock-turnover@1.0.0 [stable] Stock turnover ratio, days inventory outstanding and days of cover for a period, computed exactly. :: fn stockTurnover(openingStock: Money, closingStock: Money, costOfSales: Money, periodDays: int) -> StockTurnover - inventory.valuation-fifo@1.0.0 [stable] FIFO stock valuation and cost of sales from a stock movement ledger, in exact money. :: fn fifoValuation(movements: StockMovement[], currency: string) -> FifoValuation - inventory.valuation-weighted-average@1.0.0 [stable] Perpetual weighted average cost: stock value and cost of sales from a movement ledger, rounding once per issue. :: fn weightedAverageValuation(movements: StockMovement[], currency: string, mode: RoundingMode) -> AverageCostValuation - invest.bond-yield@1.0.2 [unreviewed] Current yield and yield to maturity of a fixed-coupon bond from its clean price, as Excel's YIELD defines it. :: fn bondYield(settlement: date, maturity: date, couponBasisPoints: int, cleanPrice: string, frequency: int, basis: BondDayCount) -> BondYield - invest.cagr@1.0.1 [unreviewed] Compound annual growth rate between two values over a whole or fractional number of years, in basis points. :: fn cagr(startValue: Money, endValue: Money, yearsNumerator: int, yearsDenominator: int) -> int - invest.capital-gains-tax@1.0.1 [unreviewed] UK Capital Gains Tax for an individual's tax year: losses, annual exempt amount, and the rates by asset and date. :: fn capitalGainsTax(taxYearDate: date, disposals: CgtDisposal[], taxableIncome: Money, lossesBroughtForward: Money) -> CgtResult - invest.dividend-yield@1.0.1 [unreviewed] Trailing and forward dividend yield of a share or fund, in basis points, from the price and the dividends per unit. :: fn dividendYield(price: Money, trailingDividends: Money[], forwardDividend: Money, paymentsPerYear: int) -> DividendYield - invest.drawdown-sustainability@1.0.1 [unreviewed] How many years a pension or investment pot lasts under a yearly withdrawal and a constant growth rate, year by year. :: fn drawdownSustainability(pot: Money, annualWithdrawal: Money, annualGrowthBasisPoints: int, withdrawalIncreaseBasisPoints: int, maxYears: int) -> Drawdown - invest.fee-drag@1.0.1 [unreviewed] What an annual charge costs an investment over the years: value with and without the fee, year by year, in minor units. :: fn feeDrag(startValue: Money, annualGrowthBasisPoints: int, annualFeeBasisPoints: int, years: int) -> FeeDrag - invest.isa-allowance@1.0.2 [unreviewed] ISA allowance used and remaining for a UK tax year: the overall limit, Lifetime ISA, cash ISA and Junior ISA. :: fn isaAllowance(taxYearDate: date, subscriptions: IsaSubscription[], dateOfBirth: date?) -> IsaAllowance - invest.money-weighted-return@1.0.1 [unreviewed] Money-weighted return (XIRR) of dated cash flows on Excel's actual/365 convention, solved exactly in fixed point. :: fn moneyWeightedReturn(flows: DatedFlow[]) -> XirrResult - invest.pension-annual-allowance@1.0.1 [unreviewed] UK pension annual allowance for a tax year with taper, MPAA and three-year carry-forward, and the excess charged. :: fn pensionAnnualAllowance(taxYearDate: date, current: PensionInputYear, previousYears: PensionInputYear[]) -> AnnualAllowanceResult - invest.portfolio-weights@1.0.1 [unreviewed] Each holding's share of a portfolio and its drift from a target weight, in basis points, from exact arithmetic. :: fn portfolioWeights(holdings: PortfolioHolding[]) -> PortfolioWeights - invest.rebalance@1.0.1 [unreviewed] Whole-unit buy and sell trades that bring a portfolio back to target weights, skipping trades below a minimum size. :: fn rebalance(holdings: RebalanceHolding[], cash: Money, minimumTrade: Money) -> RebalancePlan - invest.section-104-pool@1.0.1 [unreviewed] UK share matching for CGT: same-day, 30-day bed-and-breakfast, then the Section 104 pool; allowable cost per disposal. :: fn section104Pool(transactions: ShareTransaction[]) -> Section104Result - invest.time-weighted-return@1.0.1 [unreviewed] Time-weighted return from valuations taken at each external cash flow, geometrically linked exactly. :: fn timeWeightedReturn(points: ValuationPoint[]) -> TwrResult - legal.conflict-name-match@1.0.1 [unreviewed] Fuzzy-match a name against existing clients and parties for a conflict check: normalised, token-sorted Jaro-Winkler. :: fn conflictNameMatch(name: string, candidates: string[], thresholdBasisPoints: int) -> NameMatch[] - legal.court-deadline@1.0.1 [unreviewed] A deadline in days under CPR 2.8: clear days, short periods skip weekends and bank holidays, court-closed days. :: fn courtDeadline(triggerDate: date, days: int, rule: DeadlineRule, atCourtOffice: bool, courtClosedDays: date[]) -> CourtDeadline - legal.court-fee@1.0.2 [unreviewed] The court fee to issue a money claim in England and Wales, from the claim value bands in force on a date. :: fn courtFee(claim: Money, channel: FilingChannel, onDate: date) -> Money - legal.disbursements-vat@1.0.1 [unreviewed] Whether a cost passed to a client is a VAT disbursement (outside scope) or a recharge (VAT due), per HMRC Notice 700. :: fn disbursementVat(facts: DisbursementFacts) -> DisbursementTreatment - legal.limitation-date@1.0.1 [unreviewed] The last day to bring a claim under the Limitation Act 1980, by claim type, from the date it accrued. :: fn limitationDate(claimType: string, accrualDate: date, knowledgeDate: date?) -> LimitationPeriod - legal.retainer-drawdown@1.0.1 [unreviewed] Apply money held on account in client account to bills in order: what each bill takes, what stays due, what is left. :: fn retainerDrawdown(onAccount: Money, bills: RetainerBill[]) -> RetainerDrawdown - legal.statutory-interest@1.0.1 [unreviewed] Statutory interest on a judgment debt (8% simple, daily) or a late commercial debt, England and Wales. :: fn statutoryInterest(amount: Money, fromDate: date, toDate: date, basis: InterestBasis) -> StatutoryInterest - legal.time-billing@1.0.1 [unreviewed] Fees from time entries: each rounded to 6-minute (or other) units and priced at the fee earner's hourly rate. :: fn timeBilling(entries: TimeEntry[], rates: FeeEarnerRate[], unitMinutes: int, mode: RoundingMode) -> TimeBill - lending.affordability@1.0.1 [unreviewed] Debt-to-income and a stressed-rate affordability test for a proposed loan's monthly repayment. :: fn affordability(monthlyIncome: Money, monthlyCommitments: Money, principal: Money, annualRateBasisPoints: int, stressRateBasisPoints: int, termMonths: int, maxDebtToIncomeBasisPoints: int) -> AffordabilityResult - lending.amortisation-schedule@1.0.1 [unreviewed] Repayment schedule for a level-payment loan: interest, principal and balance per period, ending at exactly zero. :: fn amortisationSchedule(principal: Money, annualRateBasisPoints: int, termMonths: int, paymentsPerYear: int, mode: RoundingMode) -> AmortisationSchedule - lending.apr@1.0.1 [unreviewed] Consumer-credit APR from drawdowns and repayments, by the FCA CONC App 1.2.6 equation, to one decimal place. :: fn apr(advances: CreditFlow[], repayments: CreditFlow[], periodsPerYear: int) -> AprResult - lending.daily-interest@1.0.1 [unreviewed] Interest accrued day by day on a changing balance under a day-count convention, summed exactly and rounded once. :: fn dailyInterest(balances: DatedBalance[], fromIso: date, toIso: date, annualRateBasisPoints: int, convention: DayCountConvention, mode: RoundingMode) -> DailyInterest - lending.early-settlement@1.0.1 [unreviewed] Early settlement figure and rebate on UK regulated consumer credit, per the Early Settlement Regulations 2004. :: fn earlySettlement(advances: DatedAmount[], repayments: DatedAmount[], aprBasisPoints: int, noticeReceivedIso: date, requestedSettlementIso: date?, deferral: SettlementDeferral) -> EarlySettlement - lending.loan-payment@1.0.1 [unreviewed] Level repayment for a loan (annuity formula), computed exactly and rounded once, the way you choose. :: fn loanPayment(principal: Money, annualRateBasisPoints: int, termMonths: int, paymentsPerYear: int, mode: RoundingMode) -> Money - lending.ltv@1.0.1 [unreviewed] Loan-to-value ratio in basis points, and the band it falls in from a band table you supply. :: fn loanToValue(loan: Money, propertyValue: Money, bands: LtvBand[]) -> LtvResult - lending.overpayment-effect@1.0.1 [unreviewed] What a one-off overpayment does to a loan: a shorter term at the same payment, or a lower payment over the same term. :: fn overpaymentEffect(balance: Money, annualRateBasisPoints: int, remainingTermMonths: int, paymentsPerYear: int, payment: Money, overpayment: Money, mode: RoundingMode) -> OverpaymentEffect - logistics.container-fit@1.0.0 [stable] How many identical cartons fit in a 20ft, 40ft or 40ft high-cube container or a 13.6 m trailer, by space and by weight. :: fn containerFit(container: string, lengthMm: int, widthMm: int, heightMm: int, cartonGrams: int, keepUpright: bool, maxPayloadKg: int?) -> ContainerFit - logistics.delivery-date@1.0.0 [stable] Estimated dispatch and delivery dates from order time, dispatch cut-off, service days, weekends and UK bank holidays. :: fn deliveryDate(orderDate: date, orderTime: string, cutOff: string, serviceDays: int, region: UkRegion?, closures: date[]) -> DeliveryEstimate - logistics.demurrage@1.0.0 [stable] Demurrage or detention charge for a container: free days, then a tiered daily rate from the carrier's tariff. :: fn demurrage(startDate: date, endDate: date, freeDays: int, tiers: DemurrageTier[]) -> DemurrageCharge - logistics.duty-estimate@1.0.1 [unreviewed] Estimate import duty and import VAT on goods: customs value on a CIF basis, the caller's duty rate, VAT on top. :: fn dutyEstimate(goods: Money, freight: Money, insurance: Money, dutyBasisPoints: int, vatAdditions: Money, jurisdiction: string, vatCategory: string, importDate: date, rounding: RoundingMode) -> DutyEstimate - logistics.freight-rate@1.0.1 [stable] Freight charge from a carrier's dated weight-break tariff for a zone, with the fuel surcharge in force on the ship date. :: fn freightRate(rates: FreightRate[], fuelSurcharges: FuelSurcharge[], zone: string, chargeableGrams: int, shipDate: date) -> FreightQuote - logistics.hs-code-validate@1.0.0 [stable] Check the format of a commodity code: 6-digit HS, 8-digit CN or 10-digit TARIC/UK code, with chapter and heading checks. :: fn validateHsCode(value: string) -> HsCodeCheck - logistics.incoterm-responsibility@1.0.1 [stable] Who pays which costs and where risk passes under an Incoterms 2020 rule, from EXW to DDP, FOB and CIF. :: fn incotermResponsibility(rule: string, edition: int) -> IncotermResponsibility - logistics.route-distance@1.0.0 [stable] Total great-circle distance of an ordered list of stops, leg by leg, optionally back to the start, to the millimetre. :: fn routeDistance(stops: GeoPoint[], returnToStart: bool) -> RouteDistance - logistics.sscc@1.1.0 [stable] Build an 18-digit SSCC pallet label number from extension digit, GS1 company prefix and serial, with its check digit. :: fn buildSscc(extensionDigit: int, companyPrefix: string, serialReference: int) -> string - manufacturing.batch-size@1.0.0 [stable] Economic batch quantity: the EOQ for a batch made at a finite production rate, in whole units. :: fn economicBatchQuantity(annualDemand: int, annualProductionRate: int, setupCost: Money, holdingCost: Money, mode: RoundingMode) -> int - manufacturing.bom-cost@1.0.0 [stable] Rolled-up standard cost of one unit of a product from its BOM, bought-in costs, and labour and overhead rates. :: fn bomCost(lines: BomLine[], item: string, materialCosts: ItemCost[], operations: RoutingOperation[], currency: string, mode: RoundingMode) -> CostRollup - manufacturing.bom-explode@1.0.0 [stable] Explode a multi-level bill of materials into exact total quantities per component, with scrap and cycle checks. :: fn explodeBom(lines: BomLine[], item: string, buildQuantity: int) -> BomRequirement[] - manufacturing.capacity@1.0.0 [stable] Capacity against routed load per work centre over a period, with efficiency, utilisation and overload flags. :: fn workCentreLoad(workCentres: WorkCentre[], loads: RoutedLoad[]) -> CapacityLoad[] - manufacturing.lot-number@1.0.0 [stable] Deterministic lot or batch code YYDDD-LL-SSS from the production date (Julian day), line and sequence. :: fn lotNumber(productionDate: date, line: int, sequence: int) -> string - manufacturing.oee@1.0.0 [stable] Overall equipment effectiveness (availability x performance x quality) in basis points, from times and counts. :: fn overallEquipmentEffectiveness(plannedSeconds: int, downtimeSeconds: int, idealCycleMillis: int, totalCount: int, goodCount: int, mode: RoundingMode) -> Oee - manufacturing.takt-time@1.0.0 [stable] Takt time: available production time divided by customer demand, exact and in whole seconds. :: fn taktTime(availableSeconds: int, demand: int, mode: RoundingMode) -> TaktTime - manufacturing.tolerance-check@1.0.0 [stable] Check a measurement against a nominal size and its upper and lower deviations, in whole micrometres. :: fn checkTolerance(measured: int, nominal: int, upperDeviation: int, lowerDeviation: int) -> ToleranceCheck - manufacturing.variance@1.0.0 [stable] Standard costing variances: material price and usage, labour rate and efficiency, favourable or adverse. :: fn costVariances(material: MaterialActual, labour: LabourActual, actualOutput: int, mode: RoundingMode) -> CostVariances - manufacturing.yield-scrap@1.0.0 [stable] Whole units to start for a required good output at a process yield, and the scrap that allows for. :: fn inputForYield(requiredOutput: int, yieldBasisPoints: int) -> YieldPlan - math.atan@1.0.1 [stable] Arctangent in radians from + - * / only (fdlibm's method), so every language returns the same double. :: fn atan(x: float) -> float - math.basis-points@2.0.0 [stable] Convert a rate between percent, basis points and a plain ratio exactly, as decimal text or integer basis points. :: fn convertRate(value: string, fromUnit: RateUnit, toUnit: RateUnit) -> string; fn toBasisPoints(value: string, unit: RateUnit) -> int; fn fromBasisPoints(basisPoints: int, unit: RateUnit) -> string - math.big-integer@1.0.0 [stable] Exact integer arithmetic of any size, on decimal strings, for powers and products that overflow 64 bits. :: fn calculateBigInteger(a: string, op: BigIntegerOp, b: string) -> string - math.clamp@1.0.0 [stable] Clamp an integer to an inclusive range, refusing a range whose bounds are the wrong way round. :: fn clamp(value: int, min: int, max: int) -> int - math.exp@1.0.1 [stable] e to the power x from + - * / only, so TypeScript, Python and Rust return the same double for the same input. :: fn exp(x: float) -> float - math.fractional-power@1.0.0 [stable] Raise a positive decimal to a fractional power, (1.199)^(31/365), identically in every language. :: fn fractionalPower(base: string, exponentNumerator: int, exponentDenominator: int) -> string - math.gcd-lcm@2.0.0 [stable] Greatest common divisor and least common multiple of two integers, exactly and without overflow. :: fn gcdLcm(a: int, b: int) -> GcdLcm; fn gcd(a: int, b: int) -> int; fn lcm(a: int, b: int) -> int - math.integer-sqrt@1.0.0 [stable] Exact integer square root: the largest whole number whose square does not exceed n. :: fn integerSqrt(n: int) -> int - math.ln@1.0.1 [stable] Natural logarithm from + - * / only, so TypeScript, Python and Rust return the same double for the same input. :: fn ln(x: float) -> float - math.percent-change@1.0.0 [stable] Percentage change from one value to another, in basis points, with an explicit rounding mode. :: fn percentChange(fromValue: int, toValue: int, mode: RoundingMode) -> int? - math.pow@1.0.0 [stable] base to the power exponent from + - * / only, exact by squaring for whole exponents, identical in every language. :: fn pow(base: float, exponent: float) -> float - math.rational@2.0.0 [stable] Exact fraction arithmetic, always reduced, for rates and ratios that must not drift. :: fn calculateRational(a: Rational, op: RationalOp, b: Rational) -> Rational; fn rational(numerator: int, denominator: int) -> Rational; fn addRational(a: Rational, b: Rational) -> Rational; fn subtractRational(a: Rational, b: Rational) -> Rational; fn multiplyRational(a: Rational, b: Rational) -> Rational; fn divideRational(a: Rational, b: Rational) -> Rational; fn compareRational(a: Rational, b: Rational) -> int; fn rationalToInteger(r: Rational, mode: RoundingMode) -> int - math.round-div@1.0.0 [stable] Integer division with an explicit rounding mode, for money arithmetic that must not drift. :: fn roundDiv(numerator: int, denominator: int, mode: RoundingMode) -> int - math.round-div-big@1.0.0 [stable] Divide two integers of any size with an explicit rounding mode, on decimal strings, for exact money sums past 2^53. :: fn roundDivBig(numerator: string, denominator: string, mode: RoundingMode) -> string - math.round-float@1.0.0 [stable] Round a float half away from zero to 0-12 decimal places, identically in TypeScript, Python and Rust. :: fn roundFloat(value: float, decimals: int) -> float - math.sin-cos@1.0.1 [stable] Sine and cosine of an angle in radians from + - * / only, so every language returns the same doubles. :: fn sinCos(radians: float) -> SinCos - money.add@1.0.1 [stable] Add, subtract and negate monetary amounts, refusing to mix currencies. :: fn addMoney(a: Money, b: Money) -> Money - money.allocate@1.0.1 [stable] Split an amount across ratios without losing or inventing a single minor unit. :: fn allocate(amount: Money, ratios: int[]) -> Money[] - money.amount@1.0.2 [stable] A currency-tagged monetary amount held in integer minor units. :: fn money(minor: int, currency: string) -> Money - money.apply-rate@1.0.1 [stable] Apply a rate expressed in basis points to a monetary amount, with an explicit rounding mode. :: fn applyRate(amount: Money, basisPoints: int, mode: RoundingMode) -> Money - money.compare@2.0.0 [stable] Compare two amounts of one currency, refusing to compare across currencies; min, max and clamp too. :: fn compareMoney(a: Money, b: Money) -> int; fn minMoney(a: Money, b: Money) -> Money; fn maxMoney(a: Money, b: Money) -> Money; fn clampMoney(amount: Money, min: Money, max: Money) -> Money - money.convert@1.0.0 [stable] Convert an amount to another currency at a supplied exact rate, with an explicit rounding mode. :: fn convertMoney(amount: Money, rate: ExchangeRate, mode: RoundingMode) -> Money - money.currency-digits@1.0.0 [stable] How many decimal places a currency's minor unit has, from the ISO 4217 list. :: fn currencyDigits(currency: string) -> int - money.format@1.0.0 [stable] Render a monetary amount as text, using the currency's real minor-unit precision. :: fn formatMoney(amount: Money) -> string - money.parse@1.0.0 [stable] Parse "£1,234.50" or "1.234,50 €" into integer minor units, strictly: no guessing, no rounding. :: fn parseMoney(text: string, currency: string, style: NumberStyle) -> Money - money.split-even@1.0.0 [stable] Split an amount into n near-equal parts that add back up to exactly the whole. :: fn splitEven(amount: Money, parts: int) -> Money[] - money.sum@1.0.1 [stable] Total a list of monetary amounts, with an explicit currency for the empty case. :: fn sumMoney(amounts: Money[], currency: string) -> Money - monitor.alert-mute@1.0.0 [stable] Whether to hold an alert back: its component is under maintenance, or a related alert on it is already firing. :: fn muteAlert(kind: string, underMaintenance: bool, firingKinds: string[], policy: MutePolicy) -> AlertMute - monitor.alert-rule@1.0.0 [stable] Evaluate a threshold alert rule over a metric series: inactive, pending, firing or no-data, Prometheus style. :: fn evaluateAlertRule(samples: MetricSample[], rule: ThresholdRule, now: int) -> RuleEvaluation - monitor.alert-state@1.0.0 [stable] Step an alert through inactive, pending, firing and resolved, and say which notification to send. :: fn nextAlertState(previous: AlertState, condition: bool, now: int, policy: AlertPolicy) -> AlertTransition - monitor.anomaly@1.0.0 [stable] Is a new metric value an outlier against its history? By z-score or by the robust median/MAD modified z-score. :: fn detectAnomaly(history: int[], value: int, method: AnomalyMethod, thresholdHundredths: int) -> Anomaly - monitor.burn-rate@1.0.0 [stable] How fast an SLO's error budget is burning: the error rate as a multiple of the rate the SLO allows, in thousandths. :: fn burnRate(targetBasisPoints: int, totalEvents: int, badEvents: int) -> int - monitor.burn-rate-alert@2.0.0 [stable] Multiwindow, multi-burn-rate SLO alerting: which rules fire, from event counts per window (Google SRE workbook). :: fn burnRateAlert(targetBasisPoints: int, windows: WindowCount[], rules: BurnRule[]?, minEvents: int?) -> BurnAlert - monitor.cert-check@1.0.0 [stable] A TLS certificate's expiry state as a check status: ok and warning are up, critical is degraded, expired is down. :: fn certCheck(state: CertExpiryState) -> CheckStatus - monitor.cert-expiry@1.0.0 [stable] How long a TLS certificate has left before its notAfter, and whether that is ok, a warning, critical or expired. :: fn certExpiry(notAfter: int, now: int, warnDays: int, criticalDays: int) -> CertExpiry - monitor.check-status@1.0.0 [stable] Combine the statuses of one target's probes from several locations into one up, degraded or down, with a quorum. :: fn aggregateStatus(statuses: CheckStatus[], downQuorum: int) -> CheckStatus - monitor.component-state@1.0.0 [stable] A status page component's state from its checks: operational, degraded, partial or major outage, or maintenance. :: fn componentState(statuses: CheckStatus[], underMaintenance: bool) -> ComponentState - monitor.counter-increase@1.0.0 [stable] How much a monotonic counter grew over a series of samples, counting restarts from zero, and its rate per second. :: fn counterIncrease(samples: MetricSample[]) -> CounterIncrease - monitor.error-budget@1.0.0 [stable] How much of an SLO's error budget is allowed, used and left, from good and bad event counts or seconds. :: fn errorBudget(targetBasisPoints: int, totalEvents: int, badEvents: int) -> ErrorBudget - monitor.format-duration@1.0.0 [stable] A number of seconds as a short human duration for dashboards and alerts: "3h 12m", "2d 4h", "45s". :: fn formatDuration(seconds: int, maxUnits: int) -> string - monitor.heartbeat@1.0.0 [stable] Whether a cron job that pings on a schedule is new, up, late or down, from its last ping, period and grace time. :: fn heartbeatStatus(lastPingAt: int?, now: int, intervalSeconds: int, graceSeconds: int) -> HeartbeatStatus - monitor.heartbeat-check@1.0.0 [stable] A heartbeat's state as a check status for a status page: up, late as degraded, down as down, new as nothing yet. :: fn heartbeatCheck(state: HeartbeatState) -> CheckStatus? - monitor.http-check-result@1.0.0 [stable] Classify one HTTP probe as up, degraded or down, with a reason and message, from status, body and latency. :: fn classifyHttpCheck(probe: HttpProbe, expect: HttpExpectation) -> CheckOutcome - monitor.incidents@1.0.0 [stable] Turn a series of up, degraded and down checks into incidents, ignoring runs too short to confirm. :: fn findIncidents(checks: Check[], incidentStatus: CheckStatus, confirmChecks: int, now: int) -> Incident[] - monitor.maintenance-window@1.0.0 [stable] The scheduled maintenance window in force at a moment, if any, so alerts and uptime can be suppressed during it. :: fn activeMaintenance(windows: MaintenanceWindow[], at: int) -> MaintenanceWindow? - monitor.mttr@1.0.0 [stable] MTTR, MTBF, downtime and incident counts for a reporting window, from a list of incidents. :: fn reliabilityStats(incidents: Incident[], from: int, to: int) -> ReliabilityStats - monitor.parse-access-log@1.0.0 [stable] Parse one Apache/NCSA Common or Combined Log Format access log line; null for a line in neither format. :: fn parseAccessLog(line: string) -> AccessLogEntry? - monitor.rollup@1.0.0 [stable] Aggregate a metric series into fixed time buckets (count, min, max, avg, sum, last), empty buckets included. :: fn rollup(samples: MetricSample[], from: int, to: int, bucketSeconds: int) -> Bucket[] - monitor.series-window@1.0.0 [stable] The samples of a time series from one moment up to (not including) another, checking they are in time order. :: fn seriesWindow(samples: MetricSample[], from: int, to: int) -> MetricSample[] - monitor.status-code-summary@1.0.0 [stable] Count HTTP status codes by class (1xx to 5xx) and give the server error and client error rates in basis points. :: fn summariseStatusCodes(statuses: int[]) -> StatusCodeSummary - monitor.status-page@1.0.0 [stable] The overall state, headline and affected components at the top of a status page, from each component's state. :: fn statusPage(components: Component[]) -> StatusSummary - monitor.uptime@1.0.0 [stable] Time-weighted uptime of a target over a window from its checks, with gaps longer than a limit counted as unknown. :: fn uptime(checks: Check[], from: int, to: int, maxGapSeconds: int) -> UptimeReport - monitor.uptime-bars@1.0.0 [stable] One bar per UTC day for a status page's uptime history: seconds in each state, uptime and a colour state, oldest first. :: fn uptimeBars(checks: Check[], now: int, days: int, maxGapSeconds: int) -> DayBar[] - net.cidr@1.0.0 [stable] CIDR blocks: network, broadcast, first and last host, host count, netmask and prefix, and membership. :: fn cidrInfo(cidr: string) -> CidrInfo; fn cidrContains(cidr: string, address: string) -> bool; fn isCidr(text: string) -> bool; fn prefixToNetmask(prefix: int) -> string; fn netmaskToPrefix(netmask: string) -> int - net.cidr-hosts@1.0.0 [stable] List every usable host address in an IPv4 CIDR block, refusing blocks larger than a limit. :: fn cidrHosts(cidr: string, maxCount: int) -> string[] - net.device-status@1.0.0 [stable] Classify a device as up, degraded or down from its latency summary and loss, p95 and jitter thresholds. :: fn deviceStatus(summary: LatencySummary, thresholds: StatusThresholds) -> StatusResult - net.device-validate@1.0.0 [stable] Validate one network inventory entry: name, host, ports, optional MAC and subnet, with every problem listed. :: fn validateDevice(entry: record) -> DeviceValidation - net.hostname-validate@1.0.0 [stable] Check a host name against RFC 1123 and RFC 952 label rules and length limits, and normalise it. :: fn validateHostname(text: string) -> HostnameValidation - net.ip-classify@1.0.0 [stable] Classify an IPv4 or IPv6 address as loopback, private, link-local, multicast, documentation, CGNAT or global. :: fn classifyIp(address: string) -> IpClassification - net.ipv4@1.0.0 [stable] Parse, format and check dotted-quad IPv4 addresses, refusing leading zeros, octal, hex and short forms. :: fn parseIpv4(text: string) -> int; fn formatIpv4(value: int) -> string; fn isIpv4(text: string) -> bool - net.ipv6@1.0.0 [stable] Parse IPv6 addresses and write them in RFC 5952 canonical form: lower-case, zeros compressed, IPv4 embedded. :: fn parseIpv6(text: string) -> int[]; fn formatIpv6(groups: int[]) -> string; fn isIpv6(text: string) -> bool - net.latency-summary@1.0.0 [stable] Summarise probe results: sent, received, loss, min/avg/max, p95 and jitter, in whole microseconds. :: fn summariseLatency(samplesUs: int?[]) -> LatencySummary - net.mac-address@1.0.0 [stable] Validate a MAC address in colon, hyphen, Cisco dot or bare form and normalise it, with multicast and local bits. :: fn validateMacAddress(text: string) -> MacValidation - net.port@1.0.0 [stable] Check a TCP/UDP port number and name the IANA service registered on it, with its system/user/dynamic range. :: fn isPort(value: int) -> bool; fn portService(port: int, protocol: Protocol) -> PortService - net.port-list@1.0.0 [stable] Parse a port list such as 22,80,8000-8010 into port numbers, in order and without duplicates. :: fn parsePortList(text: string) -> int[] - payroll.gross-to-net@1.0.1 [unreviewed] A UK payslip for one pay period: gross pay, pension, PAYE tax, National Insurance, student loans and net pay. :: fn grossToNet(input: PayslipInput) -> Payslip - payroll.holiday-entitlement@1.0.1 [unreviewed] UK statutory holiday: 5.6 weeks capped at 28 days and pro-rated, or 12.07% accrual for irregular hours. :: fn holidayEntitlement(worker: HolidayWorker, leaveYearStart: date) -> HolidayEntitlement - payroll.holiday-pay-accrual@1.0.1 [unreviewed] UK holiday pay: 12.07% rolled-up holiday pay, or a week's pay averaged over the last 52 paid weeks. :: fn holidayPay(method: HolidayPayMethod, periodPay: Money, weeklyPay: Money[], onDate: date) -> HolidayPay - payroll.income-tax@1.0.2 [unreviewed] PAYE income tax for one pay period from a tax code, cumulative or week 1/month 1, by HMRC's tax table routines. :: fn incomeTax(taxCode: string, frequency: PayFrequency, period: int, pay: Money, previousPayToDate: Money, previousTaxToDate: Money, payDate: date) -> IncomeTax - payroll.minimum-wage-check@1.0.1 [unreviewed] Check pay for a pay reference period against the minimum or living wage for age and apprenticeship. :: fn minimumWageCheck(pay: Money, minutesWorked: int, birthDate: date, periodStart: date, apprenticeshipStart: date?) -> MinimumWageCheck - payroll.national-insurance@1.0.2 [unreviewed] Employee and employer Class 1 National Insurance for one payment by category letter, exact percentage method. :: fn nationalInsurance(earnings: Money, category: string, frequency: PayFrequency, payDate: date, director: DirectorNi?) -> NationalInsurance - payroll.net-to-gross@1.0.2 [unreviewed] The gross pay that gives at least a target net pay in one UK pay period, found by a deterministic search. :: fn netToGross(targetNet: Money, input: PayslipInput) -> Payslip - payroll.notice-period@1.0.1 [unreviewed] Statutory minimum notice in weeks from continuous service: one week per year from two years, capped at twelve. :: fn statutoryNotice(startDate: date, noticeDate: date) -> StatutoryNotice - payroll.overtime@1.0.1 [unreviewed] Pay for the time worked in a period split into multiplier bands: basic, time and a half after 40 hours, double time. :: fn overtimePay(minutesWorked: int, hourlyRate: Money, bands: OvertimeBand[]) -> OvertimePay - payroll.pension-auto-enrolment@1.0.2 [unreviewed] Workplace pension contributions for one pay period: qualifying earnings band, employee and employer shares, tax relief. :: fn pensionContributions(earnings: Money, frequency: PayFrequency, scheme: PensionScheme, payDate: date) -> PensionContributions - payroll.pro-rata-salary@1.0.1 [unreviewed] Salary for part of a pay period and for part-time hours, by calendar days or working days, rounded once. :: fn proRataSalary(periodSalary: Money, fteBasisPoints: int, periodStart: date, periodEnd: date, workedFrom: date, workedTo: date, method: ProRataMethod, holidays: date[]) -> ProRata - payroll.redundancy-pay@1.0.1 [unreviewed] Statutory redundancy pay from age, completed years of service (at most 20) and a week's pay capped by date. :: fn statutoryRedundancyPay(birthDate: date, startDate: date, relevantDate: date, weeklyPay: Money) -> RedundancyPay - payroll.statutory-maternity-pay@1.0.1 [unreviewed] UK Statutory Maternity Pay: LEL eligibility and 39 weekly amounts, 90% then the lower of 90% or the flat rate. :: fn statutoryMaternityPay(averageWeeklyEarnings: Money, dueDate: date, payStart: date) -> MaternityPay - payroll.statutory-sick-pay@1.0.1 [unreviewed] UK Statutory Sick Pay for sickness spells: waiting days, 8-week linking, 28-week limit and the rate by date. :: fn statutorySickPay(periods: SicknessPeriod[], qualifyingWeekdays: int[], normalWeeklyEarnings: Money) -> SickPay - payroll.student-loan@1.0.2 [unreviewed] Student loan or postgraduate loan deduction from one period's pay, by plan, rounded down to whole pounds. :: fn studentLoan(earnings: Money, plan: StudentLoanPlan, frequency: PayFrequency, payDate: date) -> Money - payroll.tax-code-parse@1.0.2 [unreviewed] Parse a UK PAYE tax code (1257L, K475, BR, D0, NT, 0T, S and C prefixes, W1/M1/X) into its allowance and flags. :: fn parseTaxCode(code: string) -> TaxCode - payroll.tax-period@1.0.1 [unreviewed] The UK PAYE tax week, tax month and payroll period number that a pay date falls in, weeks 53, 54 and 56 included. :: fn taxPeriod(payDate: date, frequency: PayFrequency) -> TaxPeriod - professional.utilisation@1.0.0 [stable] Billable utilisation and billing, collection and overall realisation rates, in basis points. :: fn utilisationRates(billableMinutes: int, availableMinutes: int, standardValue: Money, billedValue: Money, collectedValue: Money) -> UtilisationRates - professional.wip-valuation@1.0.0 [stable] Value unbilled time (work in progress) at cost or charge-out rates, less a write-down percentage. :: fn wipValuation(entries: WipEntry[], basis: WipBasis, writeDownBasisPoints: int, currency: string) -> WipValuation - property.completion-statement@1.0.1 [unreviewed] A buyer's completion statement: price less deposit, ground rent and service charge apportioned to completion, plus fees. :: fn completionStatement(price: Money, depositPaid: Money, completionDate: date, apportionments: PeriodCharge[], fees: FeeLine[]) -> CompletionStatement - property.council-tax-band@1.0.2 [unreviewed] Council tax for a valuation band from the Band D charge: the statutory band ratio, England, Wales and Scotland. :: fn councilTaxBand(bandDCharge: Money, band: string, nation: string, onDate: date) -> CouncilTaxBandCharge - property.deposit-cap@1.0.2 [unreviewed] Maximum tenancy deposit a landlord may take: five or six weeks' rent under the Tenant Fees Act 2019. :: fn depositCap(rent: Money, rentPeriod: RentPeriod, jurisdiction: string, onDate: date) -> DepositCap - property.floor-area@1.0.2 [unreviewed] Floor area from room lengths and widths, exactly, with the total in both square metres and square feet. :: fn floorArea(rooms: RoomDimensions[], lengthUnit: FloorAreaUnit, decimals: int) -> FloorArea - property.holding-deposit-cap@1.0.1 [unreviewed] Maximum holding deposit to reserve a rental property: one week's rent (annual rent ÷ 52), rounded down. :: fn holdingDepositCap(rent: Money, rentPeriod: RentPeriod) -> Money - property.mortgage-affordability@1.0.1 [unreviewed] Mortgage affordability: the loan-to-income multiple and a stress-tested repayment against income, both checked. :: fn mortgageAffordability(annualIncome: Money, monthlyCommitments: Money, loan: Money, annualRateBasisPoints: int, stressRateBasisPoints: int, termMonths: int, maxIncomeMultipleBasisPoints: int, maxDebtToIncomeBasisPoints: int) -> MortgageAffordability - property.rent-proration@1.0.1 [unreviewed] Rent for part of a month from the monthly rent, by the annual-daily or the calendar-month method. :: fn prorateRent(monthlyRent: Money, fromDate: date, toDate: date, method: RentProrationMethod) -> Money - property.rent-review@1.0.1 [unreviewed] New rent after an index-linked (CPI/RPI) rent review, with an optional collar and cap and upward-only option. :: fn rentReview(passingRent: Money, baseIndex: int, reviewIndex: int, collarBasisPoints: int?, capBasisPoints: int?, upwardOnly: bool) -> RentReviewResult - property.rental-yield@1.0.1 [unreviewed] Gross and net rental yield of a let property, in basis points, from annual rent, costs and value. :: fn rentalYield(annualRent: Money, annualCosts: Money, propertyValue: Money) -> RentalYield - property.service-charge-apportion@1.0.1 [unreviewed] Apportion a service charge across units by lease fraction, floor area or fixed percentage, exact to the penny. :: fn apportionServiceCharge(total: Money, units: ServiceChargeUnit[], basis: ApportionBasis) -> ServiceChargeLine[] - property.stamp-duty@1.0.2 [unreviewed] Stamp duty on a property purchase: SDLT (England, NI), LBTT (Scotland), LTT (Wales), with reliefs and surcharges. :: fn stampDuty(purchase: StampDutyPurchase) -> StampDutyResult - react.form.button@1.0.1 [stable] (react) A form button in primary, secondary or warning style that stays focusable while loading (GOV.UK button). :: fn Button(props: ButtonProps) -> element - react.form.checkbox@1.0.1 [stable] (react) One checkbox with its label beside it, such as "I agree to the terms" (GOV.UK single checkbox). :: fn Checkbox(props: CheckboxProps) -> element - react.form.checkbox-group@1.0.1 [stable] (react) A question answered by ticking any of several checkboxes, with item hints and an exclusive "None" (GOV.UK checkboxes). :: fn toggleValue(options: CheckboxOption[], values: string[], value: string, checked: bool) -> string[]; fn CheckboxGroup(props: CheckboxGroupProps) -> element - react.form.date-input@1.0.1 [stable] (react) Day, month and year boxes under one legend, with hint, error message and the boxes in error marked (GOV.UK date input). :: fn DateInput(props: DateInputProps) -> element - react.form.error-summary@1.0.1 [stable] (react) A "There is a problem" box linking to each field in error, focused on arrival, built from a validator's fields (GOV.UK). :: fn errorSummaryItems(fields: map, order: string[], targets: map) -> ErrorSummaryItem[]; fn ErrorSummary(props: ErrorSummaryProps) -> element - react.form.fieldset@1.0.1 [stable] (react) Group related inputs under a legend, with a hint and error message described to the whole group (GOV.UK fieldset). :: fn Fieldset(props: FieldsetProps) -> element - react.form.form-field@1.0.1 [stable] (react) Wire a label, hint and error message to one form control by id, the accessible way (GOV.UK form group pattern). :: fn fieldIds(id: string, hasHint: bool, hasError: bool) -> FieldIds; fn FormField(props: FormFieldProps) -> element - react.form.password-field@1.0.1 [stable] (react) A password input with a Show/Hide button and an optional live checklist of a password policy (GOV.UK password input). :: fn passwordChecklist(policy: PasswordPolicy, check: PasswordCheck) -> PasswordChecklistItem[]; fn PasswordField(props: PasswordFieldProps) -> element - react.form.radio-group@1.0.1 [stable] (react) Choose exactly one of several radios, with item hints, an "or" divider and inline yes/no (GOV.UK radios). :: fn RadioGroup(props: RadioGroupProps) -> element - react.form.select@1.0.1 [stable] (react) A labelled drop-down list with a hint, error message and an optional empty first option (GOV.UK select). :: fn Select(props: SelectProps) -> element - react.form.styles@1.0.1 [stable] (react) An optional stylesheet for the react.form elements' caps-* classes, themed by --caps-form-* custom properties. :: fn formStyles(theme: FormTheme) -> string - react.form.text-field@1.0.1 [stable] (react) A labelled single-line text input with hint, error message, autocomplete, prefix and suffix (GOV.UK text input). :: fn TextField(props: TextFieldProps) -> element - react.form.textarea@1.0.1 [stable] (react) A labelled multi-line text box with hint, error and an optional live character or word count (GOV.UK). :: fn Textarea(props: TextareaProps) -> element - retail.basket-total@1.0.0 [stable] Total a basket: line prices, promotions, a basket discount, VAT per line and delivery, into one checked total. :: fn basketTotal(lines: BasketLine[], promotions: Promotion[], basketDiscount: Money, delivery: Money, deliveryTaxCategory: string, pricesIncludeVat: bool, jurisdiction: string, onDate: date) -> Basket - retail.coupon-validate@1.0.1 [stable] Check a coupon against a basket: dates, usage limits, eligible products and minimum spend, with reason codes. :: fn validateCoupon(coupon: Coupon, lines: CouponLine[], customerUses: int, onDate: date) -> CouponCheck - retail.gift-card-balance@1.0.0 [stable] Apply a payment from a gift card, redeeming part of the balance or all of it, and say what is still due. :: fn redeemGiftCard(balance: Money, amountDue: Money) -> GiftCardRedemption - retail.loyalty-points@1.0.0 [stable] Loyalty points for a purchase: redeem in blocks, earn on what is paid, with tier multipliers. :: fn loyaltyPoints(scheme: LoyaltyScheme, spend: Money, qualifyingSpend: Money, balance: int, redeemPoints: int) -> LoyaltyOutcome - retail.oss-vat@1.0.1 [stable] EU distance-selling VAT: which member state's standard rate applies under OSS and the EUR 10,000 threshold, and the VAT. :: fn ossVat(net: Money, sellerCountry: string, customerCountry: string, euSalesPreviousYear: Money, euSalesThisYear: Money, optedIn: bool, onDate: date) -> OssVat - retail.price-per-unit@1.0.1 [stable] Unit price for shelf-edge labels: price per kg, per 100 g, per litre, per 100 ml, per metre or per item. :: fn unitPrice(price: Money, quantity: string, unit: string, per: UnitPriceBasis) -> Money - retail.price-rounding@1.0.0 [stable] Snap a price to a price point: charm pricing (.99, .95), nearest 5p or 10p, rounding up, down or to nearest. :: fn roundPrice(price: Money, step: int, ending: int, direction: PriceDirection) -> Money - retail.promotion-apply@1.0.0 [stable] Apply BOGOF, 3-for-2, percent off, amount off and multibuy deals to a basket, best for the customer, allocated to lines. :: fn applyPromotions(lines: PromoLine[], promotions: Promotion[]) -> PromotionResult - retail.refund-calculate@1.0.0 [stable] Refund for returned items, sharing basket discounts back across the sale so every refund is exact to the penny. :: fn calculateRefund(lines: SaleLine[], basketDiscount: Money, returns: ReturnLine[]) -> Refund - retail.sales-tax-us@1.1.1 [unreviewed] US sales tax on a sale: the state's base rate from dated data plus a local rate the caller supplies. :: fn salesTaxUs(amount: Money, state: string, localRatePerMillion: int, onDate: date) -> UsSalesTax - retail.shipping-rate@1.0.1 [stable] Delivery charge from a dated rate table by service, zone, chargeable weight and size, with a free-over threshold. :: fn shippingRate(bands: ShippingBand[], service: string, zone: string, parcel: Parcel, basketTotal: Money, onDate: date) -> ShippingQuote - retail.sku-generate@1.0.0 [stable] Build a deterministic stock-keeping unit code from a prefix and product attributes. :: fn generateSku(prefix: string, attributes: string[], segmentLength: int) -> string - retail.volumetric-weight@1.0.0 [stable] Chargeable parcel weight: the greater of actual and volumetric (dimensional) weight, rounded up to a billing step. :: fn chargeableWeight(lengthMm: int, widthMm: int, heightMm: int, actualGrams: int, divisor: int, roundUpToGrams: int) -> ChargeableWeight - stats.mean-median@1.0.0 [stable] Mean, median and mode of a list of integers, with the mean and median as exact fractions. :: fn meanMedianMode(values: int[]) -> CentralTendency - stats.moving-average@2.0.0 [stable] Simple or exponential moving average over a series, one value per full window, rounded to stated decimals. :: fn movingAverage(values: float[], window: int, kind: MovingAverageKind, decimals: int) -> float[] - stats.percentile@2.0.0 [stable] Percentile of a list of numbers by a named method: nearest-rank, or linear interpolation (R-7, Excel PERCENTILE.INC). :: fn percentile(values: float[], p: float, method: PercentileMethod, decimals: int) -> float - stats.standard-deviation@2.0.0 [stable] Population or sample standard deviation of a list of numbers, two-pass, rounded to stated decimals. :: fn standardDeviation(values: float[], kind: DeviationKind, decimals: int) -> float - stats.weighted-average@1.0.0 [stable] Weighted average of integers, computed exactly and rounded once to stated decimals with an explicit rounding mode. :: fn weightedAverage(values: int[], weights: int[], decimals: int, mode: RoundingMode) -> float - subscriptions.churn@1.0.0 [stable] Logo churn, gross and net revenue churn, and gross and net revenue retention for one period, in basis points. :: fn churnMetrics(customersAtStart: int, customersLost: int, mrrAtStart: Money, expansionMrr: Money, contractionMrr: Money, churnedMrr: Money) -> ChurnMetrics - subscriptions.dunning-schedule@1.0.0 [stable] Retry dates for a failed subscription payment from a retry policy, in calendar or business days. :: fn dunningSchedule(failedOn: date, retryOffsetsDays: int[], businessDays: bool, holidays: date[]) -> date[] - subscriptions.invoice@1.0.0 [stable] A subscription renewal invoice: plan, add-ons and usage, coupon discounts by billing period, and VAT. :: fn renewalInvoice(plan: InvoiceLine, addOns: InvoiceLine[], usage: InvoiceLine[], discounts: Discount[], periodNumber: int, jurisdiction: string, invoiceDate: date) -> Invoice - subscriptions.ltv-cac@1.0.0 [stable] Customer lifetime value, LTV to CAC ratio and CAC payback months from ARPA, gross margin, churn and CAC. :: fn ltvCac(arpa: Money, grossMarginBasisPoints: int, monthlyChurnBasisPoints: int, cac: Money) -> LtvCac - subscriptions.mrr-arr@1.1.0 [stable] Monthly and annual recurring revenue from a list of subscriptions, normalising intervals and leaving out trials. :: fn mrrArr(subscriptions: RecurringCharge[], currency: string) -> MrrArr - subscriptions.next-billing-date@1.0.0 [stable] The next renewal date after a given day, from a billing anchor and interval; month-end safe. :: fn nextBillingDate(anchorDate: date, interval: BillingInterval, intervalCount: int, afterDate: date) -> date - subscriptions.proration@1.0.0 [stable] Mid-cycle plan change: credit for unused time on the old plan and charge for the rest of the period on the new one. :: fn prorateChange(oldPrice: Money, newPrice: Money, periodStart: date, periodEnd: date, changeDate: date, mode: RoundingMode) -> PlanChangeProration - subscriptions.trial-end@1.0.0 [stable] When a free trial ends and the first payment is due, from the trial's start date and length in days. :: fn trialEnd(startDate: date, trialDays: int) -> TrialPeriod - subscriptions.usage-tiered@1.0.0 [stable] Price metered usage against tiers, graduated or volume, with an optional flat fee per tier. :: fn priceUsage(quantity: int, tiers: UsageTier[], mode: TierMode) -> UsageCharge - telecoms.call-rating@1.0.1 [stable] Rate a call from a rate deck: longest-prefix destination match, billing increments, connection fee and minimum charge. :: fn rateCall(dialledNumber: string, durationSeconds: int, rates: CallRate[], mode: RoundingMode) -> RatedCall - telecoms.data-allowance@1.0.0 [stable] Mobile data allowance used and remaining, and the overage charge in whole blocks with an optional spend cap. :: fn dataAllowance(allowance: int, used: int, overageBlock: int, pricePerBlock: Money, overageCap: Money?) -> DataAllowance - telecoms.roaming-charge@1.0.1 [stable] Roaming charges for a trip abroad from a dated tariff table of zones: daily fees, data, calls and texts. :: fn roamingCharge(tariff: string, country: string, onDate: date, usage: RoamingUsage) -> RoamingCharge - text.format-decimal@1.0.0 [stable] Format a float as plain decimal text with fixed or trimmed places and optional grouping, identically in every language. :: fn formatDecimal(value: float, decimals: int, trimZeros: bool, groupSeparator: string) -> string - text.initials@1.0.0 [stable] Initials from a personal name for avatars and signatures: "Jean-Paul Sartre" is "JPS". :: fn initials(name: string) -> string - text.integer-to-words@1.0.0 [stable] Spell out a whole number in British English words, with "and" the way a cheque writes it. :: fn integerToWords(value: int) -> string - text.mask@1.0.0 [stable] Mask all but the last n characters of a card, account or phone number, optionally keeping separators. :: fn mask(value: string, visible: int, maskChar: string, keepSeparators: bool) -> string - text.normalise-name@1.0.0 [stable] Tidy a personal name: trim, collapse whitespace and title-case, with Mc, Mac, O', hyphen and van/de rules. :: fn normaliseName(value: string) -> string - text.number-to-words@1.0.0 [stable] Write a money amount in words for a cheque: "one thousand two hundred and thirty-four pounds and fifty-six pence". :: fn amountInWords(amount: Money) -> string - text.slugify@1.0.0 [stable] Turn a title into a lowercase ASCII URL slug, transliterating common accented Latin letters. :: fn slugify(value: string) -> string - text.truncate@1.0.0 [stable] Shorten text to a maximum length on a word boundary and add an ellipsis, counting Unicode code points. :: fn truncate(value: string, maxLength: int, ellipsis: string) -> string - time.countdown@1.0.0 [stable] Seconds left until a Unix time, whether it has passed, and a timer text like 4:05, for tokens or retry waits. :: fn countdown(until: int, now: int) -> Countdown - time.duration@1.0.0 [stable] Parse durations written as 1h30m, 90m or 01:30, add them up in whole minutes, and format the total. :: fn duration(parts: string[]) -> Duration - time.iso-to-unix@1.0.0 [stable] An RFC 3339 timestamp with a Z or offset, such as 2026-09-26T13:00:00+01:00, to Unix time in whole seconds. :: fn isoToUnix(timestamp: string) -> int - time.minutes-between@1.0.0 [stable] Minutes from one local date and time to another, correct across midnight; wall-clock time, no time zones. :: fn minutesBetween(startDate: date, startTime: string, endDate: date, endTime: string) -> int - time.round-to-increment@1.0.0 [stable] Round a duration in minutes to a billing increment such as 6 or 15 minutes, up, down or to nearest. :: fn roundToIncrement(minutes: int, increment: int, mode: RoundingMode) -> int - time.unix-to-iso@1.0.0 [stable] Unix time in seconds to an ISO 8601 UTC timestamp such as 2026-09-26T12:00:00Z, for years 0001 to 9999. :: fn unixToIso(seconds: int) -> string - todo.due-label@1.0.0 [stable] The short English label shown next to a todo: "2 days overdue", "Due today", "Due tomorrow", "Due Fri 2 Oct". :: fn dueLabel(todo: Todo, today: date) -> string - todo.due-status@1.0.0 [stable] Where a todo stands against its due date today: done, overdue, today, tomorrow, this week, later or no date. :: fn dueStatus(todo: Todo, today: date) -> DueStatus - todo.export-csv@1.0.0 [stable] Write todos as a CSV file (RFC 4180) with one column per field, for backups, spreadsheets and other apps. :: fn exportCsv(todos: Todo[]) -> string - todo.filter@1.0.0 [stable] The todos a list view shows: all, active or completed, optionally one tag, and a search box, in input order. :: fn filterTodos(todos: Todo[], filter: TodoFilter) -> Todo[] - todo.group-by-due@1.1.0 [stable] Split todos into Overdue, Today, Tomorrow, This week, Later, No date and Done sections, in that order. :: fn groupByDue(todos: Todo[], today: date) -> DueGroup[]; fn groupByDueWithOrder(todos: Todo[], today: date, order: SectionOrder) -> DueGroup[] - todo.import-csv@1.1.0 [stable] Read todos from a CSV file (RFC 4180) as todo.export-csv writes it, checking every row, with row-numbered errors. :: fn importCsv(csv: string) -> Todo[]; fn validateTodoCsv(csv: string) -> CsvValidation - todo.item@1.0.0 [stable] The to-do item type (Todo, TodoDraft, Recurrence) and its validators, with a message per field. :: fn validateDraft(draft: TodoDraft) -> TodoValidation; fn validateTodo(todo: Todo) -> TodoValidation - todo.list@1.1.0 [stable] The to-do list reducer: add, edit, complete, remove, clear and reorder todos, each returning a new list. :: fn addTodo(todos: Todo[], draft: TodoDraft, id: string, now: string) -> Todo[]; fn updateTodo(todos: Todo[], id: string, draft: TodoDraft) -> Todo[]; fn toggleTodo(todos: Todo[], id: string, now: string, today: date) -> Todo[]; fn removeTodo(todos: Todo[], id: string) -> Todo[]; fn clearCompleted(todos: Todo[]) -> Todo[]; fn toggleAll(todos: Todo[], now: string, today: date) -> Todo[]; fn moveTodo(todos: Todo[], id: string, toIndex: int) -> Todo[]; fn toggleAllMode(todos: Todo[]) -> ToggleAllMode - todo.merge@1.0.0 [stable] Merge imported todos into a list by id: an imported todo replaces the one with its id, new ids are appended. :: fn mergeTodos(current: Todo[], incoming: Todo[]) -> Todo[] - todo.next-occurrence@1.0.0 [stable] The next due date of a repeating todo once it is done: daily, weekdays, weekly, monthly or yearly, month-end safe. :: fn nextOccurrence(recurrence: Recurrence, due: date, today: date) -> date - todo.normalise-tags@1.0.0 [stable] Clean up tags as typed: trim, drop the #, lower-case slug form, drop empties and duplicates, keep the order. :: fn normaliseTags(tags: string[]) -> string[] - todo.parse-date-phrase@1.0.0 [stable] Read a typed due date like "tomorrow", "next friday", "in 2 weeks" or "2026-10-01" as a date, relative to today. :: fn parseDatePhrase(text: string, today: date) -> date? - todo.parse-quick-add@1.0.0 [stable] Turn one typed line like "Pay rent tomorrow !high #home every month" into a todo draft. :: fn parseQuickAdd(text: string, today: date) -> TodoDraft - todo.parse-repeat@1.0.0 [stable] Read a Repeat box, "every 2 weeks" or "every monday on 2026-10-05", as a todo's recurrence, or null. :: fn parseRepeat(text: string, due: date?, today: date) -> Recurrence? - todo.parse-tags@1.0.0 [stable] Read a tags box as typed, "#Home, work errands", into normalised tags: split on spaces and commas. :: fn parseTags(text: string) -> string[] - todo.recurrence-label@1.0.0 [stable] English text for a repeating todo's chip: "Every weekday", "Every 2 weeks on Monday", "Every month on the 31st". :: fn recurrenceLabel(recurrence: Recurrence) -> string - todo.reschedule-recurrence@1.0.0 [stable] When a repeating todo's due date is moved by hand, move its series with it: the new date becomes the anchor. :: fn rescheduleRecurrence(recurrence: Recurrence?, fromDue: date?, toDue: date?) -> Recurrence? - todo.sort@1.0.0 [stable] Sort todos by manual order, due date, priority, creation time or title, stably, with sensible tie-breakers. :: fn sortTodos(todos: Todo[], by: TodoSortKey, direction: SortDirection) -> Todo[] - todo.summary@1.0.0 [stable] Counts for a todo list's header or footer: total, active, done, overdue, due today, percent done and "3 items left". :: fn summariseTodos(todos: Todo[], today: date) -> TodoSummary - todo.tag-counts@1.0.0 [stable] How many todos carry each tag, for a tag sidebar: most used first, open todos only unless asked. :: fn tagCounts(todos: Todo[], includeDone: bool) -> TagCount[] - units.convert@1.0.0 [stable] Convert length, mass, area, volume, temperature and energy between units, exactly, as decimal text. :: fn convertUnits(value: string, fromUnit: string, toUnit: string, decimals: int) -> string - units.parse-quantity@1.0.0 [stable] Parse "2.5 kg", "1,200 m" or "12 ft 6 in" into an exact decimal value and a canonical unit symbol, strictly. :: fn parseQuantity(text: string) -> Quantity - validation.bic@1.0.0 [stable] Check the format of a SWIFT/BIC code (8 or 11 characters) and split it into its parts. :: fn validateBic(value: string) -> BicCheck - validation.email@1.0.0 [stable] Is this a plausible email address? A documented, pragmatic subset of RFC 5322, not the full grammar. :: fn isEmail(value: string) -> bool - validation.gs1-check-digit@1.0.0 [stable] Compute or check the GS1 mod-10 check digit of any GS1 key: GTIN, SSCC, GLN, GSRN, GDTI, GSIN and the rest. :: fn gs1CheckDigit(data: string) -> int; fn isGs1CheckDigitValid(key: string) -> bool - validation.gtin@1.1.0 [stable] Check an EAN-8, UPC-A, EAN-13 or GTIN-14 barcode number against the GS1 mod-10 check digit. :: fn validateGtin(value: string) -> GtinCheck - validation.iban@1.0.0 [stable] Check an IBAN against the ISO 13616 mod-97-10 checksum and the registered length for its country. :: fn isIban(value: string) -> bool - validation.isbn@1.0.0 [stable] Check an ISBN-10 or ISBN-13 and convert between them; the normalised form is always the ISBN-13. :: fn validateIsbn(value: string) -> IsbnCheck - validation.lei@1.0.0 [stable] Check a 20-character Legal Entity Identifier against its ISO 17442 / ISO 7064 MOD 97-10 check digits. :: fn validateLei(value: string) -> LeiCheck - validation.luhn@1.0.0 [stable] Check a digit string against the Luhn mod-10 checksum used by payment cards and many identifiers. :: fn isLuhn(value: string) -> bool - validation.nhs-number@2.0.0 [stable] Check an NHS number's modulus 11 check digit and normalise it to ten digits. :: fn validateNhsNumber(value: string) -> NhsNumber - validation.phone-e164@2.0.0 [stable] Normalise a phone number to E.164 (+447700900123) using a default country's trunk and dialling prefixes. :: fn validatePhoneE164(value: string, defaultCountry: string) -> PhoneE164 - validation.uk-company-number@2.0.1 [stable] Check a Companies House company number's format and prefix (SC, NI, OC, LP...) and zero-pad it to eight characters. :: fn validateUkCompanyNumber(value: string) -> UkCompanyNumber - validation.uk-modulus-table@1.0.0 [stable] Parse Vocalink's VALACDOS.txt and SCSUBTAB.txt into the table UK sort code modulus checking needs. :: fn parseUkModulusTable(valacdos: string, scsubtab: string) -> UkModulusTable - validation.uk-ni-number@2.0.0 [stable] Check a UK National Insurance number's format and HMRC's disallowed prefix letters, and normalise it. :: fn validateUkNiNumber(value: string) -> UkNiNumber - validation.uk-postcode@2.0.0 [stable] Validate a UK postcode and normalise it to canonical upper case with one space before the inward code. :: fn validateUkPostcode(value: string) -> UkPostcode - validation.uk-sort-code-account@3.0.0 [stable] Check a UK sort code and account number with the Vocalink/Pay.UK modulus rules, against a table you supply. :: fn validateUkSortCodeAccount(sortCode: string, accountNumber: string, table: UkModulusTable) -> UkSortCodeAccount - validation.uk-utr@2.0.1 [stable] Check an HMRC Unique Taxpayer Reference's modulus 11 check digit, accepting the K and spacing people type. :: fn validateUkUtr(value: string) -> UkUtr - validation.uk-vat-number@1.0.0 [stable] Check a UK VAT registration number against HMRC's mod-97 checksum, including the post-2010 9755 variant. :: fn isUkVatNumber(value: string) -> bool - validation.vin@1.0.0 [stable] Check a 17-character vehicle identification number and its check digit; enforced for North American VINs. :: fn validateVin(value: string) -> VinCheck # Suites > 34 suites: the capabilities a kind of app is built from. One per line: id: title - summary :: core capabilities (with what it includes) :: gaps, what Functional Weave does not cover. plan_app on the MCP server matches a description to them; https://functionalweave.com/v1/suites/ gives one in full. - accounting: Accounting and bookkeeping - Books for a small business: invoices and credit notes, VAT, double-entry journals, payment terms and debtors, bank reconciliation and period-end. :: core (includes money-basics, dates-basics, uk-tax, validation-basics): finance.invoice.calculate, finance.invoice.line-total, finance.credit-note.calculate, finance.tax.add-vat, finance.tax.remove-vat, finance.tax.vat-return, finance.ledger.journal-validate, finance.ledger.trial-balance, finance.payment-terms-due-date, finance.bank-reconcile-match, finance.aged-debt, money.amount, money.add, money.sum, money.compare, money.apply-rate, math.round-div, money.allocate, money.format, dates.add-days, dates.add-months, dates.days-between, dates.month-boundaries, dates.day-of-week, dates.quarter, dates.bank-holidays, dates.add-business-days, dates.business-days-between, finance.tax.vat-rate, dates.uk-tax-year, validation.uk-vat-number, validation.email, validation.phone-e164, validation.uk-postcode, validation.iban :: gaps: invoice-numbering, pdf-invoices, chart-of-accounts, period-locking, bank-feeds, payment-collection, financial-statements, multi-user-access, fx-rate-source, money-storage, time-zones, locale-formatting, non-uk-holidays, mtd-submission, corporation-tax, vat-number-lookup, address-lookup, email-deliverability, vocalink-data - agriculture: Agriculture and farm management - Run a farm: field areas, seed, fertiliser and spray rates, yields, livestock stocking rates, feed rations, milk price, gross margins and growing degree days. :: core (includes money-basics, dates-basics): agri.field-area, agri.seed-rate, agri.fertiliser-application, agri.yield-per-hectare, agri.stocking-rate, agri.feed-ration, agri.gross-margin, money.amount, money.add, money.sum, money.compare, money.apply-rate, math.round-div, money.allocate, money.format, dates.add-days, dates.add-months, dates.days-between, dates.month-boundaries, dates.day-of-week, dates.quarter, dates.bank-holidays, dates.add-business-days, dates.business-days-between :: gaps: mapping, weather-data, nutrient-planning, animal-records, subsidy-schemes, fx-rate-source, money-storage, time-zones, locale-formatting, non-uk-holidays - auth: User accounts and authentication - Sign-up and login forms, password policy and hashing, login lockout, and signed access tokens (JWT) read from the Authorization header. :: core (includes validation-basics): auth.validate-registration, auth.validate-login, auth.normalise-email, auth.password-policy, auth.password-hash, auth.login-throttle, auth.access-token, auth.bearer-token, validation.email, validation.phone-e164, validation.uk-postcode, validation.iban :: gaps: breached-passwords, ip-rate-limiting, sessions, asymmetric-jwt, email-verification, oauth-social-login, mfa, roles-permissions, user-storage, address-lookup, email-deliverability, vocalink-data - banking: Banking and payments - Bank accounts and payments: overdraft interest, savings AER, monthly fee caps, Bacs dates, Faster Payments limits, payee checks and cheque wording. :: core (includes money-basics, dates-basics, validation-basics): banking.overdraft-interest, banking.savings-aer, banking.fees-cap, banking.faster-payments-limit, banking.bacs-processing-date, money.amount, money.add, money.sum, money.compare, money.apply-rate, math.round-div, money.allocate, money.format, dates.add-days, dates.add-months, dates.days-between, dates.month-boundaries, dates.day-of-week, dates.quarter, dates.bank-holidays, dates.add-business-days, dates.business-days-between, validation.email, validation.phone-e164, validation.uk-postcode, validation.iban :: gaps: payment-rails, confirmation-of-payee, categorisation, kyc-aml, ledger-of-record, card-issuing, fx-rate-source, money-storage, time-zones, locale-formatting, non-uk-holidays, address-lookup, email-deliverability, vocalink-data - charity: Charity and fundraising - Donations for a UK charity: Gift Aid eligibility and claims, small donations, regular giving schedules, matched giving, payroll giving and restricted fund accounting. :: core (includes money-basics, dates-basics, validation-basics): charity.gift-aid-eligibility, charity.gift-aid, charity.regular-giving-schedule, charity.reclaim-batch, charity.restricted-funds, money.amount, money.add, money.sum, money.compare, money.apply-rate, math.round-div, money.allocate, money.format, dates.add-days, dates.add-months, dates.days-between, dates.month-boundaries, dates.day-of-week, dates.quarter, dates.bank-holidays, dates.add-business-days, dates.business-days-between, validation.email, validation.phone-e164, validation.uk-postcode, validation.iban :: gaps: declarations, online-payments, charities-online, sorp-accounts, donor-consent, fx-rate-source, money-storage, time-zones, locale-formatting, non-uk-holidays, address-lookup, email-deliverability, vocalink-data - construction: Construction and trades - For builders, trades and contractors: quotes, materials take-offs, valuations with retention, CIS deductions, VAT reverse charge and Construction Act payment dates. :: core (includes money-basics, dates-basics, uk-tax): construction.day-rate-quote, construction.materials-area, construction.valuation, construction.retention, construction.cis-deduction, construction.vat-reverse-charge, construction.payment-notice-dates, money.amount, money.add, money.sum, money.compare, money.apply-rate, math.round-div, money.allocate, money.format, dates.add-days, dates.add-months, dates.days-between, dates.month-boundaries, dates.day-of-week, dates.quarter, dates.bank-holidays, dates.business-days-between, finance.tax.vat-rate, finance.tax.add-vat, finance.tax.remove-vat, dates.uk-tax-year, validation.uk-vat-number :: gaps: quote-documents, supplier-prices, cis-verification, job-scheduling, health-and-safety, fx-rate-source, money-storage, time-zones, locale-formatting, non-uk-holidays, mtd-submission, corporation-tax, vat-number-lookup - dashboards: Dashboards and charts - Chart geometry as data in any language (scales, ticks, axes, lines, bars, pies, sparklines) plus the statistics and number formatting a dashboard shows. :: core (includes dates-basics): charts.line-chart, charts.bar-chart, charts.scale, charts.ticks, charts.axis, charts.palette, charts.format, dates.add-days, dates.add-months, dates.days-between, dates.month-boundaries, dates.day-of-week, dates.quarter, dates.bank-holidays, dates.add-business-days, dates.business-days-between :: gaps: rendering, interactivity, data-queries, pie-donut-chart, time-zones, locale-formatting, non-uk-holidays - dates-basics: Dates basics - Calendar arithmetic on ISO dates: add days and months, count days and working days, bank holidays, quarters, recurrence and durations. :: core: dates.add-days, dates.add-months, dates.days-between, dates.month-boundaries, dates.day-of-week, dates.quarter, dates.bank-holidays, dates.add-business-days, dates.business-days-between :: gaps: time-zones, locale-formatting, non-uk-holidays - ecommerce: Online shop and retail - Sell goods online or over the counter: basket totals with promotions and VAT, coupons, delivery charges, gift cards, loyalty points, refunds and product codes. :: core (includes money-basics, uk-tax, validation-basics): retail.sku-generate, validation.gtin, retail.basket-total, retail.promotion-apply, retail.coupon-validate, finance.tax.vat-rate, retail.shipping-rate, retail.volumetric-weight, retail.refund-calculate, money.amount, money.add, money.sum, money.compare, money.apply-rate, math.round-div, money.allocate, money.format, finance.tax.add-vat, finance.tax.remove-vat, dates.uk-tax-year, validation.uk-vat-number, validation.email, validation.phone-e164, validation.iban :: gaps: product-search, product-images, payment-processing, basket-storage, us-local-tax-rates, carrier-labels, stock-levels, order-emails, customer-accounts, fx-rate-source, money-storage, mtd-submission, corporation-tax, vat-number-lookup, address-lookup, email-deliverability, vocalink-data - education: Education and training - Schools, colleges and training: academic years and terms, year groups, attendance, grades and weighted marks, GPA and degree classes, timetable clashes, fees and CPD. :: core (includes dates-basics): education.academic-year, education.school-year-group, education.attendance-rate, education.grade-boundaries, education.weighted-grade, education.timetable-clash, dates.add-days, dates.add-months, dates.days-between, dates.month-boundaries, dates.day-of-week, dates.quarter, dates.bank-holidays, dates.add-business-days, dates.business-days-between :: gaps: registers, exam-board-data, timetable-generation, safeguarding, learning-content, time-zones, locale-formatting, non-uk-holidays - energy: Energy and utilities - Energy and water billing from meter reads: kWh, tariffs and time-of-use, the price cap, standing charges, CCL and VAT, estimated reads, solar, degree days and carbon. :: core (includes money-basics, dates-basics, uk-tax): energy.meter-advance, energy.gas-kwh, energy.estimate-read, energy.bill-calculate, money.amount, money.add, money.sum, money.compare, money.apply-rate, math.round-div, money.allocate, money.format, dates.add-days, dates.add-months, dates.days-between, dates.month-boundaries, dates.day-of-week, dates.quarter, dates.bank-holidays, dates.add-business-days, dates.business-days-between, finance.tax.vat-rate, finance.tax.add-vat, finance.tax.remove-vat, dates.uk-tax-year, validation.uk-vat-number :: gaps: smart-meter-data, scope-3, industry-flows, payment-plans, fx-rate-source, money-storage, time-zones, locale-formatting, non-uk-holidays, mtd-submission, corporation-tax, vat-number-lookup - fleet: Fleet management - Run a vehicle fleet: fuel and EV charging costs, mileage claims, company car tax, cost per mile and depreciation, servicing, emissions and drivers' hours. :: core (includes money-basics, dates-basics): validation.vin, fleet.service-due, fleet.fuel-cost, fleet.cost-per-mile, fleet.mileage-allowance, money.amount, money.add, money.sum, money.compare, money.apply-rate, math.round-div, money.allocate, money.format, dates.add-days, dates.add-months, dates.days-between, dates.month-boundaries, dates.day-of-week, dates.quarter, dates.bank-holidays, dates.add-business-days, dates.business-days-between :: gaps: mot-and-tax-checks, fuel-cards, tachograph-download, telematics, driver-licence-checks, fx-rate-source, money-storage, time-zones, locale-formatting, non-uk-holidays - forms-ui: Accessible React forms - GOV.UK-pattern form components for React (text, select, radios, checkboxes, dates, passwords, error summary) and the pure form state and checks behind them. :: core (includes validation-basics): form.state, react.form.form-field, react.form.text-field, react.form.button, react.form.error-summary, validation.email, validation.phone-e164, validation.uk-postcode, validation.iban :: gaps: other-frameworks, multi-step-flows, file-upload, autocomplete, submission, address-lookup, email-deliverability, vocalink-data - health-clinic: Health clinic and practice management - A clinic or practice: appointment slots, patient identifiers and ages, waiting times, and clinical calculators (BMI, BSA, eGFR, NEWS2, weight-based doses, gestational age). :: core (includes dates-basics, validation-basics): health.appointment-slots, validation.nhs-number, health.nhs-number-format, dates.age, health.bmi, dates.add-days, dates.add-months, dates.days-between, dates.month-boundaries, dates.day-of-week, dates.quarter, dates.bank-holidays, dates.add-business-days, dates.business-days-between, validation.email, validation.phone-e164, validation.uk-postcode, validation.iban :: gaps: appointment-reminders, clinician-calendars, patient-lookup, clinical-records, qrisk-score, prescribing, time-zones, locale-formatting, non-uk-holidays, address-lookup, email-deliverability, vocalink-data - hospitality: Hospitality: restaurants, cafes, bars and hotels - Front of house and kitchen for food service and hotels: bills and service charge, splitting the bill, tips, menu costing and allergens, room rates and occupancy. :: core (includes money-basics, dates-basics, uk-tax): hospitality.service-charge, hospitality.bill-split, hospitality.tronc-allocation, hospitality.recipe-cost, hospitality.gross-profit-menu, hospitality.allergen-matrix, hospitality.cancellation-charge, hospitality.room-rate, money.amount, money.add, money.sum, money.compare, money.apply-rate, math.round-div, money.allocate, money.format, dates.add-days, dates.add-months, dates.days-between, dates.month-boundaries, dates.day-of-week, dates.quarter, dates.bank-holidays, dates.add-business-days, dates.business-days-between, finance.tax.vat-rate, finance.tax.add-vat, finance.tax.remove-vat, dates.uk-tax-year, validation.uk-vat-number :: gaps: order-taking, card-payments, staff-rota, stock-control, table-availability, booking-notifications, room-inventory, fx-rate-source, money-storage, time-zones, locale-formatting, non-uk-holidays, mtd-submission, corporation-tax, vat-number-lookup - insurance: Insurance - General insurance from quote to claim: rating factors, IPT, instalments, mid-term changes, cancellations, no-claims discount, excess, underinsurance and reserves. :: core (includes money-basics, dates-basics, validation-basics): insurance.rating-factors, insurance.ipt, insurance.instalment-plan, insurance.mid-term-adjustment, insurance.premium-proration, insurance.excess-apply, insurance.claim-reserve, money.amount, money.add, money.sum, money.compare, money.apply-rate, math.round-div, money.allocate, money.format, dates.add-days, dates.add-months, dates.days-between, dates.month-boundaries, dates.day-of-week, dates.quarter, dates.bank-holidays, dates.add-business-days, dates.business-days-between, validation.email, validation.phone-e164, validation.uk-postcode, validation.iban :: gaps: risk-data, fraud-checks, earned-premium, policy-documents, renewal-pricing, fx-rate-source, money-storage, time-zones, locale-formatting, non-uk-holidays, address-lookup, email-deliverability, vocalink-data - inventory: Inventory and warehouse - Stock control and warehousing: reorder points, safety stock and order quantities, FIFO or weighted average valuation, ABC classes, cycle counts, expiry picking and pallets. :: core (includes money-basics, dates-basics): retail.sku-generate, validation.gtin, inventory.reorder-point, inventory.safety-stock, inventory.valuation-fifo, money.amount, money.add, money.sum, money.compare, money.apply-rate, math.round-div, money.allocate, money.format, dates.add-days, dates.add-months, dates.days-between, dates.month-boundaries, dates.day-of-week, dates.quarter, dates.bank-holidays, dates.add-business-days, dates.business-days-between :: gaps: barcode-scanning, stock-ledger, demand-forecasting, purchase-orders, bin-locations, fx-rate-source, money-storage, time-zones, locale-formatting, non-uk-holidays - investments: Investments and wealth - Portfolios and wealth: returns (TWR, XIRR, CAGR), weights and rebalancing, fees, yields, bonds, drawdown, and UK ISA, pension and capital gains tax. :: core (includes money-basics, dates-basics, uk-tax): invest.time-weighted-return, invest.money-weighted-return, invest.portfolio-weights, invest.rebalance, invest.isa-allowance, money.amount, money.add, money.sum, money.compare, money.apply-rate, math.round-div, money.allocate, money.format, dates.add-days, dates.add-months, dates.days-between, dates.month-boundaries, dates.day-of-week, dates.quarter, dates.bank-holidays, dates.add-business-days, dates.business-days-between, finance.tax.vat-rate, finance.tax.add-vat, finance.tax.remove-vat, dates.uk-tax-year, validation.uk-vat-number :: gaps: market-data, order-execution, cashflow-modelling, suitability, income-tax-dividends, fx-rate-source, money-storage, time-zones, locale-formatting, non-uk-holidays, mtd-submission, corporation-tax, vat-number-lookup - invoicing: Invoicing and billing - Raise invoices and credit notes with VAT per rate, set due dates from payment terms, chase late payers and track who owes what. :: core (includes money-basics, dates-basics, uk-tax, validation-basics): finance.invoice.calculate, finance.invoice.line-total, finance.credit-note.calculate, finance.tax.add-vat, finance.payment-terms-due-date, finance.aged-debt, money.amount, money.add, money.sum, money.compare, money.apply-rate, math.round-div, money.allocate, money.format, dates.add-days, dates.add-months, dates.days-between, dates.month-boundaries, dates.day-of-week, dates.quarter, dates.bank-holidays, dates.add-business-days, dates.business-days-between, finance.tax.vat-rate, finance.tax.remove-vat, dates.uk-tax-year, validation.uk-vat-number, validation.email, validation.phone-e164, validation.uk-postcode, validation.iban :: gaps: invoice-numbering, pdf-invoices, reminder-emails, payment-collection, bank-feeds, customer-records, fx-rate-source, money-storage, time-zones, locale-formatting, non-uk-holidays, mtd-submission, corporation-tax, vat-number-lookup, address-lookup, email-deliverability, vocalink-data - legal: Legal practice - Practice software for a law firm in England and Wales: conflict checks, limitation and court deadlines, time billing, client account retainers, disbursements, court fees and statutory interest. :: core (includes money-basics, dates-basics, uk-tax, validation-basics): legal.conflict-name-match, legal.limitation-date, legal.court-deadline, legal.time-billing, time.round-to-increment, finance.invoice.calculate, legal.retainer-drawdown, legal.disbursements-vat, money.amount, money.add, money.sum, money.compare, money.apply-rate, math.round-div, money.allocate, money.format, dates.add-days, dates.add-months, dates.days-between, dates.month-boundaries, dates.day-of-week, dates.quarter, dates.bank-holidays, dates.add-business-days, dates.business-days-between, finance.tax.vat-rate, finance.tax.add-vat, finance.tax.remove-vat, dates.uk-tax-year, validation.uk-vat-number, validation.email, validation.phone-e164, validation.uk-postcode, validation.iban :: gaps: aml-checks, diary-reminders, client-ledger, document-management, fx-rate-source, money-storage, time-zones, locale-formatting, non-uk-holidays, mtd-submission, corporation-tax, vat-number-lookup, address-lookup, email-deliverability, vocalink-data - lending: Lending and loans - Loans from quote to redemption: level repayments, amortisation schedules, APR, daily interest, overpayments, early settlement, affordability and LTV. :: core (includes money-basics, dates-basics, validation-basics): lending.loan-payment, lending.apr, lending.amortisation-schedule, lending.daily-interest, lending.early-settlement, lending.affordability, money.amount, money.add, money.sum, money.compare, money.apply-rate, math.round-div, money.allocate, money.format, dates.add-days, dates.add-months, dates.days-between, dates.month-boundaries, dates.day-of-week, dates.quarter, dates.bank-holidays, dates.add-business-days, dates.business-days-between, validation.email, validation.phone-e164, validation.uk-postcode, validation.iban :: gaps: credit-checks, open-banking-income, arrears-handling, direct-debit-mandates, agreement-documents, fx-rate-source, money-storage, time-zones, locale-formatting, non-uk-holidays, address-lookup, email-deliverability, vocalink-data - logistics: Logistics, shipping and freight - Ship goods: chargeable weight, freight and delivery rates, delivery dates, containers and pallets, labels, route distance, Incoterms, customs duty and demurrage. :: core (includes money-basics, dates-basics): retail.volumetric-weight, logistics.freight-rate, logistics.delivery-date, logistics.sscc, logistics.incoterm-responsibility, money.amount, money.add, money.sum, money.compare, money.apply-rate, math.round-div, money.allocate, money.format, dates.add-days, dates.add-months, dates.days-between, dates.month-boundaries, dates.day-of-week, dates.quarter, dates.bank-holidays, dates.add-business-days, dates.business-days-between :: gaps: carrier-apis, tracking, label-printing, route-optimisation, geocoding, tariff-lookup, customs-declarations, fx-rate-source, money-storage, time-zones, locale-formatting, non-uk-holidays - manufacturing: Manufacturing and production - Make things: explode and cost bills of materials, yield and scrap, batch sizes, takt time, capacity, OEE, standard cost variances, lot codes and tolerance checks. :: core (includes inventory, money-basics, dates-basics): manufacturing.bom-explode, manufacturing.bom-cost, manufacturing.yield-scrap, manufacturing.capacity, manufacturing.oee, manufacturing.lot-number, manufacturing.variance, retail.sku-generate, validation.gtin, inventory.reorder-point, inventory.safety-stock, inventory.valuation-fifo, money.amount, money.add, money.sum, money.compare, money.apply-rate, math.round-div, money.allocate, money.format, dates.add-days, dates.add-months, dates.days-between, dates.month-boundaries, dates.day-of-week, dates.quarter, dates.bank-holidays, dates.add-business-days, dates.business-days-between :: gaps: scheduling, mrp-run, machine-data, traceability, barcode-scanning, stock-ledger, demand-forecasting, purchase-orders, bin-locations, fx-rate-source, money-storage, time-zones, locale-formatting, non-uk-holidays - money-basics: Money basics - Amounts in integer minor units: add, total, apply rates, split without losing a penny, compare, format, parse and convert. :: core: money.amount, money.add, money.sum, money.compare, money.apply-rate, math.round-div, money.allocate, money.format :: gaps: fx-rate-source, money-storage - monitoring: Uptime monitoring and status pages - Turn probe results into up, degraded or down, incidents and uptime; drive a public status page; alert on thresholds, anomalies and SLO burn rates. :: core (includes dashboards, dates-basics): monitor.http-check-result, monitor.check-status, monitor.incidents, monitor.uptime, monitor.component-state, monitor.status-page, monitor.uptime-bars, monitor.alert-rule, monitor.alert-state, charts.line-chart, charts.bar-chart, charts.scale, charts.ticks, charts.axis, charts.palette, charts.format, dates.add-days, dates.add-months, dates.days-between, dates.month-boundaries, dates.day-of-week, dates.quarter, dates.bank-holidays, dates.add-business-days, dates.business-days-between :: gaps: probes, notifications, metrics-storage, scheduler, subscriber-updates, rendering, interactivity, data-queries, pie-donut-chart, time-zones, locale-formatting, non-uk-holidays - network-tools: Network tools and inventory - Parse and classify IPv4 and IPv6 addresses, CIDR and subnet maths, ports, MAC addresses and host names, and a network inventory with device status. :: core: net.ipv4, net.ipv6, net.ip-classify, net.cidr, net.hostname-validate, net.port, net.device-validate :: gaps: probing, ipv6-subnets, dns, discovery - payroll: Payroll and HR - UK payroll for a small employer: PAYE tax, National Insurance, pensions, student loans and statutory pay into a payslip, plus holiday, notice and absence rules. :: core (includes money-basics, dates-basics, validation-basics): validation.uk-ni-number, payroll.tax-code-parse, dates.age, payroll.tax-period, dates.uk-tax-year, payroll.pro-rata-salary, payroll.gross-to-net, payroll.income-tax, payroll.national-insurance, payroll.pension-auto-enrolment, payroll.student-loan, payroll.statutory-sick-pay, payroll.holiday-entitlement, money.amount, money.add, money.sum, money.compare, money.apply-rate, math.round-div, money.allocate, money.format, dates.add-days, dates.add-months, dates.days-between, dates.month-boundaries, dates.day-of-week, dates.quarter, dates.bank-holidays, dates.add-business-days, dates.business-days-between, validation.email, validation.phone-e164, validation.uk-postcode, validation.iban :: gaps: starter-leaver-forms, rti-submission, pension-provider-files, leave-requests, bacs-files, timesheets, fx-rate-source, money-storage, time-zones, locale-formatting, non-uk-holidays, address-lookup, email-deliverability, vocalink-data - professional-services: Professional services and time billing - Run a consultancy or agency on its time: record and round time, bill it at rate cards, value unbilled WIP, and report utilisation and realisation. :: core (includes money-basics, dates-basics, uk-tax): time.duration, time.round-to-increment, legal.time-billing, finance.invoice.calculate, professional.wip-valuation, professional.utilisation, money.amount, money.add, money.sum, money.compare, money.apply-rate, math.round-div, money.allocate, money.format, dates.add-days, dates.add-months, dates.days-between, dates.month-boundaries, dates.day-of-week, dates.quarter, dates.bank-holidays, dates.add-business-days, dates.business-days-between, finance.tax.vat-rate, finance.tax.add-vat, finance.tax.remove-vat, dates.uk-tax-year, validation.uk-vat-number :: gaps: timers, rate-cards, capacity-planning, projects-and-budgets, fx-rate-source, money-storage, time-zones, locale-formatting, non-uk-holidays, mtd-submission, corporation-tax, vat-number-lookup - property: Property and lettings - Lettings and property: rent proration and reviews, deposit caps, service charges, yields, stamp duty, council tax, mortgage affordability and completion statements. :: core (includes money-basics, dates-basics, validation-basics): property.rent-proration, property.deposit-cap, property.holding-deposit-cap, property.service-charge-apportion, property.stamp-duty, property.completion-statement, money.amount, money.add, money.sum, money.compare, money.apply-rate, math.round-div, money.allocate, money.format, dates.add-days, dates.add-months, dates.days-between, dates.month-boundaries, dates.day-of-week, dates.quarter, dates.bank-holidays, dates.add-business-days, dates.business-days-between, validation.email, validation.phone-e164, validation.uk-postcode, validation.iban :: gaps: deposit-protection, right-to-rent, property-data, maintenance-jobs, client-money, fx-rate-source, money-storage, time-zones, locale-formatting, non-uk-holidays, address-lookup, email-deliverability, vocalink-data - subscriptions: Subscriptions and SaaS billing - Recurring billing for a SaaS or subscription business: trials, renewal dates, prorated plan changes, metered usage, renewal invoices with coupons, dunning and MRR, churn and LTV. :: core (includes money-basics, dates-basics, uk-tax): subscriptions.trial-end, subscriptions.next-billing-date, subscriptions.proration, subscriptions.invoice, finance.invoice.calculate, subscriptions.dunning-schedule, subscriptions.mrr-arr, money.amount, money.add, money.sum, money.compare, money.apply-rate, math.round-div, money.allocate, money.format, dates.add-days, dates.add-months, dates.days-between, dates.month-boundaries, dates.day-of-week, dates.quarter, dates.bank-holidays, dates.add-business-days, dates.business-days-between, finance.tax.vat-rate, finance.tax.add-vat, finance.tax.remove-vat, dates.uk-tax-year, validation.uk-vat-number :: gaps: plan-catalogue, usage-metering, invoice-delivery, payment-provider, dunning-emails, customer-portal, fx-rate-source, money-storage, time-zones, locale-formatting, non-uk-holidays, mtd-submission, corporation-tax, vat-number-lookup - telecoms: Telecoms billing - Rating and billing for telecoms: calls from a rate deck, data allowances and overage, roaming, plus recurring plan billing and VAT. :: core (includes money-basics, dates-basics, uk-tax): telecoms.call-rating, telecoms.data-allowance, telecoms.roaming-charge, subscriptions.next-billing-date, subscriptions.invoice, money.amount, money.add, money.sum, money.compare, money.apply-rate, math.round-div, money.allocate, money.format, dates.add-days, dates.add-months, dates.days-between, dates.month-boundaries, dates.day-of-week, dates.quarter, dates.bank-holidays, dates.add-business-days, dates.business-days-between, finance.tax.vat-rate, finance.tax.add-vat, finance.tax.remove-vat, dates.uk-tax-year, validation.uk-vat-number :: gaps: cdr-ingest, number-porting, ofcom-rules, fx-rate-source, money-storage, time-zones, locale-formatting, non-uk-holidays, mtd-submission, corporation-tax, vat-number-lookup - todo: Todo and task lists - A to-do list's logic as pure functions: the item type, a list reducer, quick-add parsing, due dates, repeats, tags, filters, sorting and CSV import/export. :: core (includes dates-basics): todo.item, todo.list, todo.parse-quick-add, todo.due-status, todo.due-label, todo.filter, todo.sort, dates.add-days, dates.add-months, dates.days-between, dates.month-boundaries, dates.day-of-week, dates.quarter, dates.bank-holidays, dates.add-business-days, dates.business-days-between :: gaps: persistence, sync, notifications, sharing, ui, time-zones, locale-formatting, non-uk-holidays - uk-tax: UK VAT and tax basics - UK VAT by the rate in force on the date of supply: add, remove, the nine-box return and the flat rate scheme, plus the tax year and HMRC identifiers. :: core: finance.tax.vat-rate, finance.tax.add-vat, finance.tax.remove-vat, dates.uk-tax-year, validation.uk-vat-number :: gaps: mtd-submission, corporation-tax, vat-number-lookup - validation-basics: Validation basics - Check and normalise what people type: email, phone, postcode, names, bank details and check-digit identifiers. :: core: validation.email, validation.phone-e164, validation.uk-postcode, validation.iban :: gaps: address-lookup, email-deliverability, vocalink-data