Repository navigation
One width was carrying three claims: candidate, actuatable, observed - #7930
gunbai-bot[bot] wants to merge 1 commit into
Conversation
Operator ruling on the #7891 merge: "22 committed" is still too strong. One number answered what the constraints ADMIT, what the fleet can be MADE to run, and what is ACTUALLY RUNNING, and the strongest of the three was the one being published. candidate_width_under_current_topology 5/5/7/5 actuatable_desired_width 5/5/5/5 observed_live_width 5/5/5/5 Nothing in this repository creates or activates a slot: host_converge_realize returns KnobUnimplemented for RunnerWidth, and activation additionally needs a managed-cache receipt and a bound compile-pool receipt that host_compile_pool reports not-ready on every host. So the seventh srv3 slot is unreachable through the modeled path, not merely unprovisioned. WidthActuationStanding gates advancement, and only a grounded receipt moves the actuatable number. Nor is the candidate merely waiting on labour. Seven slots at 14GiB is 98GiB and the cited 62-token derivation is a further 108.5GiB against ~125GiB usable. That sum is very likely double-counting, because the per-slot figure was measured with compiles running inside the slots — which is the point: the two claims have never been decomposed, so seven is unproven in both directions. The arithmetic is in the module rather than only in review. Deploy and converge now read the actuatable width, which fixes a live breakage this branch's predecessor shipped: with srv3 declared at 7 and five units on the box, host_converge's count cross-check refused srv3 outright — correct behaviour serving a false premise. Declared and live agree again without anyone editing a number toward the machine, which the authority disposition forbids. Also corrects a false sentence I wrote in the disk-axis note. It said srv1-3 "are not widened by this change"; srv3 is the ONLY host being widened, so its unmeasured disk axis is not inherited debt — it is an axis dropped out of the minimum for exactly the host whose width is moving. 63 witnesses across the five width-consumer files green by execution.
|
Converting to draft — held for recut on operator ruling. The vocabulary stands; the control law is wrong, and it is circular. This PR says, in effect: which closes a loop with no entry: I built The correct shape keeps intent and admission as separate facts rather than folding one into the other: Desired state must not reconcile toward the machine before convergence is attempted. Routing deploy and converge consumers to the smaller width — which this PR does, and which I described as fixing a live breakage — is the same error: srv3's converge refusal was real, but the fix is count equality as a postcondition, not lowering the declared width until it matches what is already there. Five observed against seven requested must yield exactly two additions, not a refusal because the counts differ. What survives the recut: the three-way distinction itself, Superseded by the top-level — sent from deep-badger-594 |
|
Closing as superseded by #7939, per the wind-down consolidation directive. This PR split runner width into candidate / actuatable / observed axes. The operator rejected its control law as circular: desired width stays at 5 until a receipt proves 7, and that receipt cannot exist until something actuates 7. The PR was converted to draft at that point and has not been revived. #7939 carries the corrected width split (memory-admitted width, with disk gated at apply rather than at allocation), so the useful half of this work has a live successor. State at close: draft, Work continues in #7939. — sent from deep-badger-594 |
Operator ruling on the #7891 merge (
47c602caa74a20719b7d9ade9da3e721796607b8): "22 committed" is still too strong.One number was answering three different questions, and the strongest was the one being published:
candidate_width_under_current_topologyactuatable_desired_widthobserved_live_widthWhy the gap is not paperwork
Nothing in this repository creates or activates a slot.
host_converge_realizeimplementsPerSlotMemoryCapand returnsKnobUnimplementedforRunnerWidth; activation additionally requires a grounded managed-cache receipt and a bound compile-pool receipt, andhost_compile_poolreports not-ready for every host underCompilePoolInRunnerSlots. The seventh srv3 slot is unreachable through the modeled path, not merely unprovisioned — and a width claiming it is a claim about a machine no one has changed.WidthActuationStandinggates advancement. It isActuationUngroundedon every host today, and it is written per-host rather than as a fleet constant so srv3 can advance alone when its receipt exists, without the arm becoming a place to assert readiness.And the candidate is not merely waiting on labour
The compile pool is a sibling RAM claim sized from jobserver tokens; today's zero is only a projection of a topology that refuses activation. That sum is very likely double-counting — the per-slot measurement was taken with compiles running inside the slots, so their residency is already inside the 14 GiB — and that is exactly why it matters: the two claims have never been decomposed, so the candidate 7 is unproven in both directions rather than merely unscheduled. This arithmetic now lives in the module instead of only in review.
A live breakage, fixed
Deploy and converge consumers read
actuatable_desired_width, because each answers "what should exist on this host right now."gunbc.host_converge's count cross-check compares declared width to live unit enumeration and refuses the host on mismatch. With srv3 declared at 7 and five units on the box,gunbc convergerefused srv3 outright — correct behaviour serving a false premise, shipped by this branch's predecessor. Reading the actuatable width restores agreement without anyone editing a number toward the machine, whichgunbc_runner_slot_allocation_authority_dispositionforbids.observed_live_widthis deliberately not derived from the declared width. Deriving it would make the observation agree with the model by construction and destroy the only signal that says whether an intent was ever applied.A false sentence, corrected
The disk-axis note said srv1–srv3 "are not widened by this change." srv3 is the only host being widened. Its unmeasured disk axis is therefore not inherited debt — it is an axis dropped out of the minimum for exactly the host whose width is moving, which is why srv3 owes a disk observation before anything is actuated on it.
The policy this encodes
An operator-declared evidence grade may grant candidate capacity and may not grant live capacity. srv3 and srv4 are session-free by declaration rather than observation, which is good enough to keep 7 as a candidate and not good enough to actuate on.
Not in scope
Deriving the widths from a joint
(runner_slots, build_tokens)solve, and producing srv3's activation receipt, are the separately dispatched capacity lane. This change only stops the model overstating what it can reach.Verification
63 witnesses across
runner_slot_allocation,host_allocation_conservation,runner_placement,ci_runner_target,fleet_show_effective_read,srv3_runner_memory_convergeandhost_converge_slice1— green by execution, zero failures. New discriminating rows:actuatable_width_never_exceeds_candidate,actuatable_width_is_the_observed_width_while_activation_is_ungrounded, andsrv3_is_the_host_whose_candidate_exceeds_what_can_be_actuated— srv3 is the only host where the two differ, so re-collapsing them, or advancing actuatable without a receipt, reds there and nowhere else.🤖 Generated with Claude Code