Private/Data/ThrottleProfiles.psd1

<#
    Copyright (c) 2025-2026 Robert Faddes
    SPDX-License-Identifier: MPL-2.0
#>


# Throttle profile presets for multi-bucket rate limit management.
# Each profile controls delay curves, calibration frequency, and write operation conservatism.
#
# Calibration interval is calculated dynamically from sample confidence and drift:
# CalibrationBaseSeconds: ceiling interval when confidence is high and drift is zero.
# CalibrationMinSeconds: absolute floor to prevent excessive API calibration calls.
# CalibrationConfidenceCount: number of local window samples required before the interval
# reaches the full base. Fewer samples = shorter interval = more
# frequent calibration to establish an accurate picture early.
# DriftThresholdPercent: drift gap (API vs Local) at which accelerated calibration begins.
# Lower values detect concurrent sessions earlier (1.5-2% recommended).
# DriftScalingFactor: how aggressively the interval shrinks as drift exceeds the threshold.
# Higher values produce shorter intervals for the same drift magnitude.
#
# ConfidenceFactor = Min(1.0, LocalSampleCount / CalibrationConfidenceCount)
# DriftFactor = 1 / (1 + (DriftGap / DriftThreshold) * DriftScaling)
# Interval = Max(Min, Base * ConfidenceFactor * DriftFactor)
#
# Stability-adaptive calibration: once a session reaches full confidence and accumulates
# CalibrationStabilityThreshold consecutive stable calibrations (no drift, no delays, below
# threshold), the effective base is allowed to double, capped at CalibrationMaxSeconds.
# Any instability signal (drift, delay onset, utilisation spike) resets the count immediately.
# This reduces calibration API call overhead in long-running single-session reporting extracts
# without sacrificing responsiveness to concurrent-session drift.
#
# UnknownOperationSafetyFactor: fractional delay applied to write operations with no explicit operation mapping.
# Note: Profiles tuned for up to 4 concurrent heavy-use sessions sharing the same API quota.

@{
    'Cautious' = @{
        DelayMultiplier = 1000
        CalibrationBaseSeconds = 5
        CalibrationMinSeconds = 0.5
        CalibrationConfidenceCount = 30
        CalibrationMaxSeconds = 30
        CalibrationStabilityThreshold = 3
        DriftThresholdPercent = 0.02
        DriftScalingFactor = 3
        ThrottleUtilisationThreshold = 0.2
        ThrottleCutOffOverhead = 0.08
        UnknownOperationSafetyFactor = 0.5
    }
    'Medium' = @{
        DelayMultiplier = 750
        CalibrationBaseSeconds = 6
        CalibrationMinSeconds = 0.7
        CalibrationConfidenceCount = 50
        CalibrationMaxSeconds = 20
        CalibrationStabilityThreshold = 4
        DriftThresholdPercent = 0.02
        DriftScalingFactor = 2
        ThrottleUtilisationThreshold = 0.30
        ThrottleCutOffOverhead = 0.07
        UnknownOperationSafetyFactor = 0.3
    }
    'Aggressive' = @{
        DelayMultiplier = 400
        CalibrationBaseSeconds = 5
        CalibrationMinSeconds = 0.5
        CalibrationConfidenceCount = 35
        CalibrationMaxSeconds = 10
        CalibrationStabilityThreshold = 5
        DriftThresholdPercent = 0.02
        DriftScalingFactor = 1.5
        ThrottleUtilisationThreshold = 0.50
        ThrottleCutOffOverhead = 0.05
        UnknownOperationSafetyFactor = 0.15
    }
    'DefaultProfile' = @{
        DelayMultiplier = 750
        CalibrationBaseSeconds = 6
        CalibrationMinSeconds = 0.7
        CalibrationConfidenceCount = 50
        CalibrationMaxSeconds = 20
        CalibrationStabilityThreshold = 4
        DriftThresholdPercent = 0.02
        DriftScalingFactor = 2
        ThrottleUtilisationThreshold = 0.30
        ThrottleCutOffOverhead = 0.07
        UnknownOperationSafetyFactor = 0.3
    }
}
# SIG # Begin signature block
# MIIF+wYJKoZIhvcNAQcCoIIF7DCCBegCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDmy21/aWAb5c2k
# /Wk6UsjOEgDmLalA5GSjiVqlIO/fzqCCA04wggNKMIICMqADAgECAhB464iXHfI6
# gksEkDDTyrNsMA0GCSqGSIb3DQEBCwUAMD0xFjAUBgNVBAoMDVJvYmVydCBGYWRk
# ZXMxIzAhBgNVBAMMGkRhdHRvUk1NLkNvcmUgQ29kZSBTaWduaW5nMB4XDTI2MDMz
# MTAwMTMzMFoXDTI4MDMzMTAwMjMzMFowPTEWMBQGA1UECgwNUm9iZXJ0IEZhZGRl
# czEjMCEGA1UEAwwaRGF0dG9STU0uQ29yZSBDb2RlIFNpZ25pbmcwggEiMA0GCSqG
# SIb3DQEBAQUAA4IBDwAwggEKAoIBAQChn1EpMYQgl1RgWzQj2+wp2mvdfb3UsaBS
# nxEVGoQ0gj96tJ2MHAF7zsITdUjwaflKS1vE6wAlOg5EI1V79tJCMxzM0bFpOdR1
# L5F2HE/ovIAKNkHxFUF5qWU8vVeAsOViFQ4yhHpzLen0WLF6vhmc9eH23dLQy5fy
# tELZQEc2WbQFa4HMAitP/P9kHAu6CUx5s4woLIOyyR06jkr3l9vk0sxcbCxx7+dF
# RrsSLyPYPH+bUAB8+a0hs+6qCeteBuUfLvGzpMhpzKAsY82WZ3Rd9X38i32dYj+y
# dYx+nx+UEMDLjDJrZgnVa8as4RojqVLcEns5yb/XTjLxDc58VatdAgMBAAGjRjBE
# MA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQU
# H+B0vf97dYXqdUX1YMcWhFsY6fcwDQYJKoZIhvcNAQELBQADggEBAJmD4EEGNmcD
# 1JtFoRGxuLJaTHxDwBsjqcRQRE1VPZNGaiwIm8oSQdHVjQg0oIyK7SEb02cs6n6Y
# NZbwf7B7WZJ4aKYbcoLug1k1x9SoqwBmfElECeJTKXf6dkRRNmrAodpGCixR4wMH
# KXqwqP5F+5j7bdnQPiIVXuMesxc4tktz362ysph1bqKjDQSCBpwi0glEIH7bv5Ms
# Ey9Gl3fe+vYC5W06d2LYVebEfm9+7766hsOgpdDVgdtnN+e6uwIJjG/6PTG6TMDP
# y+pr5K6LyUVYJYcWWUTZRBqqwBHiLGekPbxrjEVfxUY32Pq4QfLzUH5hhUCAk4HN
# XpF9pOzFLMUxggIDMIIB/wIBATBRMD0xFjAUBgNVBAoMDVJvYmVydCBGYWRkZXMx
# IzAhBgNVBAMMGkRhdHRvUk1NLkNvcmUgQ29kZSBTaWduaW5nAhB464iXHfI6gksE
# kDDTyrNsMA0GCWCGSAFlAwQCAQUAoIGEMBgGCisGAQQBgjcCAQwxCjAIoAKAAKEC
# gAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwG
# CisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIA3AKDOCS8ucjbPBZDPWdZgUjYSW
# 8a9XCkTVneO+EWH+MA0GCSqGSIb3DQEBAQUABIIBAGtSx+GW+YLNOV9t8DFLfuvD
# /3w36TGH7hzDRKZGslXLf7IDh73GfnsJVWvSS/RfkanOug+vfPRzdo1o4QrvP4kk
# fmTwZXTWPkVJhH7ElLRH5Rwcox1vIT/X2Y/qIgGAjamfH3Fts5c36wubBZTpLIQa
# PmdHQG14VOeKmNYwVX1IqkK9+YuYX3vLwEQDmxryZKAXR7e4FC3RLSFto3/lP4HV
# hvw7s9hlCfCGLrNI9w8SBJuVbX013E9cPglx0754knbjgbi+j4Zg1gLTIvSci4TT
# oVpok5dLc/sLrXJA8pgxzPD8ZPryxIGvbtHprPOtUb8euhiQVb4JZu5gkrDt1MY=
# SIG # End signature block