Skip to content

fix(warm): warm capacity deferred itself out of existence - #290

Merged
rldyourmnd merged 3 commits into
mainfrom
fix/warm-defers-itself-out-of-existence
Aug 30, 2026
Merged

fix(warm): warm capacity deferred itself out of existence#290
rldyourmnd merged 3 commits into
mainfrom
fix/warm-defers-itself-out-of-existence

Conversation

@rldyourmnd

Copy link
Copy Markdown
Contributor

ReconcileWarm and AdmitWarm both refused to build warm capacity whenever queueIntents.HasActive was true. That predicate is global: one active intent in any of the ten scale sets blocked warm creation for every pool. The fleet is rarely idle, so the gate was almost always shut.

Measured on the services host over six hours:

reconciles 634
deferred with reason queue-intent 510
ready_before == 0 631 / 634
ready_after == 0 630 / 634
warm instances created 1 (target 2)

The guard was self-reinforcing: with no warm capacity every job cold-started, which lengthened the queue, which kept the guard shut. Over the same window queue.queued spans in fleet_traces show a mean wait of 115–184s per repository.

Capacity is still protected, and by the checks that actually measure it. AdmitWarm continues into the pool, CPU, allowance, memory and pressure decisions; warm creation is bounded by max_ready; and a real job claims a warm instance through ClaimWarm rather than waiting behind it. Refusals are still recorded — createWarm writes the real admission decision into deferral_reason, so a refusal now names the resource that was short instead of naming the queue.

ReasonQueueIntent goes with it: nothing emits it any more, and no dashboard or alert rule referenced it.

The test that asserted the old behaviour is replaced by its inverse. Negative control: restoring the gate with the new test unchanged fails on Deferred.

https://claude.ai/code/session_017rA31sF7EzvtbRmi18Uzz9

`ReconcileWarm` and `AdmitWarm` both refused to build warm capacity whenever
`queueIntents.HasActive` was true. That predicate is global: one active intent
in any of the ten scale sets blocked warm creation for every pool. The fleet is
rarely idle, so the gate was almost always shut.

Measured on the services host over six hours: 634 reconciles, 510 deferred with
reason `queue-intent`, `ready_before` was 0 in 631 of them and `ready_after` 0
in 630. One warm instance was created in six hours against a target of two. The
guard was self-reinforcing -- with no warm capacity every job cold-started,
which lengthened the queue, which kept the guard shut.

Capacity is still protected, and by the checks that actually measure it:
`AdmitWarm` continues into the pool, CPU, allowance, memory and pressure
decisions, warm creation is bounded by `max_ready`, and a real job claims a warm
instance through `ClaimWarm` rather than waiting behind it. Refusals are still
recorded -- `createWarm` writes the real admission decision into
`deferral_reason`, so a refusal now names the resource that was short instead of
naming the queue.

`ReasonQueueIntent` goes with it: nothing emits it any more, and a reason the
system cannot reach is a record that misleads whoever reads it next. No
dashboard or alert rule referenced it.

The test that asserted the old behaviour is replaced by its inverse, and the
negative control holds: restoring the gate with the new test unchanged fails on
`Deferred`.

Claude-Session: https://claude.ai/code/session_017rA31sF7EzvtbRmi18Uzz9
The provider release ceremony is two commits by construction: the source
commit, then the derivative that pins it. This is the second half for
9907cba. `source_commit` names that commit, `binary_sha256` is the
reproducible double-build of it -- CGO_ENABLED=0, -trimpath, -buildvcs=false,
-buildid= -s -w, go1.26.6 -- verified identical across two builds locally
before writing it down.

Nothing else in the tree states the version: the build stamp, the admission
baseline and each host's desired state all derive from this file, which is why
it exists.

Claude-Session: https://claude.ai/code/session_017rA31sF7EzvtbRmi18Uzz9
The derivative is the authority and every host config is compared against it,
so bumping one without the others is exactly the divergence the file was
written to prevent. `fleetcontract.ValidateConfig` is what catches it: the
control-plane artifact versions must equal the contract's.

Claude-Session: https://claude.ai/code/session_017rA31sF7EzvtbRmi18Uzz9
@rldyourmnd
rldyourmnd merged commit 7027126 into main Aug 30, 2026
10 checks passed
@rldyourmnd
rldyourmnd deleted the fix/warm-defers-itself-out-of-existence branch August 30, 2026 16:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant