Repository navigation
feat(router): poolActivation IfIdle serves the warm member when the incumbent is busy - #1787
Conversation
…ncumbent is busy A ModelPool holds a cross-model request until the incumbent drains, bounded only by the pool-wide swapBudget. That is right for a caller that accepts one model, and wrong for a caller that merely prefers one: it queues for minutes behind someone else's work when the other member is warm and could serve it now. Client-side timeouts cannot fix this because they cannot tell a busy incumbent from a swap already in flight. Add spec.rules[].route.poolActivation (Wait, the default, or IfIdle). Under IfIdle the activator starts a swap only when the incumbent is idle; a busy incumbent makes Acquire return ErrIncumbentBusy at once so the dispatch loop falls through to the next backend in the rule. A swap already in flight is still waited on in both modes. Skips are counted in llmkube_modelpool_busy_skips_total. Signed-off-by: Jory Irving <46251616+joryirving@users.noreply.github.com>
The AcquireWithMode / ErrIncumbentBusy implementation was reverted locally while proving the new tests fail without it, and the first commit went up without the file. This restores it; the proxy, tests and docs already reference it. Signed-off-by: Jory Irving <46251616+joryirving@users.noreply.github.com>
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
Defilan
left a comment
There was a problem hiding this comment.
Approving, I traced the contract end to end and tried to break it and could not. The IfIdle skip sits inside the no-swap-running branch, so an in-flight swap is still waited on in both modes, and the skip path unlocks cleanly with the deferred waiter cleanup doing its thing. Both behavioural tests bite: I reverted the IfIdle branch and they failed exactly as your body claims (hold budget exceeded instead of ErrIncumbentBusy, and a 5s hold instead of instant fallback), and reverting the translateRule copy failed the passthrough test too. A probe with an unknown mode string held like Wait, so the mode check is exact and fail-safe. make manifests and make chart-crds produced no drift on your head, and the full router/controller/metrics suite is green here.
Two things worth a look, neither blocking. When every backend in a rule skips, the client gets 502 "all backends failed: model pool incumbent busy", while the sibling ErrHoldBudgetExceeded gets 503 with Retry-After and a pool_activation_timeout audit reason. It is the same transient condition and a retry after the incumbent drains does serve, so I would give it the same treatment or at least its own audit reason. Also, issue #1786's body describes a different ask entirely, resources.memory emitted as limits and a suggested resources.memoryLimit field, under this title, filed that way with no edits. Merging this closes the issue with the memory ask unaddressed, so worth fixing the issue body or refiling the memory part first.
Metric is registered, the docs caveat about proxy-tracked traffic is right, and the disclosure checks out. Thanks, nice work.
…25 ➔ 0.9.27) (#2111) This PR contains the following updates: | Package | Update | Change | |---|---|---| | [ghcr.io/defilantech/charts/llmkube](https://github.com/defilantech/LLMKube) | patch | `0.9.25` → `0.9.27` | --- >⚠️ **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.27`](https://github.com/defilantech/LLMKube/blob/HEAD/CHANGELOG.md#0927-2026-09-14) [Compare Source](defilantech/LLMKube@v0.9.26...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)) ### [`v0.9.26`](https://github.com/defilantech/LLMKube/blob/HEAD/CHANGELOG.md#0926-2026-09-14) [Compare Source](defilantech/LLMKube@v0.9.25...v0.9.26) ##### Features - **controller:** metric-gated idle probe for the generic runtime ([#​1802](defilantech/LLMKube#1802)) ([750be58](defilantech/LLMKube@750be58)) - **controller:** ModelPool reclaim policy returns the slot to spec.default after idle ([#​1796](defilantech/LLMKube#1796)) ([9fd13cd](defilantech/LLMKube@9fd13cd)) - **foreman:** expose node label on FleetNode metrics for fleet joins ([#​1785](defilantech/LLMKube#1785)) ([5db0f7c](defilantech/LLMKube@5db0f7c)) - **foreman:** serve Agents from Anthropic-native endpoints ([#​1811](defilantech/LLMKube#1811)) ([a2e2b2e](defilantech/LLMKube@a2e2b2e)) - **inferenceservice:** add resources.memoryLimit to decouple ceiling from reservation ([#​1764](defilantech/LLMKube#1764)) ([53e5090](defilantech/LLMKube@53e5090)) - **model:** resume interrupted single-file downloads via a content-keyed partial ([#​1765](defilantech/LLMKube#1765)) ([#​1807](defilantech/LLMKube#1807)) ([e3384f4](defilantech/LLMKube@e3384f4)) - **router:** mount /v1/embeddings and /v1/rerank on the proxy ([#​1819](defilantech/LLMKube#1819)) ([3af89e9](defilantech/LLMKube@3af89e9)) - **router:** opt-in endpoint-level backends for per-request balancing ([#​1820](defilantech/LLMKube#1820)) ([d9349e2](defilantech/LLMKube@d9349e2)) - **router:** poolActivation IfIdle serves the warm member when the incumbent is busy ([#​1787](defilantech/LLMKube#1787)) ([d211a53](defilantech/LLMKube@d211a53)) - **samples:** three-Spark ring DeepSeek-V4.1-Flash EXL3 TP3 samples and the multi-node guide section ([#​1816](defilantech/LLMKube#1816)) ([6cb8389](defilantech/LLMKube@6cb8389)) ##### Bug Fixes - **agent:** resolve hf:// model sources on the metal path ([#​1759](defilantech/LLMKube#1759)) ([#​1789](defilantech/LLMKube#1789)) ([0d4879c](defilantech/LLMKube@0d4879c)) - **controller:** hold a multiNode group while a member is staging ([#​1757](defilantech/LLMKube#1757)) ([#​1806](defilantech/LLMKube#1806)) ([116ba95](defilantech/LLMKube@116ba95)) - **controller:** probe multiNode worker rendezvous, fix readyMembers ([#​1781](defilantech/LLMKube#1781)) ([#​1782](defilantech/LLMKube#1782)) ([97acb8e](defilantech/LLMKube@97acb8e)) - **controller:** re-resolve a Model when spec.source changes ([#​1767](defilantech/LLMKube#1767)) ([#​1805](defilantech/LLMKube#1805)) ([9149419](defilantech/LLMKube@9149419)) - **foreman-chart:** name the FleetNode in the stale-heartbeat alert ([#​1779](defilantech/LLMKube#1779)) ([#​1783](defilantech/LLMKube#1783)) ([d4138d2](defilantech/LLMKube@d4138d2)) - **foreman:** anchor coder rail diffs to the resolved upstream base SHA ([#​1803](defilantech/LLMKube#1803)) ([08ce692](defilantech/LLMKube@08ce692)) - **foreman:** clear a FleetNode reservation whose AgenticTask was deleted ([#​1791](defilantech/LLMKube#1791)) ([#​1804](defilantech/LLMKube#1804)) ([0cc53c4](defilantech/LLMKube@0cc53c4)) - **foreman:** drain tasks before agent exit ([#​1799](defilantech/LLMKube#1799)) ([9b22e73](defilantech/LLMKube@9b22e73)) - **foreman:** omit issue references from the reviewer prompt when the payload carries none ([#​1761](defilantech/LLMKube#1761)) ([#​1808](defilantech/LLMKube#1808)) ([36e0e0b](defilantech/LLMKube@36e0e0b)) - **foreman:** reap orphaned in-cluster FleetNodes when agent pods disappear ([#​1778](defilantech/LLMKube#1778)) ([#​1792](defilantech/LLMKube#1792)) ([9fbee34](defilantech/LLMKube@9fbee34)) - **foreman:** reject unverified reviewer GO ([#​1801](defilantech/LLMKube#1801)) ([27910ed](defilantech/LLMKube@27910ed)) - **foreman:** tell a spin from a real max-turns burn ([#​1814](defilantech/LLMKube#1814)) ([3e93fe4](defilantech/LLMKube@3e93fe4)) - **foreman:** use the coder's PR description when the PR opens on review GO ([#​1768](defilantech/LLMKube#1768)) ([#​1776](defilantech/LLMKube#1776)) ([bff8344](defilantech/LLMKube@bff8344)) - **grafana:** separate decode throughput axis ([#​1815](defilantech/LLMKube#1815)) ([bf77989](defilantech/LLMKube@bf77989)) - **model:** re-resolve a Model whose spec changed when no cache key exists ([#​1818](defilantech/LLMKube#1818)) ([81be593](defilantech/LLMKube@81be593)) - **rollout:** do not defer a scale-from-zero rollout as PodsBusy ([#​1794](defilantech/LLMKube#1794)) ([062332f](defilantech/LLMKube@062332f)) - **router:** return 503 + Retry-After when every IfIdle backend skips busy ([#​1797](defilantech/LLMKube#1797)) ([396177d](defilantech/LLMKube@396177d)) ##### Documentation - **labs:** reference build for GLM-5.3-Flash EXL3 on two DGX Sparks ([#​1784](defilantech/LLMKube#1784)) ([cbdbb25](defilantech/LLMKube@cbdbb25)) </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/2111
…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
Adds
spec.rules[].route.poolActivation: Wait | IfIdletoModelRouter. UnderIfIdle, a rule whose preferred backend is a non-residentModelPoolmember skips that backend immediately when the incumbent is busy and falls through to the next backend in the rule, instead of holding the request until the incumbent drains.Waitis the default and preserves today's behaviour exactly.Why
A pool holds a cross-model request until the incumbent is idle, bounded only by the pool-wide
swapBudget. That is the right contract for a caller that accepts one model and the wrong one for a caller that merely prefers one: on a single 24 GB card shared by a small assistant model and a large coder, the assistant waits minutes behind a batch job while the warm coder could serve it now. Client-side fallback cannot solve it because a timeout cannot distinguish "incumbent busy" from "swap already in flight", so it abandons real swaps and lands on a member that is mid-unload.Fixes #1786
How
RuleRoute.PoolActivationon the CRD (enumWait;IfIdle, defaultWait), mirrored on the wireRuleRoute, validated inConfig.Validate, threaded throughMatchResultand copied bytranslateRule.Activator.AcquireWithMode: in the!swapping && resident != memberbranch, a busy incumbent underIfIdlereturns a newErrIncumbentBusyinstead of blocking;Acquiredelegates withWait. The existing deferred cleanup handles the waiter count. A swap already in flight is waited on in both modes, since the incumbent is unloading and cannot serve either way.dispatchWithFallbackpasses the matched rule's mode; the existingcontinueon activation error does the fallthrough.llmkube_modelpool_busy_skips_total{router,pool,member}.docs/operations/gpu-sharing.md, including the caveat that "busy" means proxy-tracked traffic (direct-to-Service traffic is invisible to the check; the controller's/slotsdrain still protects it at swap time).Tests: activator unit tests for the skip and for the in-flight-swap exception, a proxy end-to-end test (rule
[coder, judge], judge resident and busy, request served by judge with coder never activated), thetranslateRulepassthrough, and closed-enum validation. Both behavioural tests fail with theIfIdlebranch disabled and pass with it.Assisted-by: Claude Code (Fable 5.1) generated the implementation, tests and docs from my design; I reviewed the diff, and ran
make test,make lintandmake lint-alllocally (all green, router coverage 93.7%).Checklist
make testpasses locallymake lintpasses locallygit commit -s) per DCO