Files
2026-07-13 12:22:33 +08:00

185 lines
7.2 KiB
Swift

import CodexBarCore
import Foundation
struct CodexWeeklyResetConfirmation: Sendable {
enum InitialDecision: Equatable, Sendable {
case publishInitial
case requiresConfirmation
case preservePrevious
}
enum ConfirmationDecision: Equatable, Sendable {
case publishConfirmation
case preservePrevious
}
private static let resetEquivalenceToleranceSeconds: TimeInterval = 2 * 60
private static let resetThreshold = 1.0
static func initialDecision(
previous: UsageSnapshot?,
initial: UsageSnapshot) -> InitialDecision
{
guard self.isFinite(initial.updatedAt) else { return .preservePrevious }
guard let previous else {
guard let initialWeekly = CodexConsumerProjection.sourceRateWindow(
for: .weekly,
snapshot: initial)
else {
return .publishInitial
}
return self.initialDecisionWithoutWeeklyBaseline(
initialWeekly: initialWeekly,
capturedAt: initial.updatedAt)
}
guard Self.isFinite(previous.updatedAt), initial.updatedAt > previous.updatedAt else {
return .preservePrevious
}
guard let previousWeekly = CodexConsumerProjection.sourceRateWindow(
for: .weekly,
snapshot: previous)
else {
guard let initialWeekly = CodexConsumerProjection.sourceRateWindow(
for: .weekly,
snapshot: initial)
else {
return .publishInitial
}
return self.initialDecisionWithoutWeeklyBaseline(
initialWeekly: initialWeekly,
capturedAt: initial.updatedAt)
}
guard previousWeekly.usedPercent.isFinite else {
return .preservePrevious
}
// A source can legitimately omit the weekly lane and rely on the existing
// reset-window backfill path. Only gate an explicit weekly observation.
guard let initialWeekly = CodexConsumerProjection.sourceRateWindow(
for: .weekly,
snapshot: initial)
else {
return .preservePrevious
}
guard initialWeekly.usedPercent.isFinite else { return .preservePrevious }
let previousBoundary = Self.finiteResetBoundary(previousWeekly)
let initialBoundary = Self.finiteResetBoundary(initialWeekly)
if initialWeekly.resetsAt != nil,
Self.validResetBoundary(initialWeekly, capturedAt: initial.updatedAt) == nil
{
return .preservePrevious
}
if let previousBoundary, let initialBoundary,
initialBoundary.timeIntervalSince(previousBoundary) < -Self.resetEquivalenceToleranceSeconds
{
return .preservePrevious
}
guard previousWeekly.usedPercent > Self.resetThreshold,
initialWeekly.usedPercent <= Self.resetThreshold
else {
return .publishInitial
}
guard Self.validResetBoundary(initialWeekly, capturedAt: initial.updatedAt) != nil else {
return .preservePrevious
}
return .requiresConfirmation
}
static func confirmationDecision(
previous: UsageSnapshot?,
initial: UsageSnapshot,
confirmation: UsageSnapshot) -> ConfirmationDecision
{
guard previous.map({ self.isFinite($0.updatedAt) }) ?? true,
self.isFinite(initial.updatedAt),
self.isFinite(confirmation.updatedAt),
confirmation.updatedAt > initial.updatedAt,
let initialWeekly = CodexConsumerProjection.sourceRateWindow(
for: .weekly,
snapshot: initial),
let confirmationWeekly = CodexConsumerProjection.sourceRateWindow(
for: .weekly,
snapshot: confirmation),
initialWeekly.usedPercent.isFinite,
confirmationWeekly.usedPercent.isFinite
else {
return .preservePrevious
}
let previousWeekly = CodexConsumerProjection.sourceRateWindow(
for: .weekly,
snapshot: previous)
guard previousWeekly?.usedPercent.isFinite ?? true else { return .preservePrevious }
let previousBoundary = previousWeekly.flatMap(Self.finiteResetBoundary)
let confirmationBoundary = Self.finiteResetBoundary(confirmationWeekly)
if confirmationWeekly.resetsAt != nil,
Self.validResetBoundary(confirmationWeekly, capturedAt: confirmation.updatedAt) == nil
{
return .preservePrevious
}
if let previousBoundary, let confirmationBoundary,
confirmationBoundary.timeIntervalSince(previousBoundary) < -Self.resetEquivalenceToleranceSeconds
{
return .preservePrevious
}
if confirmationWeekly.usedPercent > Self.resetThreshold {
return .publishConfirmation
}
guard initialWeekly.usedPercent <= Self.resetThreshold,
let initialBoundary = Self.validResetBoundary(initialWeekly, capturedAt: initial.updatedAt),
let confirmationBoundary = Self.validResetBoundary(
confirmationWeekly,
capturedAt: confirmation.updatedAt),
abs(initialBoundary.timeIntervalSince(confirmationBoundary))
< Self.resetEquivalenceToleranceSeconds
else {
return .preservePrevious
}
if let previous,
let previousWeekly,
let previousBoundary = Self.validResetBoundary(
previousWeekly,
capturedAt: previous.updatedAt)
{
guard initialBoundary.timeIntervalSince(previousBoundary) >= Self.resetEquivalenceToleranceSeconds,
confirmationBoundary.timeIntervalSince(previousBoundary) >= Self.resetEquivalenceToleranceSeconds
else {
return .preservePrevious
}
}
return .publishConfirmation
}
private static func initialDecisionWithoutWeeklyBaseline(
initialWeekly: RateWindow,
capturedAt: Date) -> InitialDecision
{
guard initialWeekly.usedPercent.isFinite else { return .preservePrevious }
if initialWeekly.resetsAt != nil,
self.validResetBoundary(initialWeekly, capturedAt: capturedAt) == nil
{
return .preservePrevious
}
guard initialWeekly.usedPercent <= self.resetThreshold else { return .publishInitial }
return self.validResetBoundary(initialWeekly, capturedAt: capturedAt) == nil
? .preservePrevious
: .requiresConfirmation
}
private static func finiteResetBoundary(_ window: RateWindow) -> Date? {
guard let boundary = window.resetsAt, isFinite(boundary) else { return nil }
return boundary
}
private static func validResetBoundary(_ window: RateWindow, capturedAt: Date) -> Date? {
guard let boundary = self.finiteResetBoundary(window), boundary > capturedAt else { return nil }
return boundary
}
private static func isFinite(_ date: Date) -> Bool {
date.timeIntervalSinceReferenceDate.isFinite
}
}