From 884aef5c997174bee6214d1797c9d16a9d908bb5 Mon Sep 17 00:00:00 2001 From: ejclaw Date: Fri, 24 Apr 2026 18:53:04 +0900 Subject: [PATCH] fix: restrict Codex warm-up to fresh quota windows --- .env.example | 9 +++++---- src/codex-warmup.test.ts | 6 +++--- src/config.test.ts | 1 + src/config/load-config.ts | 2 +- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/.env.example b/.env.example index d79b377..23e11f6 100644 --- a/.env.example +++ b/.env.example @@ -37,9 +37,10 @@ STATUS_CHANNEL_ID= # Discord channel ID for live status updat # STATUS_SHOW_ROOM_DETAILS=false # Show detailed room info # --- Codex warm-up (optional, disabled by default) --- -# Sends a tiny real Codex prompt to near-zero-usage accounts so their reset -# countdown starts after a fresh quota window. Keep disabled if OpenAI changes -# policy or starts blocking automated warm-up prompts. +# Sends a tiny real Codex prompt only when both 5h and 7d usage are 0%, so +# reset countdown starts once after a fresh quota window. Keep disabled if +# OpenAI changes policy or starts blocking automated warm-up prompts. +# Normally only set this one line; the other knobs have conservative defaults. # CODEX_WARMUP_ENABLED=false # CODEX_WARMUP_PROMPT=Reply exactly OK. Do not run tools. # CODEX_WARMUP_MODEL= # Defaults to CODEX_MODEL @@ -47,7 +48,7 @@ STATUS_CHANNEL_ID= # Discord channel ID for live status updat # CODEX_WARMUP_MIN_INTERVAL_MS=18300000 # Per-account minimum gap: 5h5m # CODEX_WARMUP_STAGGER_MS=1800000 # Global gap between accounts: 30min # CODEX_WARMUP_MAX_USAGE_PCT=0 # Only warm accounts at/below this 5h usage -# CODEX_WARMUP_MAX_D7_USAGE_PCT=99 # Skip weekly-exhausted accounts +# CODEX_WARMUP_MAX_D7_USAGE_PCT=0 # Only warm accounts at/below this 7d usage # CODEX_WARMUP_MAX_CONSECUTIVE_FAILURES=2 # CODEX_WARMUP_FAILURE_COOLDOWN_MS=21600000 # Back off 6h after repeated failure diff --git a/src/codex-warmup.test.ts b/src/codex-warmup.test.ts index 53d7b9a..7c8332b 100644 --- a/src/codex-warmup.test.ts +++ b/src/codex-warmup.test.ts @@ -130,7 +130,7 @@ describe('Codex warm-up scheduler', () => { minIntervalMs: 18_300_000, staggerMs: 1_800_000, maxUsagePct: 0, - maxD7UsagePct: 99, + maxD7UsagePct: 0, commandTimeoutMs: 120_000, failureCooldownMs: 21_600_000, maxConsecutiveFailures: 2, @@ -195,7 +195,7 @@ describe('Codex warm-up scheduler', () => { minIntervalMs: 18_300_000, staggerMs: 0, maxUsagePct: 0, - maxD7UsagePct: 99, + maxD7UsagePct: 0, commandTimeoutMs: 120_000, failureCooldownMs: 21_600_000, maxConsecutiveFailures: 1, @@ -254,7 +254,7 @@ describe('Codex warm-up scheduler', () => { minIntervalMs: 18_300_000, staggerMs: 1_800_000, maxUsagePct: 0, - maxD7UsagePct: 99, + maxD7UsagePct: 0, commandTimeoutMs: 120_000, failureCooldownMs: 21_600_000, maxConsecutiveFailures: 2, diff --git a/src/config.test.ts b/src/config.test.ts index 258b3d5..d9280a0 100644 --- a/src/config.test.ts +++ b/src/config.test.ts @@ -139,6 +139,7 @@ describe('config/env loading', () => { let config = await import('./config.js'); expect(config.CODEX_WARMUP_CONFIG.enabled).toBe(false); expect(config.CODEX_WARMUP_CONFIG.maxUsagePct).toBe(0); + expect(config.CODEX_WARMUP_CONFIG.maxD7UsagePct).toBe(0); expect( config.CODEX_WARMUP_CONFIG.maxConsecutiveFailures, ).toBeGreaterThanOrEqual(1); diff --git a/src/config/load-config.ts b/src/config/load-config.ts index a5242d3..76f910c 100644 --- a/src/config/load-config.ts +++ b/src/config/load-config.ts @@ -277,7 +277,7 @@ export function loadConfig(): AppConfig { ), staggerMs: Math.max(0, readInteger('CODEX_WARMUP_STAGGER_MS', 1800000)), maxUsagePct: readPercent('CODEX_WARMUP_MAX_USAGE_PCT', 0), - maxD7UsagePct: readPercent('CODEX_WARMUP_MAX_D7_USAGE_PCT', 99), + maxD7UsagePct: readPercent('CODEX_WARMUP_MAX_D7_USAGE_PCT', 0), commandTimeoutMs: readIntegerAtLeast( 'CODEX_WARMUP_COMMAND_TIMEOUT_MS', 120000,