Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,13 @@ struct CodexWeeklyResetConfirmation: Sendable {
return false
}
let previouslyAvailableCredits = previousCredits.availableCredits(at: previousCredits.updatedAt)
guard !previouslyAvailableCredits.isEmpty else { return false }
// An explicitly observed zero-credit inventory means there was no manual reset credit to
// consume. Requiring consumption proof here would deadlock: the two consistent observations
// (initial + confirmation) are the only signal a server-side early reset has, so trust them.
// A nil/unknown previous inventory stays conservative and keeps demanding consumption proof.
guard !previouslyAvailableCredits.isEmpty else {
return previousCredits.availableCount == 0
}
return previouslyAvailableCredits.contains { previousCredit in
Self.inventoryConfirmsConsumption(
previousCredit: previousCredit,
Expand Down
34 changes: 34 additions & 0 deletions Tests/CodexBarTests/CodexWeeklyResetConfirmationTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -348,6 +348,40 @@ struct CodexWeeklyResetConfirmationTests {
== .publishConfirmation)
}

@Test
func `zero available reset credits confirm a server-side early weekly reset by observation`() throws {
let formatter = ISO8601DateFormatter()
let previousCapturedAt = try #require(formatter.date(from: "2026-08-13T03:36:16Z"))
let previousReset = try #require(formatter.date(from: "2026-08-18T00:49:16Z"))
let initialCapturedAt = try #require(formatter.date(from: "2026-08-13T03:41:46Z"))
let initialReset = try #require(formatter.date(from: "2026-08-20T03:38:06Z"))
let previous = self.snapshot(
capturedAt: previousCapturedAt,
weeklyUsed: 98,
weeklyReset: previousReset,
resetCredits: self.emptyResetCredits(capturedAt: previousCapturedAt))
let initial = self.snapshot(
capturedAt: initialCapturedAt,
weeklyUsed: 1,
weeklyReset: initialReset,
resetCredits: self.emptyResetCredits(capturedAt: initialCapturedAt))
let confirmation = self.snapshot(
capturedAt: initialCapturedAt.addingTimeInterval(30),
weeklyUsed: 1,
weeklyReset: initialReset.addingTimeInterval(30),
resetCredits: self.emptyResetCredits(capturedAt: initialCapturedAt.addingTimeInterval(30)))

#expect(
CodexWeeklyResetConfirmation.initialDecision(previous: previous, initial: initial)
== .requiresConfirmation)
#expect(
CodexWeeklyResetConfirmation.confirmationDecision(
previous: previous,
initial: initial,
confirmation: confirmation)
== .publishConfirmation)
}

@Test
func `one missing reset credit inventory does not confirm an early manual weekly reset`() throws {
let formatter = ISO8601DateFormatter()
Expand Down