Repository navigation
fix(router): bound pool swaps and stop stale deactivate racing a new activation - #1838
Conversation
…activation The router-proxy activator could wedge a ModelPool until the proxy was restarted. Two defects combined. When the last waiter for a member gave up, the deferred cleanup fired an asynchronous Deactivate outside the lock. A request for the same member arriving in that window saw no swap in flight, started one, and scaled the member up; the stale Deactivate then landed and scaled it back to zero. Activate is idempotent-by-check and is never re-issued, so the new swap goroutine waited on a member that could never become Ready. The deactivate now re-takes the lock and re-checks before patching, skipping itself when the member is wanted again: a waiter has arrived, it became resident, or a swap newer than the generation the deactivate was scheduled against is activating it. A swap generation is also recorded per pool so a cancelled swap's goroutine can no longer clear the state of a newer swap that started while it was unwinding. The swap goroutine itself ran under a context with no deadline. Its only exit was the cancel fired when the last waiter for the target left, so a client retrying on 503 kept a doomed swap alive indefinitely: the pool stayed marked swapping, the resident member's fast path stayed closed, and every request on the pool burned its hold budget and returned 503. The swap now runs under the pool's swapBudget, falling back to twice the router's response-header timeout when a pool declares none, so the bound is never tighter than a single caller's hold. On expiry the swap is abandoned: the target is scaled back down while the lock is still held, a swap error is published to the waiters, the resident's fast path reopens, and the event is logged at ERROR and counted in the new llmkube_modelpool_swap_failures_total counter so the condition is visible without reading proxy state. Cancelled swaps keep their existing non-error behaviour and IfIdle semantics are unchanged. Signed-off-by: Jory Irving <46251616+joryirving@users.noreply.github.com>
Codecov Report❌ Patch coverage is
📢 Thoughts on this report? Let us know! |
Defilan
left a comment
There was a problem hiding this comment.
Approving. I re-ran both new tests with the fix pulled out and each caught it: taking the re-check out of deactivateIfUnwanted makes the stale deactivate land (Deactivate(coder) called 1 times), and swapping the bounded swap context back to WithCancel leaves the caller on its hold budget and fails the deadline test. The generation check reads correctly against the ordering you describe: every Activate sets its swap state under the mutex before its goroutine calls the controller, so re-taking the same lock closes the window. The fallback bound is 240s, twice the response-header timeout, matching the docs. Thanks, the #1837 repro made this easy to follow.
…27 ➔ 0.9.28) (#2127) This PR contains the following updates: | Package | Update | Change | |---|---|---| | [ghcr.io/defilantech/charts/llmkube](https://github.com/defilantech/LLMKube) | patch | `0.9.27` → `0.9.28` | --- >⚠️ **Warning** > > Some dependencies could not be looked up. Check the [Dependency Dashboard](issues/567) for more information. --- ### Release Notes <details> <summary>defilantech/LLMKube (ghcr.io/defilantech/charts/llmkube)</summary> ### [`v0.9.28`](https://github.com/defilantech/LLMKube/blob/HEAD/CHANGELOG.md#0928-2026-09-16) [Compare Source](defilantech/LLMKube@v0.9.27...v0.9.28) ##### Features - **runtime:** honor spec.args verbatim when spec.command is overridden ([#​1829](defilantech/LLMKube#1829)) ([f2fcc09](defilantech/LLMKube@f2fcc09)) ##### Bug Fixes - **foreman:** let the coder resolve a rebase conflict instead of failing loud ([#​1840](defilantech/LLMKube#1840)) ([8dfd531](defilantech/LLMKube@8dfd531)) - **router:** bound pool swaps and stop stale deactivate racing a new activation ([#​1838](defilantech/LLMKube#1838)) ([a598ec7](defilantech/LLMKube@a598ec7)) - **router:** rewrite model to served name on IfIdle fall-through ([#​1836](defilantech/LLMKube#1836)) ([8276b50](defilantech/LLMKube@8276b50)) ##### Documentation - **labs:** Qwen3.8-Flash-Next with MTP on one Strix Halo ([#​1832](defilantech/LLMKube#1832)) ([3acb00d](defilantech/LLMKube@3acb00d)) </details> --- ### Configuration 📅 **Schedule**: (in timezone Europe/Paris) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC44My4xIiwidXBkYXRlZEluVmVyIjoiNDQuODMuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsicmVub3ZhdGUvY29udGFpbmVyIiwidHlwZS9wYXRjaCJdfQ==--> Reviewed-on: https://git.erwanleboucher.dev/eleboucher/homelab/pulls/2127
…mkube (0.9.27 ➔ 0.9.28) (#213) This PR contains the following updates: | Package | Update | Change | |---|---|---| | [ghcr.io/home-operations/charts-mirror/llmkube](https://github.com/defilantech/LLMKube) | patch | `0.9.27` → `0.9.28` | --- ### Release Notes <details> <summary>defilantech/LLMKube (ghcr.io/home-operations/charts-mirror/llmkube)</summary> ### [`v0.9.28`](https://github.com/defilantech/LLMKube/blob/HEAD/CHANGELOG.md#0928-2026-09-16) [Compare Source](defilantech/LLMKube@v0.9.27...v0.9.28) ##### Features - **runtime:** honor spec.args verbatim when spec.command is overridden ([#​1829](defilantech/LLMKube#1829)) ([f2fcc09](defilantech/LLMKube@f2fcc09)) ##### Bug Fixes - **foreman:** let the coder resolve a rebase conflict instead of failing loud ([#​1840](defilantech/LLMKube#1840)) ([8dfd531](defilantech/LLMKube@8dfd531)) - **router:** bound pool swaps and stop stale deactivate racing a new activation ([#​1838](defilantech/LLMKube#1838)) ([a598ec7](defilantech/LLMKube@a598ec7)) - **router:** rewrite model to served name on IfIdle fall-through ([#​1836](defilantech/LLMKube#1836)) ([8276b50](defilantech/LLMKube@8276b50)) ##### Documentation - **labs:** Qwen3.8-Flash-Next with MTP on one Strix Halo ([#​1832](defilantech/LLMKube#1832)) ([3acb00d](defilantech/LLMKube@3acb00d)) </details> --- ### Configuration 📅 **Schedule**: (in timezone America/New_York) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC44NC4wIiwidXBkYXRlZEluVmVyIjoiNDQuODQuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsicmVub3ZhdGUvY29udGFpbmVyIiwidHlwZS9wYXRjaCJdfQ==--> Reviewed-on: https://git.greyrock.io/todd/home-ops/pulls/213
…mkube (0.9.25 ➔ 0.9.29) (#2103) This PR contains the following updates: | Package | Update | Change | |---|---|---| | [ghcr.io/home-operations/charts-mirror/llmkube](https://github.com/defilantech/LLMKube) | patch | `0.9.25` → `0.9.29` | --- >⚠️ **Warning** > > Some dependencies could not be looked up. Check the [Dependency Dashboard](issues/6) for more information. --- ### Release Notes <details> <summary>defilantech/LLMKube (ghcr.io/home-operations/charts-mirror/llmkube)</summary> ### [`v0.9.29`](https://github.com/defilantech/LLMKube/blob/HEAD/CHANGELOG.md#0929-2026-09-16) [Compare Source](defilantech/LLMKube@v0.9.28...v0.9.29) ##### Bug Fixes - **controller:** keep generated args when a non-CLI runtime overrides command ([#​1843](defilantech/LLMKube#1843)) ([c262265](defilantech/LLMKube@c262265)) ### [`v0.9.28`](https://github.com/defilantech/LLMKube/blob/HEAD/CHANGELOG.md#0928-2026-09-16) [Compare Source](defilantech/LLMKube@v0.9.27...v0.9.28) ##### Features - **runtime:** honor spec.args verbatim when spec.command is overridden ([#​1829](defilantech/LLMKube#1829)) ([f2fcc09](defilantech/LLMKube@f2fcc09)) ##### Bug Fixes - **foreman:** let the coder resolve a rebase conflict instead of failing loud ([#​1840](defilantech/LLMKube#1840)) ([8dfd531](defilantech/LLMKube@8dfd531)) - **router:** bound pool swaps and stop stale deactivate racing a new activation ([#​1838](defilantech/LLMKube#1838)) ([a598ec7](defilantech/LLMKube@a598ec7)) - **router:** rewrite model to served name on IfIdle fall-through ([#​1836](defilantech/LLMKube#1836)) ([8276b50](defilantech/LLMKube@8276b50)) ##### Documentation - **labs:** Qwen3.8-Flash-Next with MTP on one Strix Halo ([#​1832](defilantech/LLMKube#1832)) ([3acb00d](defilantech/LLMKube@3acb00d)) ### [`v0.9.27`](https://github.com/defilantech/LLMKube/blob/HEAD/CHANGELOG.md#0927-2026-09-14) [Compare Source](defilantech/LLMKube@v0.9.25...v0.9.27) ##### Bug Fixes - **deps:** bump google.golang.org/grpc to the CVE-2026-84445 fix ([#​1823](defilantech/LLMKube#1823)) ([cff58b5](defilantech/LLMKube@cff58b5)) </details> --- ### Configuration 📅 **Schedule**: (in timezone Europe/Rome) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC44My4xIiwidXBkYXRlZEluVmVyIjoiNDQuODMuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsicmVub3ZhdGUvY29udGFpbmVyIiwidHlwZS9wYXRjaCJdfQ==--> Reviewed-on: https://git.aresu.eu/GiorgioAresu/home-ops/pulls/2103
…2 → 0.9.29) (#667) This PR contains the following updates: | Package | Update | Change | |---|---|---| | [ghcr.io/defilantech/charts/llmkube](https://github.com/defilantech/LLMKube) | patch | `0.9.2` → `0.9.29` | --- ### Release Notes <details> <summary>defilantech/LLMKube (ghcr.io/defilantech/charts/llmkube)</summary> ### [`v0.9.29`](https://github.com/defilantech/LLMKube/blob/HEAD/CHANGELOG.md#0929-2026-09-16) [Compare Source](https://github.com/defilantech/LLMKube/compare/v0.9.28...v0.9.29) ##### Bug Fixes - **controller:** keep generated args when a non-CLI runtime overrides command ([#​1843](https://github.com/defilantech/LLMKube/issues/1843)) ([c262265](https://github.com/defilantech/LLMKube/commit/c262265a88a82549565d42788e33f8d38fe55c0c)) ### [`v0.9.28`](https://github.com/defilantech/LLMKube/blob/HEAD/CHANGELOG.md#0928-2026-09-16) [Compare Source](https://github.com/defilantech/LLMKube/compare/v0.9.27...v0.9.28) ##### Features - **runtime:** honor spec.args verbatim when spec.command is overridden ([#​1829](https://github.com/defilantech/LLMKube/issues/1829)) ([f2fcc09](https://github.com/defilantech/LLMKube/commit/f2fcc09a33aa52d26cd75e43d8537dfc388523c0)) ##### Bug Fixes - **foreman:** let the coder resolve a rebase conflict instead of failing loud ([#​1840](https://github.com/defilantech/LLMKube/issues/1840)) ([8dfd531](https://github.com/defilantech/LLMKube/commit/8dfd531f2f4a9ed9971cad15e0333f596ee3c34a)) - **router:** bound pool swaps and stop stale deactivate racing a new activation ([#​1838](https://github.com/defilantech/LLMKube/issues/1838)) ([a598ec7](https://github.com/defilantech/LLMKube/commit/a598ec7740641fe4c74fefa5fad6051a795179c1)) - **router:** rewrite model to served name on IfIdle fall-through ([#​1836](https://github.com/defilantech/LLMKube/issues/1836)) ([8276b50](https://github.com/defilantech/LLMKube/commit/8276b509aa6d6f9ee9c78d7a3b0db54e82558f48)) ##### Documentation - **labs:** Qwen3.8-Flash-Next with MTP on one Strix Halo ([#​1832](https://github.com/defilantech/LLMKube/issues/1832)) ([3acb00d](https://github.com/defilantech/LLMKube/commit/3acb00ddc05a30945b92acbfe67d6cccd469e02c)) ### [`v0.9.27`](https://github.com/defilantech/LLMKube/blob/HEAD/CHANGELOG.md#0927-2026-09-14) [Compare Source](https://github.com/defilantech/LLMKube/compare/v0.9.26...v0.9.27) ##### Bug Fixes - **deps:** bump google.golang.org/grpc to the CVE-2026-84445 fix ([#​1823](https://github.com/defilantech/LLMKube/issues/1823)) ([cff58b5](https://github.com/defilantech/LLMKube/commit/cff58b532de2dabfbd9362abd1c98dc844b02c85)) ### [`v0.9.26`](https://github.com/defilantech/LLMKube/blob/HEAD/CHANGELOG.md#0926-2026-09-14) [Compare Source](https://github.com/defilantech/LLMKube/compare/v0.9.25...v0.9.26) ##### Features - **controller:** metric-gated idle probe for the generic runtime ([#​1802](https://github.com/defilantech/LLMKube/issues/1802)) ([750be58](https://github.com/defilantech/LLMKube/commit/750be58dfa5542ec34a74c82e2fa10d9441ea8a9)) - **controller:** ModelPool reclaim policy returns the slot to spec.default after idle ([#​1796](https://github.com/defilantech/LLMKube/issues/1796)) ([9fd13cd](https://github.com/defilantech/LLMKube/commit/9fd13cd8e16ead745b1fee1a303ca5f442ac029b)) - **foreman:** expose node label on FleetNode metrics for fleet joins ([#​1785](https://github.com/defilantech/LLMKube/issues/1785)) ([5db0f7c](https://github.com/defilantech/LLMKube/commit/5db0f7c2e0a4309aaa15372c6c71e8c61a99e3dd)) - **foreman:** serve Agents from Anthropic-native endpoints ([#​1811](https://github.com/defilantech/LLMKube/issues/1811)) ([a2e2b2e](https://github.com/defilantech/LLMKube/commit/a2e2b2ea9b6976c34cbaf219de3d3aa2fd94cf54)) - **inferenceservice:** add resources.memoryLimit to decouple ceiling from reservation ([#​1764](https://github.com/defilantech/LLMKube/issues/1764)) ([53e5090](https://github.com/defilantech/LLMKube/commit/53e5090f6a097c380f6106e469ea740041ec66e7)) - **model:** resume interrupted single-file downloads via a content-keyed partial ([#​1765](https://github.com/defilantech/LLMKube/issues/1765)) ([#​1807](https://github.com/defilantech/LLMKube/issues/1807)) ([e3384f4](https://github.com/defilantech/LLMKube/commit/e3384f46f1e7ede48d275133c6eacecc92554ddd)) - **router:** mount /v1/embeddings and /v1/rerank on the proxy ([#​1819](https://github.com/defilantech/LLMKube/issues/1819)) ([3af89e9](https://github.com/defilantech/LLMKube/commit/3af89e9cb8e56bd20cea39197d9fa325f59f47b0)) - **router:** opt-in endpoint-level backends for per-request balancing ([#​1820](https://github.com/defilantech/LLMKube/issues/1820)) ([d9349e2](https://github.com/defilantech/LLMKube/commit/d9349e28b7aa9cb94d86625065f30d979404c9b6)) - **router:** poolActivation IfIdle serves the warm member when the incumbent is busy ([#​1787](https://github.com/defilantech/LLMKube/issues/1787)) ([d211a53](https://github.com/defilantech/LLMKube/commit/d211a53c4a00c0a44f832397b91095870ea546d8)) - **samples:** three-Spark ring DeepSeek-V4.1-Flash EXL3 TP3 samples and the multi-node guide section ([#​1816](https://github.com/defilantech/LLMKube/issues/1816)) ([6cb8389](https://github.com/defilantech/LLMKube/commit/6cb8389861b26f9649fd9f3ae7deaae9f92b8eac)) ##### Bug Fixes - **agent:** resolve hf:// model sources on the metal path ([#​1759](https://github.com/defilantech/LLMKube/issues/1759)) ([#​1789](https://github.com/defilantech/LLMKube/issues/1789)) ([0d4879c](https://github.com/defilantech/LLMKube/commit/0d4879c503bf936cd1b2ac3778d86af758de5e4b)) - **controller:** hold a multiNode group while a member is staging ([#​1757](https://github.com/defilantech/LLMKube/issues/1757)) ([#​1806](https://github.com/defilantech/LLMKube/issues/1806)) ([116ba95](https://github.com/defilantech/LLMKube/commit/116ba95cb293b6681f1532a7b7f615b95fbd1dc3)) - **controller:** probe multiNode worker rendezvous, fix readyMembers ([#​1781](https://github.com/defilantech/LLMKube/issues/1781)) ([#​1782](https://github.com/defilantech/LLMKube/issues/1782)) ([97acb8e](https://github.com/defilantech/LLMKube/commit/97acb8eac270af9eac442eac36be2f8e840781a7)) - **controller:** re-resolve a Model when spec.source changes ([#​1767](https://github.com/defilantech/LLMKube/issues/1767)) ([#​1805](https://github.com/defilantech/LLMKube/issues/1805)) ([9149419](https://github.com/defilantech/LLMKube/commit/9149419575e2ac2231fd2dfe09500198bf265434)) - **foreman-chart:** name the FleetNode in the stale-heartbeat alert ([#​1779](https://github.com/defilantech/LLMKube/issues/1779)) ([#​1783](https://github.com/defilantech/LLMKube/issues/1783)) ([d4138d2](https://github.com/defilantech/LLMKube/commit/d4138d2c64fe49fa7b29206939b37c0cd72b98f8)) - **foreman:** anchor coder rail diffs to the resolved upstream base SHA ([#​1803](https://github.com/defilantech/LLMKube/issues/1803)) ([08ce692](https://github.com/defilantech/LLMKube/commit/08ce6927cc6214ff379255ffde436260dcf0d719)) - **foreman:** clear a FleetNode reservation whose AgenticTask was deleted ([#​1791](https://github.com/defilantech/LLMKube/issues/1791)) ([#​1804](https://github.com/defilantech/LLMKube/issues/1804)) ([0cc53c4](https://github.com/defilantech/LLMKube/commit/0cc53c4ae414060d3f11aff3d3738d90b42e99b0)) - **foreman:** drain tasks before agent exit ([#​1799](https://github.com/defilantech/LLMKube/issues/1799)) ([9b22e73](https://github.com/defilantech/LLMKube/commit/9b22e7364c4476c62fb8ec210dad44056a27ecff)) - **foreman:** omit issue references from the reviewer prompt when the payload carries none ([#​1761](https://github.com/defilantech/LLMKube/issues/1761)) ([#​1808](https://github.com/defilantech/LLMKube/issues/1808)) ([36e0e0b](https://github.com/defilantech/LLMKube/commit/36e0e0bb2a49793bab62f42b3d2415c66fcf637b)) - **foreman:** reap orphaned in-cluster FleetNodes when agent pods disappear ([#​1778](https://github.com/defilantech/LLMKube/issues/1778)) ([#​1792](https://github.com/defilantech/LLMKube/issues/1792)) ([9fbee34](https://github.com/defilantech/LLMKube/commit/9fbee34cdaf28237c831175f9eac2479ce8f24d5)) - **foreman:** reject unverified reviewer GO ([#​1801](https://github.com/defilantech/LLMKube/issues/1801)) ([27910ed](https://github.com/defilantech/LLMKube/commit/27910ed9e09ea7b014f2180af03a4d3e8cfccc3c)) - **foreman:** tell a spin from a real max-turns burn ([#​1814](https://github.com/defilantech/LLMKube/issues/1814)) ([3e93fe4](https://github.com/defilantech/LLMKube/commit/3e93fe4e3ec0666240a67ca4e647027d0e982794)) - **foreman:** use the coder's PR description when the PR opens on review GO ([#​1768](https://github.com/defilantech/LLMKube/issues/1768)) ([#​1776](https://github.com/defilantech/LLMKube/issues/1776)) ([bff8344](https://github.com/defilantech/LLMKube/commit/bff8344c766ec35f5e019cb46f652b82e5ff365c)) - **grafana:** separate decode throughput axis ([#​1815](https://github.com/defilantech/LLMKube/issues/1815)) ([bf77989](https://github.com/defilantech/LLMKube/commit/bf77989c94542b7e4ba0e75f211dd489f3c04d9b)) - **model:** re-resolve a Model whose spec changed when no cache key exists ([#​1818](https://github.com/defilantech/LLMKube/issues/1818)) ([81be593](https://github.com/defilantech/LLMKube/commit/81be593387ef3697926b06a3f5c3398d34edab38)) - **rollout:** do not defer a scale-from-zero rollout as PodsBusy ([#​1794](https://github.com/defilantech/LLMKube/issues/1794)) ([062332f](https://github.com/defilantech/LLMKube/commit/062332f67712459936551e16cc0a4221c64411c1)) - **router:** return 503 + Retry-After when every IfIdle backend skips busy ([#​1797](https://github.com/defilantech/LLMKube/issues/1797)) ([396177d](https://github.com/defilantech/LLMKube/commit/396177d7ac8791d7dd9c5c1980af110a61e4bc75)) ##### Documentation - **labs:** reference build for GLM-5.3-Flash EXL3 on two DGX Sparks ([#​1784](https://github.com/defilantech/LLMKube/issues/1784)) ([cbdbb25](https://github.com/defilantech/LLMKube/commit/cbdbb2539ee08d5f84cd415385aa22ed877d8a1c)) ### [`v0.9.25`](https://github.com/defilantech/LLMKube/blob/HEAD/CHANGELOG.md#0925-2026-09-05) [Compare Source](https://github.com/defilantech/LLMKube/compare/v0.9.24...v0.9.25) ##### Features - **foreman:** diff-coverage gate for added lines no test executes ([#​1728](https://github.com/defilantech/LLMKube/issues/1728)) ([9666346](https://github.com/defilantech/LLMKube/commit/96663461f18c9a15cc56ed004fcf53eac4bde2a7)) - **foreman:** enforce reviewer execution runs via a no-test-run rail ([#​1747](https://github.com/defilantech/LLMKube/issues/1747)) ([152811a](https://github.com/defilantech/LLMKube/commit/152811a5b050494bb6e107464d030d8f41b35f0f)) - **foreman:** live turn stream so a coder run can be watched as it happens ([#​1717](https://github.com/defilantech/LLMKube/issues/1717)) ([34b9564](https://github.com/defilantech/LLMKube/commit/34b9564d93e27ca09c48d85ec0a9d7df0efa44ac)) - **foreman:** report missing planned children in Dispatched condition ([#​1743](https://github.com/defilantech/LLMKube/issues/1743)) ([e9ce0ff](https://github.com/defilantech/LLMKube/commit/e9ce0ffd7ad9e9802582e0d4fc1f3a3b14d82fc2)) - **modelrouter:** AgentGateway data plane beside Proxy and Gateway ([#​1711](https://github.com/defilantech/LLMKube/issues/1711)) ([af497b6](https://github.com/defilantech/LLMKube/commit/af497b675196b8e795bc9c4e7d810aa27f20fc5c)) - **model:** send a Hugging Face token on operator-driven downloads ([#​1750](https://github.com/defilantech/LLMKube/issues/1750)) ([#​1758](https://github.com/defilantech/LLMKube/issues/1758)) ([5ef4fa0](https://github.com/defilantech/LLMKube/commit/5ef4fa03f8c65998d1ed5b3841fd86c849b8b02e)) - multi-node inference groups (spec.multiNode) for vLLM ([#​1746](https://github.com/defilantech/LLMKube/issues/1746)) ([b56c080](https://github.com/defilantech/LLMKube/commit/b56c08058084ba00876eb001096abdadd80e34a2)) - **observability:** pin the llama.cpp metric contract ([#​1186](https://github.com/defilantech/LLMKube/issues/1186)) ([#​1754](https://github.com/defilantech/LLMKube/issues/1754)) ([da6dda9](https://github.com/defilantech/LLMKube/commit/da6dda9dabbc96edd7401bc221be57b08af25185)) ##### Bug Fixes - **agent:** sign s3:// model fetches on the metal path ([#​1709](https://github.com/defilantech/LLMKube/issues/1709)) ([3f30570](https://github.com/defilantech/LLMKube/commit/3f305703d6a5027e57efd9fedf19ab7c7ac9dc35)) - **agent:** skip comment-only hunks in the per-hunk mutation pass ([#​1742](https://github.com/defilantech/LLMKube/issues/1742)) ([82c0ffd](https://github.com/defilantech/LLMKube/commit/82c0ffd60bdcdc570b862dc748197ea177adebde)) - **controller:** bound inference container memory with a limit, and validate the quantity at admission ([#​1726](https://github.com/defilantech/LLMKube/issues/1726)) ([e4a3669](https://github.com/defilantech/LLMKube/commit/e4a3669afe3fcc4be46c9d4de8368a62216432bc)) - **controller:** make zero-findings scope-overlap demotion inert ([#​1737](https://github.com/defilantech/LLMKube/issues/1737)) ([8a44529](https://github.com/defilantech/LLMKube/commit/8a445297be8ac7f43bf306750a7fd3b0ca5ec080)) - **foreman:** bound the dependency wait when TimeoutSeconds is unset ([#​1736](https://github.com/defilantech/LLMKube/issues/1736)) ([db98633](https://github.com/defilantech/LLMKube/commit/db986338a9c468e908f2e6f6a2a670d34804bc7d)) - **foreman:** clear Dispatched condition on terminal Workloads ([#​1741](https://github.com/defilantech/LLMKube/issues/1741)) ([9786684](https://github.com/defilantech/LLMKube/commit/9786684f612dc645cf9e797ab64fbdfc1e327f03)) - **foreman:** pass upstreamURL to the coder post-push envtest gate ([#​1732](https://github.com/defilantech/LLMKube/issues/1732)) ([8d47306](https://github.com/defilantech/LLMKube/commit/8d47306b5ea98021c11c5a5b2ca2885f38fd70ae)) - **foreman:** preserve the workspace when the agent loop ends unsuccessfully ([#​1716](https://github.com/defilantech/LLMKube/issues/1716)) ([d17a7dd](https://github.com/defilantech/LLMKube/commit/d17a7dd8bbd9a1f52f0974c702cc544bb6d1e46f)) - **foreman:** report gate Job DeadlineExceeded as GATE-ERROR and make the gate deadline settable ([#​1748](https://github.com/defilantech/LLMKube/issues/1748)) ([#​1751](https://github.com/defilantech/LLMKube/issues/1751)) ([ef69b4c](https://github.com/defilantech/LLMKube/commit/ef69b4c09f08f648d21590d6367cce75c746e3aa)) - **foreman:** report rejected submissions on max-turns INCOMPLETE ([#​1714](https://github.com/defilantech/LLMKube/issues/1714)) ([e4f88e9](https://github.com/defilantech/LLMKube/commit/e4f88e9885ffe9152b3d6647c9c62aed5571e155)) - **foreman:** report the packages the diff-coverage gate could not measure ([#​1734](https://github.com/defilantech/LLMKube/issues/1734)) ([15ba740](https://github.com/defilantech/LLMKube/commit/15ba7408b3f3b4f4c9e138c42acba565209565b9)) - **foreman:** validate resolvedBy before ALREADY-RESOLVED skips verification ([#​1730](https://github.com/defilantech/LLMKube/issues/1730)) ([2b35d71](https://github.com/defilantech/LLMKube/commit/2b35d71454058abe91cdf5a22c5a42e6890ebceb)) ##### Documentation - **labs:** link the build page absolutely so the site prerender resolves it ([#​1756](https://github.com/defilantech/LLMKube/issues/1756)) ([5543aa9](https://github.com/defilantech/LLMKube/commit/5543aa986fd6e0522d6d3c64cd15d426972a3d3b)) - **labs:** reference build for DeepSeek V4 Flash Vision on two DGX Sparks ([#​1755](https://github.com/defilantech/LLMKube/issues/1755)) ([e80fd7d](https://github.com/defilantech/LLMKube/commit/e80fd7da01b5b69a9ce5bec41c99781f44376b9c)) ### [`v0.9.24`](https://github.com/defilantech/LLMKube/blob/HEAD/CHANGELOG.md#0924-2026-08-29) [Compare Source](https://github.com/defilantech/LLMKube/compare/v0.9.23...v0.9.24) ##### Features - **foreman:** make draft PR creation configurable per Agent ([#​1707](https://github.com/defilantech/LLMKube/issues/1707)) ([b8c040c](https://github.com/defilantech/LLMKube/commit/b8c040c55f971663f7850bf38b30b05efa5b3131)) ### [`v0.9.23`](https://github.com/defilantech/LLMKube/blob/HEAD/CHANGELOG.md#0923-2026-08-28) [Compare Source](https://github.com/defilantech/LLMKube/compare/v0.9.22...v0.9.23) ##### Features - **foreman:** per-hunk mutation coverage for envtest packages ([#​1705](https://github.com/defilantech/LLMKube/issues/1705)) ([45a5bce](https://github.com/defilantech/LLMKube/commit/45a5bce2e489ab60bda618b0a594a07b84d19892)) - **foreman:** publish Job-mode supervision capacity to FleetNode status ([#​1700](https://github.com/defilantech/LLMKube/issues/1700)) ([c8078bb](https://github.com/defilantech/LLMKube/commit/c8078bb8bccbc0931b299ff0d2675b34a7d8c81b)) - **githubpr:** open Foreman PRs as drafts and keep the reviewer's body ([#​1703](https://github.com/defilantech/LLMKube/issues/1703)) ([4cb10b9](https://github.com/defilantech/LLMKube/commit/4cb10b9e66c7c5074eae6a2d53141bc293e29e9d)) ##### Bug Fixes - **foreman:** bound and surface a missing-dependency wait ([#​1698](https://github.com/defilantech/LLMKube/issues/1698)) ([badfe7b](https://github.com/defilantech/LLMKube/commit/badfe7bed4582df365c6707254b0fb2d66bf1407)) - **foreman:** refresh the PR body after a fix cycle ([#​1704](https://github.com/defilantech/LLMKube/issues/1704)) ([a6bf02a](https://github.com/defilantech/LLMKube/commit/a6bf02add610f872f1fd01cd2006419751cd9e9a)) ##### Documentation - **spark:** correct the containerd config path that bricks a node ([#​1702](https://github.com/defilantech/LLMKube/issues/1702)) ([3be2bbb](https://github.com/defilantech/LLMKube/commit/3be2bbb7799b1d3f982ae373df8ee94b52f45d2f)) ### [`v0.9.22`](https://github.com/defilantech/LLMKube/blob/HEAD/CHANGELOG.md#0922-2026-08-28) [Compare Source](https://github.com/defilantech/LLMKube/compare/v0.9.21...v0.9.22) ##### Features - **chart:** alert when an engine is up but not serving ([#​1624](https://github.com/defilantech/LLMKube/issues/1624)) ([35142e5](https://github.com/defilantech/LLMKube/commit/35142e5367a57a47a5fdd577c3484699dd1411d4)) ##### Bug Fixes - **docker:** upgrade base packages so the foreman-agent image passes Trivy ([#​1696](https://github.com/defilantech/LLMKube/issues/1696)) ([7a0dba5](https://github.com/defilantech/LLMKube/commit/7a0dba562689a03be6f335b5057c03387ca19b6f)) ### [`v0.9.21`](https://github.com/defilantech/LLMKube/blob/HEAD/CHANGELOG.md#0921-2026-08-28) [Compare Source](https://github.com/defilantech/LLMKube/compare/v0.9.20...v0.9.21) ##### Features - **chart:** expose foreman-agent rollout strategy and grace period per pool ([#​1647](https://github.com/defilantech/LLMKube/issues/1647)) ([f26150c](https://github.com/defilantech/LLMKube/commit/f26150cd8a4baf8102f86df04775c92e44196fac)) - **cli:** llmkube foreman run, the unattended orchestration loop ([#​1653](https://github.com/defilantech/LLMKube/issues/1653)) ([c4b0a64](https://github.com/defilantech/LLMKube/commit/c4b0a648ab7b6c5bee6804f35c7bc75267198c01)) - **foreman:** add a rollup bucket for cross-stage contradictions ([#​1690](https://github.com/defilantech/LLMKube/issues/1690)) ([cf9f794](https://github.com/defilantech/LLMKube/commit/cf9f7942ae051aa2e66620495c448e32f6cd540a)) - **foreman:** block dependents of a contradicting dependency ([#​1695](https://github.com/defilantech/LLMKube/issues/1695)) ([9be57c2](https://github.com/defilantech/LLMKube/commit/9be57c2ff55a6f16e30d43f840c7c41c36925d7f)) - **foreman:** record claim and facts alongside cross-stage contradictions ([#​1682](https://github.com/defilantech/LLMKube/issues/1682)) ([0a35fc4](https://github.com/defilantech/LLMKube/commit/0a35fc4996e8b36f1e21c3709dc339e369319fbb)) - **foreman:** require per-clause coverage of an issue's stated behaviour ([#​1671](https://github.com/defilantech/LLMKube/issues/1671)) ([7c6368e](https://github.com/defilantech/LLMKube/commit/7c6368e3037f2e220db670412d686833e4e503d8)) - **foreman:** wire the coder stage into cross-stage contradictions (Rule 1) ([#​1680](https://github.com/defilantech/LLMKube/issues/1680)) ([c166662](https://github.com/defilantech/LLMKube/commit/c166662def70f3137e66214da83d51760d4a7682)) - **foreman:** wire the cross-stage contradiction detector into the reviewer path ([#​1675](https://github.com/defilantech/LLMKube/issues/1675)) ([a73f6fa](https://github.com/defilantech/LLMKube/commit/a73f6fabd918a582ca0d3c7c5a18f82032ef3c0c)) - **foreman:** wire the gate stage into cross-stage contradictions (Rule 4) ([#​1681](https://github.com/defilantech/LLMKube/issues/1681)) ([178ad61](https://github.com/defilantech/LLMKube/commit/178ad616dfe6a3627481db19d4205252b9a5877e)) - **helm:** support cert-manager for the webhook serving cert ([#​1646](https://github.com/defilantech/LLMKube/issues/1646)) ([fe77c9c](https://github.com/defilantech/LLMKube/commit/fe77c9c47fc71898c54a459039bff9c038460060)) ##### Bug Fixes - **controller:** populate status.acceleration by matching the current llama.cpp log format and reading the log head ([#​1677](https://github.com/defilantech/LLMKube/issues/1677)) ([3825420](https://github.com/defilantech/LLMKube/commit/38254203c80fd8dc630af6c10b936261e5d72bf8)) - **foreman-agent:** keep claiming in pollOnce until a slot is full ([#​1665](https://github.com/defilantech/LLMKube/issues/1665)) ([691f464](https://github.com/defilantech/LLMKube/commit/691f46472afdae102bed00d824aad12d1395ec26)) - **foreman:** do not open a fix iteration for an empty demoted NO-GO ([#​1641](https://github.com/defilantech/LLMKube/issues/1641)) ([4ac7e6b](https://github.com/defilantech/LLMKube/commit/4ac7e6bee39349d493496c7f599228cf104df9c6)) - **foreman:** fill the transcript budget when truncating ([#​1673](https://github.com/defilantech/LLMKube/issues/1673)) ([76ce407](https://github.com/defilantech/LLMKube/commit/76ce40756e5cf275c884be531a2fd66e16cb366b)) - **foreman:** make the ALREADY-RESOLVED cascade-skip transitive ([#​1689](https://github.com/defilantech/LLMKube/issues/1689)) ([6f9a10c](https://github.com/defilantech/LLMKube/commit/6f9a10c2f930269330864af4e8e770f896f48efe)) - **foreman:** make verdictClaimed first-writer-wins so demotion provenance survives a second rail ([#​1683](https://github.com/defilantech/LLMKube/issues/1683)) ([0e01114](https://github.com/defilantech/LLMKube/commit/0e011142b8e7eed0403110738eb570dc47fa5294)) - **foreman:** round-robin Job-mode placement across eligible nodes ([#​1669](https://github.com/defilantech/LLMKube/issues/1669)) ([e7a6b73](https://github.com/defilantech/LLMKube/commit/e7a6b7375ed173e28113d2116949467648f89d83)) - **foreman:** wire the deleted-reference rail into the coder GO path ([#​1666](https://github.com/defilantech/LLMKube/issues/1666)) ([fe8057a](https://github.com/defilantech/LLMKube/commit/fe8057adb0cd168af2b304bedfe0b9e0673c7b57)) - **foreman:** wire the pre-flight staleness check into coder dispatch ([#​1670](https://github.com/defilantech/LLMKube/issues/1670)) ([436a918](https://github.com/defilantech/LLMKube/commit/436a918b1d98aa077b7fedf704c9c183b6602718)) - **foreman:** wire the reviewer diff gate so an ungrounded GO is recorded ([#​1668](https://github.com/defilantech/LLMKube/issues/1668)) ([a9b048c](https://github.com/defilantech/LLMKube/commit/a9b048c7daf7b7ed15dd353cb18cce458f9e5606)) - **prefetch:** honour InferenceService modelCache.claimName ([#​1691](https://github.com/defilantech/LLMKube/issues/1691)) ([0201e29](https://github.com/defilantech/LLMKube/commit/0201e292f5828b07e45ef80dca3057effc7de583)) - **test:** make the archival failure-injection tests uid-independent ([#​1658](https://github.com/defilantech/LLMKube/issues/1658)) ([2acaa15](https://github.com/defilantech/LLMKube/commit/2acaa153454f2d92c24d606c71a5980b6e55f59f)) ### [`v0.9.20`](https://github.com/defilantech/LLMKube/blob/HEAD/CHANGELOG.md#0920-2026-08-24) [Compare Source](https://github.com/defilantech/LLMKube/compare/v0.9.19...v0.9.20) ##### Features - **foreman:** opt-in archival of task audit records and transcripts ([#​1655](https://github.com/defilantech/LLMKube/issues/1655)) ([c577133](https://github.com/defilantech/LLMKube/commit/c577133c7f1b5d49ddf4d1f7c936dfd5c72595f0)) - **foreman:** report the Kubernetes node on FleetNode.status, not as identity ([#​1649](https://github.com/defilantech/LLMKube/issues/1649)) ([7563e8a](https://github.com/defilantech/LLMKube/commit/7563e8a8165c5997a854a21ee31345459b66ceeb)) ##### Bug Fixes - **controller:** carry Model tolerations onto the prefetch Job ([#​1622](https://github.com/defilantech/LLMKube/issues/1622)) ([d0db838](https://github.com/defilantech/LLMKube/commit/d0db838a6ca442a1adf70b64cc023eb18eb86e48)) - **controller:** clear the controller's own schedulingStatus once a service is Ready ([#​1633](https://github.com/defilantech/LLMKube/issues/1633)) ([315f34d](https://github.com/defilantech/LLMKube/commit/315f34db6387da888bbcc4d65eabf75b35e44376)) - Empty payload.repo silently defeats the upstream-base fetch: task branches cut from a stale fork HEAD ([#​1625](https://github.com/defilantech/LLMKube/issues/1625)) ([#​1626](https://github.com/defilantech/LLMKube/issues/1626)) ([27a015a](https://github.com/defilantech/LLMKube/commit/27a015a279863392bbac33dc06e46fa4a1087d39)) - **foreman:** carry the in-pod result extras on every Job-mode branch ([#​1657](https://github.com/defilantech/LLMKube/issues/1657)) ([d1ce51c](https://github.com/defilantech/LLMKube/commit/d1ce51c589ab0b3f45d273df29b98483ea1db675)) - **foreman:** free the agent's in-process slot while a Job-mode task runs ([#​1635](https://github.com/defilantech/LLMKube/issues/1635)) ([0d64fbb](https://github.com/defilantech/LLMKube/commit/0d64fbb5b823ec9c530cdb010a871d4c76707188)) - **foreman:** gate the make-invoked CI checks, and pin them against the workflows ([#​1642](https://github.com/defilantech/LLMKube/issues/1642)) ([4e7ab7b](https://github.com/defilantech/LLMKube/commit/4e7ab7b74313c6bf9064d8a0d939a8338b0c8f3f)) - **foreman:** make the CustomResourceState config produce usable metrics ([#​1650](https://github.com/defilantech/LLMKube/issues/1650)) ([1620443](https://github.com/defilantech/LLMKube/commit/1620443af3560926801718b33ddf3592dac1e690)) ##### Documentation - add ROCm host-retune runbook for >64GB on Strix Halo ([#​1387](https://github.com/defilantech/LLMKube/issues/1387)) ([fff5e59](https://github.com/defilantech/LLMKube/commit/fff5e59cf1735aeaa0b4d932505fdaa23a07bfd5)) - fix guide instructions that fail against the shipped API ([#​1629](https://github.com/defilantech/LLMKube/issues/1629)) ([fba0bf4](https://github.com/defilantech/LLMKube/commit/fba0bf4d8cdeab13d521f0fa32da8272a2c4a0d1)) - **proposals:** foreman run, an unattended orchestration loop ([#​1652](https://github.com/defilantech/LLMKube/issues/1652)) ([df57f49](https://github.com/defilantech/LLMKube/commit/df57f490c1f4aa01ccb5dbf6e8dbf238aaee3a18)) - reframe the multi-GPU guide from an Issue [#​2](https://github.com/defilantech/LLMKube/issues/2) validation plan into a deployment guide ([#​1631](https://github.com/defilantech/LLMKube/issues/1631)) ([907ac8d](https://github.com/defilantech/LLMKube/commit/907ac8d8ee5bef229562ec5340ecdcb9e0576f0d)) - **runbook:** correct the metal-agent memory-pressure runbook against pkg/agent ([#​1630](https://github.com/defilantech/LLMKube/issues/1630)) ([f665674](https://github.com/defilantech/LLMKube/commit/f6656741234aa605d3f891598663df142a815171)) - serving one model across two DGX Sparks via llama.cpp RPC ([#​1620](https://github.com/defilantech/LLMKube/issues/1620)) ([7eaf04b](https://github.com/defilantech/LLMKube/commit/7eaf04b46b2aa5ea4f7939f2751df412128be86b)) ### [`v0.9.19`](https://github.com/defilantech/LLMKube/blob/HEAD/CHANGELOG.md#0919-2026-08-20) [Compare Source](https://github.com/defilantech/LLMKube/compare/v0.9.18...v0.9.19) ##### Features - **foreman:** content-based test-coverage vouch for feature-named test files ([#​1614](https://github.com/defilantech/LLMKube/issues/1614)) ([477a599](https://github.com/defilantech/LLMKube/commit/477a599b06f3196438a055ab419a7661846587ba)) - **foreman:** deterministic cross-stage contradiction detection ([#​1589](https://github.com/defilantech/LLMKube/issues/1589)) ([0bd102a](https://github.com/defilantech/LLMKube/commit/0bd102a95514d33066b016f5edae278d3986257b)) - **foreman:** execution-verification section in the reviewer rubric ([#​1617](https://github.com/defilantech/LLMKube/issues/1617)) ([03702a0](https://github.com/defilantech/LLMKube/commit/03702a0a54858ad21fcd398adceee4786f9b8564)) - **foreman:** extract behaviour clauses from an issue body ([#​1590](https://github.com/defilantech/LLMKube/issues/1590)) ([041fab7](https://github.com/defilantech/LLMKube/commit/041fab76c7901589c86f96c586b275c7291d8b7a)) - **foreman:** implement the Agent Validated condition and stamp under-configured runs ([#​1611](https://github.com/defilantech/LLMKube/issues/1611)) ([61e65a4](https://github.com/defilantech/LLMKube/commit/61e65a4d3435256a3605614fc2ab6cfbe9d9bd3b)) - **foreman:** let GateProfile declare a test-layout convention ([#​1607](https://github.com/defilantech/LLMKube/issues/1607)) ([16b42ce](https://github.com/defilantech/LLMKube/commit/16b42ce0ffd8f88cb907e0fde79118a8c754ad64)) - **foreman:** MCP call aggregation for the foreman.audit.v1 record ([#​1591](https://github.com/defilantech/LLMKube/issues/1591)) ([7b8e489](https://github.com/defilantech/LLMKube/commit/7b8e489763490824967a7b9327de020204606b7c)) - **foreman:** rail detecting a GO from a reviewer that never diffed ([#​1588](https://github.com/defilantech/LLMKube/issues/1588)) ([376fa58](https://github.com/defilantech/LLMKube/commit/376fa5869015d1dbc90998064a6574c63ad6f94a)) - **foreman:** test-layout mapping for parallel test trees ([#​1592](https://github.com/defilantech/LLMKube/issues/1592)) ([df7f719](https://github.com/defilantech/LLMKube/commit/df7f719b468919da69a68f1f3e7bf3d005d6b708)) - **foreman:** vouch modified test files on their added lines ([#​1619](https://github.com/defilantech/LLMKube/issues/1619)) ([dd6087b](https://github.com/defilantech/LLMKube/commit/dd6087bb117495b3d3dd6f0d485c10e99ad9d3e0)) ##### Bug Fixes - **chart:** grant the inference operator batch/jobs and pods/log, and stop the RBAC guard covering one operator with the other's grants ([#​1595](https://github.com/defilantech/LLMKube/issues/1595)) ([bb8d505](https://github.com/defilantech/LLMKube/commit/bb8d5050c663b0538a137bceb06b1238814866e4)) - **controller:** bound the prefetch Job read and stop one Model stalling the rest ([#​1598](https://github.com/defilantech/LLMKube/issues/1598)) ([82f4e47](https://github.com/defilantech/LLMKube/commit/82f4e47081da1fa85c14879dd6f5037f27dc62f5)) - **foreman:** decide bash writes on the command word, not a substring ([#​1587](https://github.com/defilantech/LLMKube/issues/1587)) ([9a0aaba](https://github.com/defilantech/LLMKube/commit/9a0aaba99e56148e13905db24c3aa9699a226de7)) - **foreman:** record why a reviewer rail could not run ([#​1606](https://github.com/defilantech/LLMKube/issues/1606)) ([135ba88](https://github.com/defilantech/LLMKube/commit/135ba88f5bbf36745c68561e67979110a2b052f2)) - **foreman:** skip the NoSystemPrompt floor for deterministic agents ([#​1615](https://github.com/defilantech/LLMKube/issues/1615)) ([3c99ac0](https://github.com/defilantech/LLMKube/commit/3c99ac04d0bf3770ac7028a996f2db9e7e24adff)) ##### Documentation - **foreman:** document gateProfile.testLayout ([#​1612](https://github.com/defilantech/LLMKube/issues/1612)) ([4466e6f](https://github.com/defilantech/LLMKube/commit/4466e6fd87d60c991703e603ecac5d4d3125196e)) ### [`v0.9.18`](https://github.com/defilantech/LLMKube/blob/HEAD/CHANGELOG.md#0918-2026-08-18) [Compare Source](https://github.com/defilantech/LLMKube/compare/v0.9.17...v0.9.18) ##### Features - **controller:** architecture-aware runtime placement ([#​1544](https://github.com/defilantech/LLMKube/issues/1544)) ([6694d0b](https://github.com/defilantech/LLMKube/commit/6694d0b010e64834e884a81f85412f7082ec9adf)) - **controller:** speculativeDecoding.draftModel for companion-file drafters ([#​1564](https://github.com/defilantech/LLMKube/issues/1564)) ([a8526a8](https://github.com/defilantech/LLMKube/commit/a8526a848ba018e38bbdbcbca86286a1b79c5b85)) - **controller:** surface actual GPU offload in InferenceService status ([#​1566](https://github.com/defilantech/LLMKube/issues/1566)) ([a2335c6](https://github.com/defilantech/LLMKube/commit/a2335c60929f62b97d5d63943a04c13b68a319ea)) - draft-model speculative decoding on InferenceService ([#​1533](https://github.com/defilantech/LLMKube/issues/1533)) ([81881d6](https://github.com/defilantech/LLMKube/commit/81881d6813563bd3210089d6dabb3e642869468b)) - **foreman:** add optional Agent.spec.maxConcurrentTasks to bound in-flight tasks ([#​1546](https://github.com/defilantech/LLMKube/issues/1546)) ([0afa9c9](https://github.com/defilantech/LLMKube/commit/0afa9c9d6e7e402330ce3fc39aacfe363142ea3d)) - **foreman:** flag issue references removed by a diff ([#​1574](https://github.com/defilantech/LLMKube/issues/1574)) ([0f2d30d](https://github.com/defilantech/LLMKube/commit/0f2d30d6d40b2c04cb695d2513a1ed03ee2c5718)) - **foreman:** honour the target repository's PR template when opening a PR ([#​1562](https://github.com/defilantech/LLMKube/issues/1562)) ([5d09e07](https://github.com/defilantech/LLMKube/commit/5d09e078a1bf44866c73c7672cd1e28df5a74ec3)) - **foreman:** mutation-check decision logic (revert the fix, require a test to fail) ([#​1578](https://github.com/defilantech/LLMKube/issues/1578)) ([07754f1](https://github.com/defilantech/LLMKube/commit/07754f1c9bf9805eeb2f05e6a376a46551e527db)) - **foreman:** operator-emitted task outcome counters ([#​1563](https://github.com/defilantech/LLMKube/issues/1563)) ([2386ad8](https://github.com/defilantech/LLMKube/commit/2386ad8a80641bbab202e57839b3cab127a30f88)) - **foreman:** pre-flight staleness detection for already-addressed issues ([#​1577](https://github.com/defilantech/LLMKube/issues/1577)) ([cc9d594](https://github.com/defilantech/LLMKube/commit/cc9d59405454b7845b476413b6375a70c15c4ef6)) ##### Bug Fixes - **controller:** AND the arch requirement into nodeAffinity instead of ORing a new term ([#​1584](https://github.com/defilantech/LLMKube/issues/1584)) ([4e5e5d4](https://github.com/defilantech/LLMKube/commit/4e5e5d42ea573cb9602f67a1793e0ec74f556ea4)) - **controller:** do not roll over in-flight work when idleness is undetermined ([#​1543](https://github.com/defilantech/LLMKube/issues/1543)) ([daba4e1](https://github.com/defilantech/LLMKube/commit/daba4e11c1c6b21b2aac5bc473c84de91b908f1a)) - **controller:** expose --dri-render-gid through the chart and stop defaulting it to the video group ([#​1586](https://github.com/defilantech/LLMKube/issues/1586)) ([66029e7](https://github.com/defilantech/LLMKube/commit/66029e7b959537a8a2d28cef19515b2dfaabb7e1)) - **controller:** inject the DRI render GID into Vulkan pod supplementalGroups ([#​1569](https://github.com/defilantech/LLMKube/issues/1569)) ([79f8f08](https://github.com/defilantech/LLMKube/commit/79f8f0846c06f72e8873acabb562f12be2ed2bfd)) - **controller:** let draft-mtp accept an optional draftModelRef ([#​1547](https://github.com/defilantech/LLMKube/issues/1547)) ([98fd3a0](https://github.com/defilantech/LLMKube/commit/98fd3a0f886f9f9a85dd6d156c1071fc68e116f1)) - **controller:** let ModelTransferHealthy recover after a retried download succeeds ([#​1539](https://github.com/defilantech/LLMKube/issues/1539)) ([978f5ee](https://github.com/defilantech/LLMKube/commit/978f5ee7b7875c3b9ed7c9dbdd3f6ef2fced32b6)) - **deps:** bump the Go toolchain to 1.26.6 for two stdlib advisories ([#​1534](https://github.com/defilantech/LLMKube/issues/1534)) ([627ca93](https://github.com/defilantech/LLMKube/commit/627ca936dad7db35db8c5419a0d318f8530fe5ee)) - **foreman:** do not let an unavailable diff disable the grounded-finding rail ([#​1576](https://github.com/defilantech/LLMKube/issues/1576)) ([812186b](https://github.com/defilantech/LLMKube/commit/812186b5fca0a1eec906adaa749b1a34514d0a7d)) - **foreman:** do not reserve a FleetNode for Job-mode AgenticTasks ([#​1558](https://github.com/defilantech/LLMKube/issues/1558)) ([55a1434](https://github.com/defilantech/LLMKube/commit/55a1434408be54e29b71886a6953498ad24b1bb1)) - **foreman:** honour Workload spec.repo for gate, push and PR, not just clone ([#​1545](https://github.com/defilantech/LLMKube/issues/1545)) ([d949e3f](https://github.com/defilantech/LLMKube/commit/d949e3f0f82e4d4eb3487eb2c9aab20cd0784ab1)) - **foreman:** let the reviewer author an uncapped PR body via extra.prBody ([#​1575](https://github.com/defilantech/LLMKube/issues/1575)) ([827cad8](https://github.com/defilantech/LLMKube/commit/827cad8c32ac05552307eb6b866c60686df1e4fd)) - **foreman:** map test files to their modules in scope-overlap, and dedupe issue file refs ([#​1573](https://github.com/defilantech/LLMKube/issues/1573)) ([fa02f25](https://github.com/defilantech/LLMKube/commit/fa02f25cb04b3091eeea0c066d8ee5457a194c26)) - **foreman:** mount the agent's own gate-cache PVC, and honour an empty name ([#​1557](https://github.com/defilantech/LLMKube/issues/1557)) ([b09c3ad](https://github.com/defilantech/LLMKube/commit/b09c3ad12677d0dfbc56a2ba83a2bf21592d8ed2)) - **foreman:** remap unsupported emptiness claims to ERROR instead of NO-GO ([#​1565](https://github.com/defilantech/LLMKube/issues/1565)) ([ba7e3f9](https://github.com/defilantech/LLMKube/commit/ba7e3f9de9aef81fff9dbefc10ce5e5a93b966a9)) - **foreman:** restore the coder grounding rail's MCP prefix after the [#​1527](https://github.com/defilantech/LLMKube/issues/1527) rename ([#​1582](https://github.com/defilantech/LLMKube/issues/1582)) ([1b289e6](https://github.com/defilantech/LLMKube/commit/1b289e63cff796749326491bda8c6ac2e45b1078)) - **foreman:** stop Job-mode AgenticTasks orphaning their previous Job on re-dispatch ([#​1556](https://github.com/defilantech/LLMKube/issues/1556)) ([32d1d65](https://github.com/defilantech/LLMKube/commit/32d1d6524592e58ddf445ba704db54f7f874b1fa)) - namespace MCP tools with \_\_ so names match the OAI pattern ([#​1527](https://github.com/defilantech/LLMKube/issues/1527)) ([1cd05d7](https://github.com/defilantech/LLMKube/commit/1cd05d7c074ddbe71171558468e78d3652ac2f1f)) - omit the issue reference when a task has no issue number ([#​1532](https://github.com/defilantech/LLMKube/issues/1532)) ([f881ac3](https://github.com/defilantech/LLMKube/commit/f881ac310cc30c5044bab0470f34931c3d1f2ffc)) - stop discarding a coder's diff when submit\_result omits a message ([#​1529](https://github.com/defilantech/LLMKube/issues/1529)) ([3cd01ac](https://github.com/defilantech/LLMKube/commit/3cd01ac70f2b0fb3a6634b026248c0032eecb2c9)) ##### Documentation - make spec.files discoverable from spec.source for multi-artifact models ([#​1540](https://github.com/defilantech/LLMKube/issues/1540)) ([25777da](https://github.com/defilantech/LLMKube/commit/25777da1d00bce365d596fdde39b9eaa4e3da260)) ### [`v0.9.17`](https://github.com/defilantech/LLMKube/blob/HEAD/CHANGELOG.md#0917-2026-08-13) [Compare Source](https://github.com/defilantech/LLMKube/compare/v0.9.16...v0.9.17) ##### Features - **chart:** foreman.crs.namespace — render the CRS ConfigMap where kube-state-metrics can mount it ([#​1492](https://github.com/defilantech/LLMKube/issues/1492)) ([5bb8c19](https://github.com/defilantech/LLMKube/commit/5bb8c19c577dce55c502fb2f990b3648bd24a5e9)) - fetch\_pull\_request: include check-run output (title/summary/text) for failed runs ([#​1481](https://github.com/defilantech/LLMKube/issues/1481)) ([#​1505](https://github.com/defilantech/LLMKube/issues/1505)) ([e323f32](https://github.com/defilantech/LLMKube/commit/e323f32d18556db91e255ce61123d48b79c077d6)) ##### Bug Fixes - **chart:** heartbeat alert uses time(), not the nonexistent time\_seconds() ([#​1494](https://github.com/defilantech/LLMKube/issues/1494)) ([bf8c1a0](https://github.com/defilantech/LLMKube/commit/bf8c1a034b0209aad030905e2591941a209d63b5)) - **chart:** scope agent Deployment selectors to their pool ([#​1524](https://github.com/defilantech/LLMKube/issues/1524)) ([0da2a9e](https://github.com/defilantech/LLMKube/commit/0da2a9ee6f4b4205d6316850c988f4f92cdba1d4)) - detect the scheduler's other wording for an unusable cache volume ([#​1513](https://github.com/defilantech/LLMKube/issues/1513)) ([64ee9d7](https://github.com/defilantech/LLMKube/commit/64ee9d7788dc8fe4c17b229c461ac3f7ddae1562)) - EnsurePR treats a closed unmerged PR as satisfied — retried work ends with no PR ([#​1476](https://github.com/defilantech/LLMKube/issues/1476)) ([#​1507](https://github.com/defilantech/LLMKube/issues/1507)) ([82baff8](https://github.com/defilantech/LLMKube/commit/82baff88362cac188c3b4c68654734eaffa5e9b3)) - extract path refs the extension gate was discarding ([#​1516](https://github.com/defilantech/LLMKube/issues/1516)) ([7166920](https://github.com/defilantech/LLMKube/commit/71669204cddcff8f0dd05671c5593403c8e02410)) - **foreman:** bound edit-free resets earned from bash-shaped writes ([#​1521](https://github.com/defilantech/LLMKube/issues/1521)) ([41a2829](https://github.com/defilantech/LLMKube/commit/41a282920345b0a5792d68ce6362d5d739b1f15a)) - **foreman:** bound grep match lines so one minified file cannot end a run ([#​1488](https://github.com/defilantech/LLMKube/issues/1488)) ([952f8af](https://github.com/defilantech/LLMKube/commit/952f8af1fb2eee2f8918383a40f148c32db82ae0)) - **foreman:** one tool list, so a tool cannot ship unusable again ([#​1486](https://github.com/defilantech/LLMKube/issues/1486)) ([e77d7cf](https://github.com/defilantech/LLMKube/commit/e77d7cf3435ac485bd4424b2f6c6c0df80585043)) - **foreman:** reviewers review the change, not the base branch (+ cross-project remote guard) ([#​1490](https://github.com/defilantech/LLMKube/issues/1490)) ([0f3fa83](https://github.com/defilantech/LLMKube/commit/0f3fa83f5ce8bdb89d0deb176844de7dc9346195)) - **foreman:** route all three consumers through the provider seams ([#​1510](https://github.com/defilantech/LLMKube/issues/1510)) ([79448fc](https://github.com/defilantech/LLMKube/commit/79448fca464c3377fc89685db8850b28b5d82a4d)) - **modelpool:** guard the nil HTTPClient that panics every swap ([#​1485](https://github.com/defilantech/LLMKube/issues/1485)) ([dc3fa50](https://github.com/defilantech/LLMKube/commit/dc3fa50faa2d5bc8eb38b11e5c6548acffbb86f5)) - name the cause when a model cache PV can never bind ([#​1511](https://github.com/defilantech/LLMKube/issues/1511)) ([772c99d](https://github.com/defilantech/LLMKube/commit/772c99db80580d2b5a3db56536c600ce21dd70c2)) - normalizeContainers strips operator-owned SecurityContext fields before drift comparison ([#​1462](https://github.com/defilantech/LLMKube/issues/1462)) ([#​1506](https://github.com/defilantech/LLMKube/issues/1506)) ([8d291ca](https://github.com/defilantech/LLMKube/commit/8d291ca2ca36fbcb0d06ef587c30dce88b86b96f)) - **operator:** apply nodeSelector and tolerations to non-GPU services ([#​1504](https://github.com/defilantech/LLMKube/issues/1504)) ([dc3bac3](https://github.com/defilantech/LLMKube/commit/dc3bac3a7476dbe05fae8d90daab30655a880eee)) - populate status.size and status.gguf for s3:// model sources ([#​1522](https://github.com/defilantech/LLMKube/issues/1522)) ([69a76fd](https://github.com/defilantech/LLMKube/commit/69a76fdd9ff4d10c3e7c563382b12c2bd633bf05)) - **router-proxy:** honour 0 as disable, pin the metrics port in tests, refresh the dashboard catalog ([#​1519](https://github.com/defilantech/LLMKube/issues/1519)) ([774e0b9](https://github.com/defilantech/LLMKube/commit/774e0b95865668fc422192575c4fc7b19279e90c)) - **router-proxy:** reject colliding listener addresses at startup ([#​1518](https://github.com/defilantech/LLMKube/issues/1518)) ([fc49a5d](https://github.com/defilantech/LLMKube/commit/fc49a5d2c3c0deed376e5fe62d3ef625f8eb07c3)) - surface the unbindable-cache diagnosis instead of dropping it ([#​1512](https://github.com/defilantech/LLMKube/issues/1512)) ([03c0f17](https://github.com/defilantech/LLMKube/commit/03c0f179dd507cecb9a707f440ddbf007815904a)) ##### Documentation - **foreman:** refresh model compatibility from what the fleet has proven ([#​1483](https://github.com/defilantech/LLMKube/issues/1483)) ([8ccdbee](https://github.com/defilantech/LLMKube/commit/8ccdbee27c8cf2cfc1352e62094e5aa3d48ddec6)) - how to recognise a cache volume the provisioner never stamped ([#​1514](https://github.com/defilantech/LLMKube/issues/1514)) ([12d59c2](https://github.com/defilantech/LLMKube/commit/12d59c2f62629ee636ae83bd6853e378aca5abae)) - **operations:** document ModelPool in the GPU-sharing guide ([#​1508](https://github.com/defilantech/LLMKube/issues/1508)) ([c2c3a84](https://github.com/defilantech/LLMKube/commit/c2c3a8406434b133e9855b00e17d40793af7cc6a)) ### [`v0.9.16`](https://github.com/defilantech/LLMKube/blob/HEAD/CHANGELOG.md#0916-2026-08-10) [Compare Source](https://github.com/defilantech/LLMKube/compare/v0.9.15...v0.9.16) ##### Features - **chart:** PodMonitor for router-proxy metrics ([#​1473](https://github.com/defilantech/LLMKube/issues/1473)) ([fd7c640](https://github.com/defilantech/LLMKube/commit/fd7c6404fe30b2da37170c43ab04e047488a0640)) - **foreman:** advisory two-site parity signal in the coder gate ([#​1456](https://github.com/defilantech/LLMKube/issues/1456)) ([944f90d](https://github.com/defilantech/LLMKube/commit/944f90d85aafa89a3e5302c38eda025901968a49)) - **foreman:** image input, so a vision-capable coder can see what it rendered ([#​1471](https://github.com/defilantech/LLMKube/issues/1471)) ([6c122be](https://github.com/defilantech/LLMKube/commit/6c122bea5d77f1ffca975890c9d1ae6faa461321)) - **foreman:** read-only fetch\_pull\_request tool ([#​1458](https://github.com/defilantech/LLMKube/issues/1458)) ([7f4910b](https://github.com/defilantech/LLMKube/commit/7f4910b83f6dafcfcf5a1b49b04de49f3afe7db7)) - **modelpool:** cross-pod sticky model swapping on a shared GPU slot ([#​1393](https://github.com/defilantech/LLMKube/issues/1393)) ([ba7777d](https://github.com/defilantech/LLMKube/commit/ba7777d42d1b8e03f3ddea8e8cdf0f11ffd3ae8d)) - **router-proxy:** expose llmkube\_router\_\* metrics on a dedicated listener ([#​1457](https://github.com/defilantech/LLMKube/issues/1457)) ([ca3730d](https://github.com/defilantech/LLMKube/commit/ca3730d1453edd451a235fec369bb32aa359af2d)) ##### Bug Fixes - **controller:** make the custom CA additive to the system trust store ([#​1469](https://github.com/defilantech/LLMKube/issues/1469)) ([d490059](https://github.com/defilantech/LLMKube/commit/d490059f8b64113fd70284f43b07373ba52e56ab)) - **controller:** stage files and mmproj from an s3:// object store ([#​1475](https://github.com/defilantech/LLMKube/issues/1475)) ([769b60d](https://github.com/defilantech/LLMKube/commit/769b60d22dd3772f6d86a0c6ff5a40a007a079a8)) - **dashboard:** AMD dashboard vendor hygiene — remove runtime-agnostic llama.cpp panels, standardize on DS\_PROMETHEUS ([#​1446](https://github.com/defilantech/LLMKube/issues/1446)) ([c6c0670](https://github.com/defilantech/LLMKube/commit/c6c06706f8df0f12c4c48ea2d2eebe9137a4f63e)) - **dashboard:** retarget amd-gpu-observability off amdgpu\_\*-only queries ([#​1474](https://github.com/defilantech/LLMKube/issues/1474)) ([a02e8e8](https://github.com/defilantech/LLMKube/commit/a02e8e84ae0f22c914ae5f5793db4879dca46312)) ### [`v0.9.15`](https://github.com/defilantech/LLMKube/blob/HEAD/CHANGELOG.md#0915-2026-08-08) [Compare Source](https://github.com/defilantech/LLMKube/compare/v0.9.14...v0.9.15) ##### Features - **chart:** expose --ca-cert-configmap as controllerManager.caCertConfigMap ([#​1440](https://github.com/defilantech/LLMKube/issues/1440)) ([606c7f9](https://github.com/defilantech/LLMKube/commit/606c7f9393a412e9553e93ff3fde862bded1773d)) - **controller:** diagnose CUDA driver/runtime mismatch from crashed pods ([#​1425](https://github.com/defilantech/LLMKube/issues/1425)) ([06670f9](https://github.com/defilantech/LLMKube/commit/06670f9905664ad9ae0f7f40a04139da9cf9c1cc)) - **controller:** diagnose model-transfer failures from init containers ([#​1463](https://github.com/defilantech/LLMKube/issues/1463)) ([a092de3](https://github.com/defilantech/LLMKube/commit/a092de318b6cf959af6cec44c194e5272ccb6b88)) - **foreman:** advisory gate for command-string changes tested only by shape ([#​1421](https://github.com/defilantech/LLMKube/issues/1421)) ([b580e18](https://github.com/defilantech/LLMKube/commit/b580e18803f3ed6d1660c5d81e324290f6b795df)) - **inferenceservice:** add spec.modelCache.persistence for an ephemeral model cache ([#​1452](https://github.com/defilantech/LLMKube/issues/1452)) ([c4ae7ee](https://github.com/defilantech/LLMKube/commit/c4ae7ee6e5ffd3f7bdd9463891e3f959b57a0f5c)) ##### Bug Fixes - **api:** reject unservable speculativeDecoding type draft at admission ([#​1455](https://github.com/defilantech/LLMKube/issues/1455)) ([5d3ab73](https://github.com/defilantech/LLMKube/commit/5d3ab73b3396046aedfd0f26a262de807164c534)) - **chart:** default the router-proxy image tag to the chart appVersion ([#​1431](https://github.com/defilantech/LLMKube/issues/1431)) ([3e07b81](https://github.com/defilantech/LLMKube/commit/3e07b814f07bb954acfb446419d5e9ecbcb2496c)) - **controller:** clean up orphaned .tmp files from interrupted model transfers ([#​1459](https://github.com/defilantech/LLMKube/issues/1459)) ([2f453d6](https://github.com/defilantech/LLMKube/commit/2f453d621279c787fa3592020901120e93ed36d6)) - **controller:** emit draft-simple for speculativeDecoding type draft ([#​1417](https://github.com/defilantech/LLMKube/issues/1417)) ([ccccd02](https://github.com/defilantech/LLMKube/commit/ccccd0203f0b0e3a76732f52aeb2b7bbf458a772)) - **controller:** publish model downloads atomically so an interrupted transfer is never cached ([#​1432](https://github.com/defilantech/LLMKube/issues/1432)) ([206b6c3](https://github.com/defilantech/LLMKube/commit/206b6c3c56d98b03377242ec86f000d9a9315803)) - **controller:** route s3:// model sources to the runtime-resolved path ([#​1450](https://github.com/defilantech/LLMKube/issues/1450)) ([f054960](https://github.com/defilantech/LLMKube/commit/f0549605b029783fb2095d205a990d69c0bd6a7c)) - **controller:** set TerminationMessagePolicy on generated init containers ([#​1460](https://github.com/defilantech/LLMKube/issues/1460)) ([bc732b3](https://github.com/defilantech/LLMKube/commit/bc732b3afd5ce931360efd1ce4d625ae61975643)) - **dashboard:** select the latency success series by le!="" so llmkube-slo error-budget panels render for any threshold ([#​1444](https://github.com/defilantech/LLMKube/issues/1444)) ([d381112](https://github.com/defilantech/LLMKube/commit/d381112c63930d92f305d7bd942b97205266d2be)) - **foreman:** add chart validation to the coder gate, and install helm so it can run ([#​1442](https://github.com/defilantech/LLMKube/issues/1442)) ([b26c6ae](https://github.com/defilantech/LLMKube/commit/b26c6ae11a26b9e5567524680621ef8e63714a24)) - **foreman:** detect assertion-value churn in the test-dilution gate ([#​1416](https://github.com/defilantech/LLMKube/issues/1416)) ([b53df14](https://github.com/defilantech/LLMKube/commit/b53df14d95652647c10b0f32e4b7425efb69435c)) - **foreman:** preserve the coder Job name's uniqueness suffix on truncation ([#​1412](https://github.com/defilantech/LLMKube/issues/1412)) ([929f0a8](https://github.com/defilantech/LLMKube/commit/929f0a8795e8ad3070b3717e130aea9d8a88e4a0)) - ground the PR body summary against the branch diff ([#​1448](https://github.com/defilantech/LLMKube/issues/1448)) ([6f24527](https://github.com/defilantech/LLMKube/commit/6f2452743f0f30168a3f00de8db25f63d36170e5)) - **metrics:** correct the AMD doc's metric contract and guard prose docs ([#​1420](https://github.com/defilantech/LLMKube/issues/1420)) ([36631a9](https://github.com/defilantech/LLMKube/commit/36631a914a412caa13bf9a7741028cfdc10c9f74)) - **runtime:** disable the llama.cpp prompt cache for embedding and rerank ([#​1413](https://github.com/defilantech/LLMKube/issues/1413)) ([407de59](https://github.com/defilantech/LLMKube/commit/407de59a8efa5cef8eb060d83ac5faab37bb4bcc)) ##### Documentation - **b200:** record GB10 partial-proxy reachability and why NVLink/MIG/sm\_100 stay gated ([#​1422](https://github.com/defilantech/LLMKube/issues/1422)) ([e6ab2e9](https://github.com/defilantech/LLMKube/commit/e6ab2e9d0d8220add604230ffb527ff7b1660a88)) - **chart:** dashboard datasources examples must use the datasource UID, not its display name ([#​1433](https://github.com/defilantech/LLMKube/issues/1433)) ([a57d499](https://github.com/defilantech/LLMKube/commit/a57d499fcbc3261feccb31148f6fb3796a751db0)) ### [`v0.9.14`](https://github.com/defilantech/LLMKube/blob/HEAD/CHANGELOG.md#0914-2026-08-05) [Compare Source](https://github.com/defilantech/LLMKube/compare/v0.9.13...v0.9.14) ##### Features - **api:** add mxfp4 quantization and correct Blackwell runtime reality ([#​1381](https://github.com/defilantech/LLMKube/issues/1381)) ([382af35](https://github.com/defilantech/LLMKube/commit/382af35ffee1d600b6bc05db0fb580607241a4d1)) - **controller:** opt-in Prometheus scrape annotations on inference pods ([#​1366](https://github.com/defilantech/LLMKube/issues/1366)) ([2e8f8a8](https://github.com/defilantech/LLMKube/commit/2e8f8a8c8c122db46b67ede960152f0d80ff8590)) - **dashboards:** add a llama.cpp runtime dashboard ([#​1371](https://github.com/defilantech/LLMKube/issues/1371)) ([5fedb88](https://github.com/defilantech/LLMKube/commit/5fedb88e6bbba1e7a4d827c13538a362debeb382)) - **dashboards:** add an operator-health row to llmkube-inference ([#​1369](https://github.com/defilantech/LLMKube/issues/1369)) ([ee5145b](https://github.com/defilantech/LLMKube/commit/ee5145bc6bb57b7fb2dc686d3fccd09fa15d8ed6)) - **dashboards:** SGLang queue-wait, stage latency, token mix and HiCache L3 panels ([#​1370](https://github.com/defilantech/LLMKube/issues/1370)) ([d1a57ca](https://github.com/defilantech/LLMKube/commit/d1a57cab65abbeea23dd841da768360e01128e05)) - **observability:** AMD GPU tier — amdgpu-exporter DaemonSet, metric contract, dashboard reconcile ([#​1354](https://github.com/defilantech/LLMKube/issues/1354)) ([a9e560f](https://github.com/defilantech/LLMKube/commit/a9e560f4fbd989cddf7dff1aa45184652150538e)) ##### Bug Fixes - **chart:** correct stale Blackwell platform floors (R570 is EOL) ([#​1380](https://github.com/defilantech/LLMKube/issues/1380)) ([445664e](https://github.com/defilantech/LLMKube/commit/445664e907bc8d5e7e0a0b8bb6646706c39f82c6)) - **chart:** make GPU alerts exporter-agnostic instead of DCGM-only ([#​1372](https://github.com/defilantech/LLMKube/issues/1372)) ([402a686](https://github.com/defilantech/LLMKube/commit/402a6865e3863294d0aa779d58a8a98ddb83e80c)) - **controller:** correct the speculative-decoding draft flag and dedupe --metrics ([#​1392](https://github.com/defilantech/LLMKube/issues/1392)) ([48d7d49](https://github.com/defilantech/LLMKube/commit/48d7d49a61c74a90b897eb273ab9aaebe21c2365)) - **controller:** skip model-cache PVC for pvc:// sources ([#​1363](https://github.com/defilantech/LLMKube/issues/1363)) ([9ec0bf9](https://github.com/defilantech/LLMKube/commit/9ec0bf972fcf6f8bf228e40a844ee95f8b996ddb)) - **foreman:** fail loudly when a revision's prior attempt cannot be restored ([#​1365](https://github.com/defilantech/LLMKube/issues/1365)) ([b9b7685](https://github.com/defilantech/LLMKube/commit/b9b76857e2ef281ad8a6387a74c5f42e2b7eaad1)) - **foreman:** run the coder gate's Go checks with GOTOOLCHAIN=auto ([#​1389](https://github.com/defilantech/LLMKube/issues/1389)) ([ce828dd](https://github.com/defilantech/LLMKube/commit/ce828dd6baeb2039dc15b2be8afebada48d3e285)) - **router:** apply external.model as modelNameOverride on backendRefs ([#​1398](https://github.com/defilantech/LLMKube/issues/1398)) ([847b14d](https://github.com/defilantech/LLMKube/commit/847b14d7da7c8fb4cd19aca68dea1af0db047918)) - **router:** compile external backends in the Gateway data plane ([#​1396](https://github.com/defilantech/LLMKube/issues/1396)) ([5045dd0](https://github.com/defilantech/LLMKube/commit/5045dd033b732544e1fdb4e83f443766fa6453f7)) - **router:** rewrite body.model for external backends via bodyMutation ([#​1401](https://github.com/defilantech/LLMKube/issues/1401)) ([2fc6992](https://github.com/defilantech/LLMKube/commit/2fc69923e7f4309958302fc76973e0064eb24d18)) - **router:** surface a gateway reconcile failure as a Warning Event ([#​1400](https://github.com/defilantech/LLMKube/issues/1400)) ([4145a67](https://github.com/defilantech/LLMKube/commit/4145a678e76653555de5b4bc749fcecbb94c4af4)) - **router:** use the non-deprecated events API for the gateway recorder ([#​1409](https://github.com/defilantech/LLMKube/issues/1409)) ([435dd72](https://github.com/defilantech/LLMKube/commit/435dd7218f6b48b11ae083449e3bf29e4e92c193)) - skip GitHub auth and repo clone for freeform tasks without a repo ([#​1350](https://github.com/defilantech/LLMKube/issues/1350)) ([c1d0cc1](https://github.com/defilantech/LLMKube/commit/c1d0cc1611c87ee040453e32cf13a6cce800577c)) - stop wasted-turn context ballooning on max\_tokens truncation ([#​1352](https://github.com/defilantech/LLMKube/issues/1352)) ([eaac3ef](https://github.com/defilantech/LLMKube/commit/eaac3efbe1a8b1b290f7c828cdf8776ebcdf128d)) - **test:** make t.Fatal terminality explicit for staticcheck SA5011 ([#​1410](https://github.com/defilantech/LLMKube/issues/1410)) ([7cf58c7](https://github.com/defilantech/LLMKube/commit/7cf58c781188d58465caa6d12bc0b487a396127b)) ##### Reverts - remove the inert model-rewrite paths for external backends ([#​1402](https://github.com/defilantech/LLMKube/issues/1402)) ([422b9ef](https://github.com/defilantech/LLMKube/commit/422b9ef6f679e4bbdb3ab5abefbaeefec14f18ee)) ##### Documentation - add observability maintainer ([#​1407](https://github.com/defilantech/LLMKube/issues/1407)) ([3fb54e2](https://github.com/defilantech/LLMKube/commit/3fb54e296040de8f323e0a91a83b61be9933d3c1)) - fix autoscaling guide to use a metric llama.cpp actually exports ([#​1386](https://github.com/defilantech/LLMKube/issues/1386)) ([bc3fca2](https://github.com/defilantech/LLMKube/commit/bc3fca237ff938d91d0b6bf046f43838d2ebe29d)) ### [`v0.9.13`](https://github.com/defilantech/LLMKube/blob/HEAD/CHANGELOG.md#0913-2026-07-29) [Compare Source](https://github.com/defilantech/LLMKube/compare/v0.9.12...v0.9.13) ##### Features - **chart:** template Grafana dashboards, publishing runtime ones only while their runtime serves ([#​1267](https://github.com/defilantech/LLMKube/issues/1267)) ([c2d56b7](https://github.com/defilantech/LLMKube/commit/c2d56b7d31746726e5dc79e2f4ce5f94b6452560)) - **foreman:** test-dilution advisory for the coder gate ([#​1332](https://github.com/defilantech/LLMKube/issues/1332)) ([#​1337](https://github.com/defilantech/LLMKube/issues/1337)) ([43a30fc](https://github.com/defilantech/LLMKube/commit/43a30fc68f7d1729c131ae4e7e4ba8cbb662dd1b)) ##### Bug Fixes - **controller:** append TGI extraArgs once, not four times ([#​1306](https://github.com/defilantech/LLMKube/issues/1306)) ([6d675f2](https://github.com/defilantech/LLMKube/commit/6d675f23f758da6eb6168e1786b5ff07598cbdac)) - **controller:** Available goes False when no replicas are ready ([#​1304](https://github.com/defilantech/LLMKube/issues/1304)) ([f3bd243](https://github.com/defilantech/LLMKube/commit/f3bd2435f3d43e84ad7cb455df04ee6f89000038)) - **controller:** charge GPUQuota by the resolved GPU count, closing the Model-declared-count bypass ([#​1324](https://github.com/defilantech/LLMKube/issues/1324)) ([e052229](https://github.com/defilantech/LLMKube/commit/e0522294a8ec499ca10d49f4bb89bebb74ab69fa)) - **controller:** cpu-offload verify advisory, parallelism validation, and a sample that actually runs ([#​1321](https://github.com/defilantech/LLMKube/issues/1321)) ([9740dad](https://github.com/defilantech/LLMKube/commit/9740dade9e6f5fcaf790ec5c8349f6452ffba260)) - **controller:** gate HPA scale-up by GPUQuota via maxReplicas accounting ([#​1311](https://github.com/defilantech/LLMKube/issues/1311)) ([#​1334](https://github.com/defilantech/LLMKube/issues/1334)) ([dcefc45](https://github.com/defilantech/LLMKube/commit/dcefc450049812531e8203334a3dd8939902f25c)) - **controller:** recognise huggingface.co URL sources as HF repos, not single-file downloads ([#​1322](https://github.com/defilantech/LLMKube/issues/1322)) ([#​1325](https://github.com/defilantech/LLMKube/issues/1325)) ([36fc79f](https://github.com/defilantech/LLMKube/commit/36fc79f14e40cb9671d2ae8e71cd3012f6c3ffd8)) - **controller:** revalidate model cache via HEAD + Content-Length, atomic download ([#​1309](https://github.com/defilantech/LLMKube/issues/1309)) ([#​1326](https://github.com/defilantech/LLMKube/issues/1326)) ([3e86988](https://github.com/defilantech/LLMKube/commit/3e86988d951e825e25d73343c0e4c2f9e16b499a)) - **foreman:** accept multi-segment repo slugs (GitLab subgroups, nested Forgejo orgs) ([#​1299](https://github.com/defilantech/LLMKube/issues/1299)) ([#​1341](https://github.com/defilantech/LLMKube/issues/1341)) ([1b7c47a](https://github.com/defilantech/LLMKube/commit/1b7c47ae63828bea4ab93038dcf65785c2a1a346)) - **foreman:** auto-apply gofmt in the coder gate instead of failing the coder ([#​1327](https://github.com/defilantech/LLMKube/issues/1327)) ([#​1333](https://github.com/defilantech/LLMKube/issues/1333)) ([954c67b](https://github.com/defilantech/LLMKube/commit/954c67bd56764436727036e00446fe4969b0e8ec)) - **foreman:** do not downgrade a mixed footprint whose classes are all self-GO ([#​1342](https://github.com/defilantech/LLMKube/issues/1342)) ([#​1344](https://github.com/defilantech/LLMKube/issues/1344)) ([d7c6569](https://github.com/defilantech/LLMKube/commit/d7c656968064c5c9c3c6390c720f9e60a746a073)) - **foreman:** make coder self-gate diff-aware, skip Go tier on non-Go diffs ([#​1292](https://github.com/defilantech/LLMKube/issues/1292)) ([#​1336](https://github.com/defilantech/LLMKube/issues/1336)) ([9f4acef](https://github.com/defilantech/LLMKube/commit/9f4acef6a39742894f0ba434d48c3e116b02bc50)) - **foreman:** ParseRepo delegates to the shared codehost slug validator ([#​1343](https://github.com/defilantech/LLMKube/issues/1343)) ([#​1345](https://github.com/defilantech/LLMKube/issues/1345)) ([ae2dfc2](https://github.com/defilantech/LLMKube/commit/ae2dfc2ed7f2d130a12d9e6364f5e7ed03f70f11)) - **foreman:** record IsError on MCP transport failures ([#​1330](https://github.com/defilantech/LLMKube/issues/1330)) ([#​1335](https://github.com/defilantech/LLMKube/issues/1335)) ([c42f873](https://github.com/defilantech/LLMKube/commit/c42f87316e667c80753401089ad20a00f1150214)) - **foreman:** split git committer identity from author for human DCO sign-off ([#​1323](https://github.com/defilantech/LLMKube/issues/1323)) ([44ef09f](https://github.com/defilantech/LLMKube/commit/44ef09fddeaa5d89200ad145f4d2c592dcdb2f10)) - **foreman:** test-presence accepts behavioral coverage of unexported helpers ([#​1329](https://github.com/defilantech/LLMKube/issues/1329)) ([#​1340](https://github.com/defilantech/LLMKube/issues/1340)) ([f1aea17](https://github.com/defilantech/LLMKube/commit/f1aea178e3d05487f4dee5e42202b8ce555cb448)) ##### Documentation - **api:** correct MemoryLimitGiB doc, it is quota-accounting only with no runtime enforcement ([#​1312](https://github.com/defilantech/LLMKube/issues/1312)) ([#​1339](https://github.com/defilantech/LLMKube/issues/1339)) ([90e6ca3](https://github.com/defilantech/LLMKube/commit/90e6ca38228f89e6818db8bb0b5312409ed8637a)) - **api:** stop the GPU-memory fields implying enforcement that does not exist…
What
Bounds a ModelPool swap by the pool's
swapBudgetand stops a stale deactivate from undoing an activation issued after it, in the router-proxy activator.Why
Fixes #1837
The activator could leave a pool dark until the proxy was restarted. When the last waiter for a member gave up, the deferred cleanup fired an asynchronous
Deactivateoutside the lock; a request for the same member arriving in that window started a swap and scaled the member up, and the staleDeactivatethen scaled it back to zero.Activateis idempotent-by-check and never re-issued, so the swap goroutine waited on a member that could never become Ready. That goroutine had no deadline either: its only exit was the cancel fired when the last waiter for the target left, so a client retrying on 503 kept the doomed swap alive indefinitely.swappingstayed true, the resident member's fast path stayed closed, and every request on the pool burned its hold budget and 503ed, including requests for the member that was still loaded.How
The deferred deactivate stays asynchronous but now re-takes the lock and re-checks before patching, skipping itself when the member is wanted again: a waiter has arrived, it became resident, or a swap newer than the generation the deactivate was scheduled against is activating it. A per-pool swap generation was added for that check, and it also stops a cancelled swap's goroutine from clearing the state of a newer swap that started while it was unwinding, which was the same class of bug one level up. The swap itself now runs under a deadline: the pool's
swapBudget, since that is already the operator's statement of how long a cold load may take, falling back to twice the router's response-header timeout when a pool declares none so the bound is never tighter than a single caller's hold. On expiry the swap is abandoned - the target is scaled back down while the lock is still held, so a fresh swap for the same member cannot have itsActivateundone, a swap error is published to the waiters, the resident's fast path reopens, and the event is logged at ERROR asmodel pool swap abandonedand counted in a newllmkube_modelpool_swap_failures_total{router,pool,member,reason}counter. Cancelled swaps keep their existing non-error behaviour and theIfIdleand coalescing contracts are untouched.Testing
The wedge was reproduced live on router-proxy 0.9.27: the pool 503ed for roughly 40 minutes at exactly 2x the swapBudget latency with the target sitting at replicas 0, and it cleared only when the proxy was restarted. The fix is verified by two new unit tests over the existing fake MemberController - one drives a new activation into the exact window the deferred deactivate used to lose and asserts the member is left at one replica and the second waiter is served, the other asserts a swap whose target never becomes Ready is abandoned at the deadline with a non-hold-budget error,
swappingcleared, the target deactivated and the resident's fast path immediately open again. Both fail on the unfixed code.make test,make lintandmake lint-allall pass locally. This has not yet been deployed in-cluster.Assisted-by: Claude Code (generated the implementation, tests and docs from my design; I reviewed the diff and ran make test, make lint and make lint-all locally)
Checklist
make testpasses locallymake lintpasses locallygit commit -s) per DCO