fix(paired): remove dawn Codex primer-alignment hold; add owner routing indicator

Reviewer/arbiter/owner Codex turns are no longer deferred during the
[03:00-08:00 KST] dawn window — they dispatch immediately at all hours.
Deletes codex-primer-alignment.ts and every hold call site (gating owner
hold + alignment notice, reviewer/arbiter queue hold, warm-up skip, primer
anchor-lock). The 08:00 primer still fires; it just no longer holds other
consumers. Tradeoff: the 13:00 KST 5h-reset anchoring is no longer enforced.

Also adds a user-visible next-step indicator after owner turns that do not
end the task (review_ready -> reviewer requested, arbiter_requested ->
arbiter called) so a same-looking status line is no longer ambiguous; no
extra line on completion to avoid duplicating the owner's final message.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Codex
2026-06-18 05:24:28 +09:00
parent a621e85432
commit be9f2379c0
9 changed files with 105 additions and 382 deletions

View File

@@ -7,7 +7,6 @@ import { fileURLToPath } from 'url';
import { DATA_DIR } from './config.js';
import type { AppConfig } from './config/schema.js';
import { shouldHoldCodexForPrimerAlignment } from './codex-primer-alignment.js';
import {
getAllCodexAccounts,
getCodexAuthPath,
@@ -342,13 +341,6 @@ export async function runCodexWarmupCycle(
return { status: 'skipped', reason: 'runtime_busy' };
const nowMs = runtime.nowMs ?? Date.now();
// Hold every non-primer warm-up during the pre-08:00 dawn window so it can't
// anchor the shared Codex 5h window ahead of the scheduled primer (which
// passes forceAttempt). Skipping is safe — an opportunistic warm-up is
// best-effort. The fixed-slot primer itself (forceAttempt) is never held.
if (!runtime.forceAttempt && shouldHoldCodexForPrimerAlignment(nowMs)) {
return { status: 'skipped', reason: 'primer_alignment_hold' };
}
const nowIso = new Date(nowMs).toISOString();
const statePath = runtime.statePath ?? DEFAULT_STATE_FILE;
const state = readWarmupState(statePath);