Skip to content

A train lane that declines because the live lane serves the base is TrainerUnavailable: it created nothing, so the bucket retries instead of wedging in RecoveryRequired (card 67feb736) - #5879

Merged
joelteply merged 1 commit into
canaryfrom
67feb736/a-train-lane-that-declines-because-the-l
Nov 8, 2026
Merged

joelteply merged 1 commit into
canaryfrom
67feb736/a-train-lane-that-declines-because-the-l

Conversation

@joelteply

@joelteply joelteply commented Nov 8, 2026 •

Copy link
Copy Markdown
Contributor

How it serves the minds: Kimi's learning on the Windows node has stalled. 16 of her training buckets on ggml-org/Qwen3.8-27B-GGUF are stuck in recovery_required and 48 examples are waiting, because a refusal that is meant to be retried is parked forever. Goal 8, learning; the genome lane.

What happened (Codex 5e8b7aa6 / f415e865, 2026-11-08)

dispatch.error: "genome/job-create rejected: transient failure: a live lane now serves ggml-org/Qwen3.8-27B-GGUF: its resident trainer takes the run, not a second copy". The path:

  1. engine_lane::refuse_if_resident returns FineTuningError::Transient.
  2. job_create::settles_as_not_created excludes Transient, so the attempt stays Admitted to engine-lane.
  3. decode_job_create maps Transient to DispatchFailure::Uncertain, which puts the bucket in RecoveryRequired.
  4. Every 30 s tick, the reconcile for an Admitted row answers Unknown and nothing re-dispatches. Only genome/training-trigger/resolve clears it.

The comment at engine_lane.rs:39 ("the dispatch retries and selection picks the resident lane") described behaviour the code didn't have.

Likely trigger: at selection time live_lane() briefly misses the resident record (the is_llama_server process lookup, or a record rewrite), so engine-lane ranks as the only trainer that serves the base. After the headroom wait it does see the lane, and refuses.

The change

refuse_if_resident returns TrainerUnavailable. That variant's contract is "refused BEFORE creating anything ... the trigger retries the batch on a later fill and never parks it awaiting evidence" (card a9bc56ea, Sigurd's MLX wedge), and this refusal is reached before any job, process or file exists.

As a result, the attempt settles as not created, the trigger retries, and the next selection takes the resident trainer. The comment and the test now say so.

Measured

  • Tests: engine_lane tests, 2 passed, local, IntelMac, on canary 8dfe0ba, 2026-11-08. a_base_that_became_resident_before_the_spawn_is_refused_as_not_created asserts TrainerUnavailable; the old code (Transient) fails it.
  • Ratchets: cargo run -p source-hygiene --bin ratchets -- origin/canary gives 95/95, base and head.
  • Owed after deploy:
    • On the Windows node, the 16 wedged buckets need genome/training-trigger/resolve notDispatched. The evidence is the recorded refusal text, which comes from a path that creates nothing. Codex offered to run it.
    • Then Kimi's pending examples should dispatch to the resident trainer.
    • Receipt goes on card 67feb736 (owner Cormac).

🤖 Generated with Claude Code

https://claude.ai/code/session_01FRQWzgSfo79JtnwZywHKrE

…rainerUnavailable: it created nothing, so the bucket retries instead of wedging in RecoveryRequired (card 67feb736)

Kimi's 27B on the Windows node, 2026-11-08: 16 buckets in recovery_required, 48 examples pending,
each with 'a live lane now serves ...: its resident trainer takes the run, not a second copy'.
refuse_if_resident returned Transient, which leaves the attempt Admitted (settles_as_not_created
excludes it) and maps to Uncertain -> RecoveryRequired, answered Unknown every tick. The refusal
is reached before any job, process or file exists: TrainerUnavailable's contract (card a9bc56ea),
which settles the attempt and is retried, so the next selection takes the resident trainer.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FRQWzgSfo79JtnwZywHKrE
@joelteply
joelteply merged commit 836c285 into canary Nov 8, 2026
19 checks passed
@joelteply
joelteply deleted the 67feb736/a-train-lane-that-declines-because-the-l branch November 8, 2026 19:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant