feat(seats): accounts without a 5-hour limit
Anthropic is removing the 5-hour limit in stages (from 2026-10-31), and an account without it reports the weekly window alone. Until now the pool took such an account for an unprobed seat: always eligible, ranked after every other, never held to the weekly cutoff, with no cap on its passes. - The burst window is the 5-hour one, else the weekly one (Seats::BurstWindow). An account whose burst window is the weekly one is ranked by it and admitted under the 95 % cutoff with the passes in flight projected on it, at the measured share per pass (0.04 at xhigh, 0.125 otherwise; REVIEW_GATES_LENS_COST_7D_PCT), and waits for the weekly reset when over it. - Every OAuth account and the local login takes at most 128 passes at once, every driver's counted (REVIEW_GATES_OAUTH_CONCURRENCY): every run measured with 149 or more in flight on one account drew usage-limit rejections, none of the 119 with 139 or fewer. - A 'concurrents' rejection pauses the seat for 20 s or its retry-after, not until a window's reset (a seat sat two hours at 10 % on one). - Board entries, the folded foreign record and the board's view carry cost7d, so the drivers see each other's weekly load. - `seats` and the log table say `no limit` in such an account's 5-hour column; the board's others-line names its weekly projection. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
a2974a8139
commit
c28307601b
11 changed files with 209 additions and 26 deletions
|
|
@ -649,7 +649,7 @@ namespace Crafter::Review::Run {
|
|||
} catch (const std::runtime_error& e) {
|
||||
Die(e.what());
|
||||
}
|
||||
const Json pc = SeatPool::PoolConfig(processEnv);
|
||||
const Json pc = SeatPool::PoolConfig(processEnv, a.effort);
|
||||
board = std::make_unique<SeatPool::Board>(SeatPool::BoardPath(), std::string(), std::nullopt, log);
|
||||
board->Join({{"run", std::format("commits {} @ {}", Basename(Dyn::RStrip(a.artifact, "/")), h8)},
|
||||
{"dump", Basename(dumpPath)},
|
||||
|
|
@ -673,7 +673,7 @@ namespace Crafter::Review::Run {
|
|||
const double now = Platform::Now();
|
||||
board->Publish(seats, now, !a.noProbe);
|
||||
board->Fold(seats, now);
|
||||
for (const std::string& line : board->OthersLines(seats, now, SeatPool::PoolConfig(processEnv), apiCfg, a.concurrency)) log(line);
|
||||
for (const std::string& line : board->OthersLines(seats, now, SeatPool::PoolConfig(processEnv, a.effort), apiCfg, a.concurrency)) log(line);
|
||||
}
|
||||
if (a.harness == "opencode") {
|
||||
runner->opencodeHome = OpenCode::PrepareHome(scratch, repo, modelIds);
|
||||
|
|
@ -1467,6 +1467,7 @@ namespace Crafter::Review::Run {
|
|||
.cacheKey = warm ? std::function<std::optional<std::string>(Json&)>([this](Json& job) { return CacheKey(job); }) : nullptr,
|
||||
.warmProbe = warm ? std::function<bool(const Json&)>([this](const Json& job) { return WarmProbe(job); }) : nullptr,
|
||||
.seats = &seats,
|
||||
.seatConfig = SeatPool::PoolConfig(Platform::Environment(), a.effort),
|
||||
.apiConfig = apiCfg,
|
||||
.ledger = ledger.get(),
|
||||
.admission = admission.get(),
|
||||
|
|
|
|||
Loading…
Reference in a new issue