Skip to content

fix(foreman): use the coder's PR description when the PR opens on review GO (#1768) - #1776

Merged
Defilan merged 2 commits into
defilantech:mainfrom
Defilan:foreman/wl-1768-coder-prbody/issue-1768
Sep 8, 2026
Merged

Defilan merged 2 commits into
defilantech:mainfrom
Defilan:foreman/wl-1768-coder-prbody/issue-1768

Conversation

@Defilan

@Defilan Defilan commented Sep 8, 2026 •

Copy link
Copy Markdown
Member

What

maybeOpenPullRequest now resolves the coder's PR description before opening the Workload's PR on a reviewer GO, and a new githubpr.DescriptionBody renderer posts that description as-is instead of scaffolding it on top of the target repository's raw PR template.

  • coderPRBody(ctx, task) finds the code task for the same branch: same foreman.llmkube.dev/workload label, Spec.Kind == issue-fix, Spec.Payload.Branch equal to the review task's, newest CreationTimestamp on a tie; decodes Status.Result.Raw through the extra.modelExtra envelope and returns a non-empty prBody.
  • Body precedence at the open seam: coder prBody → reviewer prBody → the diff-grounded reviewer summary (today's path). The record gains extra.prBodySource (coder / reviewer / summary).
  • DescriptionBody(desc, issue, workload): trimmed description, Fixes #<issue> appended ONLY when the description does not already contain #<issue>, always ending with the _Opened by foreman on review GO (workload %s)._ line. No template prepended.
  • PRBody is byte-for-byte unchanged and still renders the summary fallback with the repo template ([FEATURE] Foreman-opened PRs should honour the target repository's PR template #1541). groundPRSummary and maybeRefreshPRBody are untouched.

Why

Fixes #1768. The PR opened on review GO was built from the reviewer's result, so the coder's complete description sat unread in status.result.extra.modelExtra.prBody and every Foreman PR shipped the unfilled template with unchecked boxes — out of compliance with the CONTRIBUTING.md AI-disclosure policy — plus a Fixes # that would auto-close issues the coder deliberately referenced with Refs #N. The coder is the only stage that knows what the change does and the only stage prompted to write a PR description, so its prose must win.

How

maybeOpenPullRequest calls coderPRBody before openPullRequest. The winning body travels as the summaryBody argument plus, for the coder, a COPY of r.Extra carrying it under prBody — r.Extra is persisted as the review task's record, so writing the coder's body into it would claim the reviewer authored it. The lookup is best-effort and silent by design: a nil e.Client, a list error, an empty workload label, no matching code task, a nil Result or malformed JSON all yield "" and keep today's grounded-summary behaviour.

In openPullRequest the renderer now depends on the body's provenance: a prBody from either author goes through DescriptionBody; the summary fallback still goes through PRBody(FindTemplate(workspace), …).

Tests: five new cases in executor_pr_test.go (coder body wins; sibling-branch coder task does not; nil client degrades; reviewer prBody still wins with no code task; newest coder task wins a fix-cycle tie; a workspace holding .github/pull_request_template.md contributes no template text to a prBody body) and TestDescriptionBody / TestDescriptionBody_NeverCarriesTemplateText in template_test.go. The existing PRBody and TestOpenPullRequest_PrBodyPreferred expectations are unchanged; TestMaybeOpenPullRequest_BodyCarriesReviewSummary gained a prBodySource == "summary" assertion. Mutation-checked: forcing coderPRBody to return "" fails TestMaybeOpenPullRequest_CoderPRBodyPreferred ("body must be the coder's description…", "prBodySource = summary, want "coder"").

Checklist

  • Tests added/updated
  • make test passes locally — run for the touched packages (go test ./pkg/foreman/agent/... ./pkg/foreman/agent/githubpr/ -count=1, all ok) plus go build ./...; the full envtest suite runs in the clean-room gate
  • make lint passes locally — gofmt clean, go vet clean, and bin/golangci-lint run reports 0 issues on both touched packages after the over-long-line fix
  • Commit messages follow conventional commits
  • All commits are signed off (git commit -s) per DCO
  • AI assistance (if any) is disclosed above, per CONTRIBUTING.md — this PR was produced by Foreman's coder agent under operator supervision; a human is accountable for it
  • Documentation updated (if user-facing change) — no doc change: this fix restores the documented intent (the coder's prBody is the PR description), and no file under docs/ describes the PR-body composition path

Revisions

  • r1 (wl-1768-revise-r1, 32 turns, same coder): findings from the adversarial review. The issue-reference check in DescriptionBody was a bare substring match (#1768 satisfied issue 176, #17680 satisfied 1768). It is now digit-bounded, with three table cases, and two tests cover the coder-task fallbacks (no prBody key, malformed result). The rebase revision rewrote the branch into a single commit, so the commit message is r1's; this PR's title carries the change's subject.
  • bad2378f (test-only, human commit): drops the unparam-flagged parameter from the codeTaskOnBranch helper so make lint passes. The r1 gate failed on exactly that finding and nothing else.

Provenance

Assisted-by: Foreman coder agent (qwen38fn-coder, Qwen3.8-Flash-Next NVFP4 on two DGX Sparks, workload wl-1768-coder-prbody, 92 turns) for the change and the description above; the r1 revision applied the human review's findings. Adversarial review, three hand mutations (each caught), the local make test gate on the first commit, the boundary probes, and the lint commit were done by Chris with Claude Code (session https://claude.ai/code/session_01XzCYKzbnCnoYWZmdVHmwqg). A human is accountable for every commit. The full make test envtest suite passed locally on the final head bad2378f (38 packages ok), and make lint is clean on it.

This body was replaced by hand after the PR opened: the operator serving this repository still runs the pre-fix code, so the body it generated was the very defect #1768 describes (raw template, unchecked boxes, unfilled Fixes #).

@codecov

codecov Bot commented Sep 8, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 91.42857% with 6 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
pkg/foreman/agent/executor_native.go 89.83% 3 Missing and 3 partials ⚠️

📢 Thoughts on this report? Let us know!

…cover the prBody-less coder path (defilantech#1768)

FINDING 1 (defect): DescriptionBody decided whether to append
"Fixes #<N>" with a bare substring match, so a body citing a sibling
issue silently suppressed the real link: "defilantech#1768" suppressed
"Fixes defilantech#176" for issue 176 and "#17680" suppressed "Fixes defilantech#1768" for
issue 1768, leaving those PRs unable to auto-close their issue. The
check now builds one digit-bounded regexp per call,
#`%d`(\D|$), so only a reference to this issue counts; the Fixes line
and the provenance line are byte-identical to before and PRBody is
untouched. The doc comment records that the match is bounded.

FINDING 2 (coverage): the fall-through guards in the coder lookup ran
in no test. codeTaskForPR already omits the prBody key for an empty
prBody but nothing called it that way, so a coder task with no prBody
and a coder task whose Status.Result is malformed JSON were both
untested. Two tests next to the branch-mismatch case drive both paths
through maybeOpenPullRequest and pin the grounded-summary fallback,
prBodySource=summary and the absence of a panic.

FINDING 3 (cosmetic): TestMaybeOpenPullRequest_CoderPRBodyPreferred's
doc comment was two paragraphs that both began with the test name; they
are merged into one that keeps both points - the coder's prBody wins,
and the body carries exactly one issue link.

Refs defilantech#1768

Signed-off-by: Foreman Bot <chris@mahercode.io>
@Defilan
Defilan force-pushed the foreman/wl-1768-coder-prbody/issue-1768 branch from 4c5f49f to 3beb580 Compare September 8, 2026 05:32
…nBranch (defilantech#1768)

The r1 revision added two callers of the codeTaskOnBranch test helper and
every caller now passes the same task name, so golangci-lint's unparam
check fails `make lint` on the branch ("name always receives
\"wl-x-code-1\""). Hardcode the single-branch task's name inside the
helper; the newest-task test that needs a second name already calls
codeTaskForPR directly.

No behaviour change; test-only.

Refs defilantech#1768

Signed-off-by: Christopher Maher <chris@mahercode.io>

@joryirving joryirving left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is clean and I'd merge it. The precedence is right in both seams and prBodySource reports it accurately in all three branches, the copy-not-mutate of the reviewer's extra is the correct call and the comment says why, and the digit-bounded reference regex holds up on every boundary I threw at it including the Refs #7 multi-slice case. Verified r.Extra is non-nil via modelDecidedResult so the new prBodySource write can't panic.

One optional thing: the newest-coder-task pick at executor_native.go:2237 has no tiebreaker for equal CreationTimestamp, so two issue-fix tasks on the same branch in the same second would resolve by list order. It can't happen in the real revision flow, so it's just hardening — a Name tiebreaker would close it.

Tests are thorough and green locally: built the touched packages, go vet clean, and ran the DescriptionBody and PR suites.

@Defilan
Defilan merged commit bff8344 into defilantech:main Sep 8, 2026
25 checks passed
@github-actions github-actions Bot mentioned this pull request Sep 8, 2026
eleboucher pushed a commit to eleboucher/homelab that referenced this pull request Sep 15, 2026
…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 ([#&#8203;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 ([#&#8203;1802](defilantech/LLMKube#1802)) ([750be58](defilantech/LLMKube@750be58))
- **controller:** ModelPool reclaim policy returns the slot to spec.default after idle ([#&#8203;1796](defilantech/LLMKube#1796)) ([9fd13cd](defilantech/LLMKube@9fd13cd))
- **foreman:** expose node label on FleetNode metrics for fleet joins ([#&#8203;1785](defilantech/LLMKube#1785)) ([5db0f7c](defilantech/LLMKube@5db0f7c))
- **foreman:** serve Agents from Anthropic-native endpoints ([#&#8203;1811](defilantech/LLMKube#1811)) ([a2e2b2e](defilantech/LLMKube@a2e2b2e))
- **inferenceservice:** add resources.memoryLimit to decouple ceiling from reservation ([#&#8203;1764](defilantech/LLMKube#1764)) ([53e5090](defilantech/LLMKube@53e5090))
- **model:** resume interrupted single-file downloads via a content-keyed partial ([#&#8203;1765](defilantech/LLMKube#1765)) ([#&#8203;1807](defilantech/LLMKube#1807)) ([e3384f4](defilantech/LLMKube@e3384f4))
- **router:** mount /v1/embeddings and /v1/rerank on the proxy ([#&#8203;1819](defilantech/LLMKube#1819)) ([3af89e9](defilantech/LLMKube@3af89e9))
- **router:** opt-in endpoint-level backends for per-request balancing ([#&#8203;1820](defilantech/LLMKube#1820)) ([d9349e2](defilantech/LLMKube@d9349e2))
- **router:** poolActivation IfIdle serves the warm member when the incumbent is busy ([#&#8203;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 ([#&#8203;1816](defilantech/LLMKube#1816)) ([6cb8389](defilantech/LLMKube@6cb8389))

##### Bug Fixes

- **agent:** resolve hf:// model sources on the metal path ([#&#8203;1759](defilantech/LLMKube#1759)) ([#&#8203;1789](defilantech/LLMKube#1789)) ([0d4879c](defilantech/LLMKube@0d4879c))
- **controller:** hold a multiNode group while a member is staging ([#&#8203;1757](defilantech/LLMKube#1757)) ([#&#8203;1806](defilantech/LLMKube#1806)) ([116ba95](defilantech/LLMKube@116ba95))
- **controller:** probe multiNode worker rendezvous, fix readyMembers ([#&#8203;1781](defilantech/LLMKube#1781)) ([#&#8203;1782](defilantech/LLMKube#1782)) ([97acb8e](defilantech/LLMKube@97acb8e))
- **controller:** re-resolve a Model when spec.source changes ([#&#8203;1767](defilantech/LLMKube#1767)) ([#&#8203;1805](defilantech/LLMKube#1805)) ([9149419](defilantech/LLMKube@9149419))
- **foreman-chart:** name the FleetNode in the stale-heartbeat alert ([#&#8203;1779](defilantech/LLMKube#1779)) ([#&#8203;1783](defilantech/LLMKube#1783)) ([d4138d2](defilantech/LLMKube@d4138d2))
- **foreman:** anchor coder rail diffs to the resolved upstream base SHA ([#&#8203;1803](defilantech/LLMKube#1803)) ([08ce692](defilantech/LLMKube@08ce692))
- **foreman:** clear a FleetNode reservation whose AgenticTask was deleted ([#&#8203;1791](defilantech/LLMKube#1791)) ([#&#8203;1804](defilantech/LLMKube#1804)) ([0cc53c4](defilantech/LLMKube@0cc53c4))
- **foreman:** drain tasks before agent exit ([#&#8203;1799](defilantech/LLMKube#1799)) ([9b22e73](defilantech/LLMKube@9b22e73))
- **foreman:** omit issue references from the reviewer prompt when the payload carries none ([#&#8203;1761](defilantech/LLMKube#1761)) ([#&#8203;1808](defilantech/LLMKube#1808)) ([36e0e0b](defilantech/LLMKube@36e0e0b))
- **foreman:** reap orphaned in-cluster FleetNodes when agent pods disappear ([#&#8203;1778](defilantech/LLMKube#1778)) ([#&#8203;1792](defilantech/LLMKube#1792)) ([9fbee34](defilantech/LLMKube@9fbee34))
- **foreman:** reject unverified reviewer GO ([#&#8203;1801](defilantech/LLMKube#1801)) ([27910ed](defilantech/LLMKube@27910ed))
- **foreman:** tell a spin from a real max-turns burn ([#&#8203;1814](defilantech/LLMKube#1814)) ([3e93fe4](defilantech/LLMKube@3e93fe4))
- **foreman:** use the coder's PR description when the PR opens on review GO ([#&#8203;1768](defilantech/LLMKube#1768)) ([#&#8203;1776](defilantech/LLMKube#1776)) ([bff8344](defilantech/LLMKube@bff8344))
- **grafana:** separate decode throughput axis ([#&#8203;1815](defilantech/LLMKube#1815)) ([bf77989](defilantech/LLMKube@bf77989))
- **model:** re-resolve a Model whose spec changed when no cache key exists ([#&#8203;1818](defilantech/LLMKube#1818)) ([81be593](defilantech/LLMKube@81be593))
- **rollout:** do not defer a scale-from-zero rollout as PodsBusy ([#&#8203;1794](defilantech/LLMKube#1794)) ([062332f](defilantech/LLMKube@062332f))
- **router:** return 503 + Retry-After when every IfIdle backend skips busy ([#&#8203;1797](defilantech/LLMKube#1797)) ([396177d](defilantech/LLMKube@396177d))

##### Documentation

- **labs:** reference build for GLM-5.3-Flash EXL3 on two DGX Sparks ([#&#8203;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
hbjydev pushed a commit to hbjydev/phoebe that referenced this pull request Sep 20, 2026
…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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;1785](https://github.com/defilantech/LLMKube/issues/1785)) ([5db0f7c](https://github.com/defilantech/LLMKube/commit/5db0f7c2e0a4309aaa15372c6c71e8c61a99e3dd))
- **foreman:** serve Agents from Anthropic-native endpoints ([#&#8203;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 ([#&#8203;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 ([#&#8203;1765](https://github.com/defilantech/LLMKube/issues/1765)) ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;1759](https://github.com/defilantech/LLMKube/issues/1759)) ([#&#8203;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 ([#&#8203;1757](https://github.com/defilantech/LLMKube/issues/1757)) ([#&#8203;1806](https://github.com/defilantech/LLMKube/issues/1806)) ([116ba95](https://github.com/defilantech/LLMKube/commit/116ba95cb293b6681f1532a7b7f615b95fbd1dc3))
- **controller:** probe multiNode worker rendezvous, fix readyMembers ([#&#8203;1781](https://github.com/defilantech/LLMKube/issues/1781)) ([#&#8203;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 ([#&#8203;1767](https://github.com/defilantech/LLMKube/issues/1767)) ([#&#8203;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 ([#&#8203;1779](https://github.com/defilantech/LLMKube/issues/1779)) ([#&#8203;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 ([#&#8203;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 ([#&#8203;1791](https://github.com/defilantech/LLMKube/issues/1791)) ([#&#8203;1804](https://github.com/defilantech/LLMKube/issues/1804)) ([0cc53c4](https://github.com/defilantech/LLMKube/commit/0cc53c4ae414060d3f11aff3d3738d90b42e99b0))
- **foreman:** drain tasks before agent exit ([#&#8203;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 ([#&#8203;1761](https://github.com/defilantech/LLMKube/issues/1761)) ([#&#8203;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 ([#&#8203;1778](https://github.com/defilantech/LLMKube/issues/1778)) ([#&#8203;1792](https://github.com/defilantech/LLMKube/issues/1792)) ([9fbee34](https://github.com/defilantech/LLMKube/commit/9fbee34cdaf28237c831175f9eac2479ce8f24d5))
- **foreman:** reject unverified reviewer GO ([#&#8203;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 ([#&#8203;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 ([#&#8203;1768](https://github.com/defilantech/LLMKube/issues/1768)) ([#&#8203;1776](https://github.com/defilantech/LLMKube/issues/1776)) ([bff8344](https://github.com/defilantech/LLMKube/commit/bff8344c766ec35f5e019cb46f652b82e5ff365c))
- **grafana:** separate decode throughput axis ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;1717](https://github.com/defilantech/LLMKube/issues/1717)) ([34b9564](https://github.com/defilantech/LLMKube/commit/34b9564d93e27ca09c48d85ec0a9d7df0efa44ac))
- **foreman:** report missing planned children in Dispatched condition ([#&#8203;1743](https://github.com/defilantech/LLMKube/issues/1743)) ([e9ce0ff](https://github.com/defilantech/LLMKube/commit/e9ce0ffd7ad9e9802582e0d4fc1f3a3b14d82fc2))
- **modelrouter:** AgentGateway data plane beside Proxy and Gateway ([#&#8203;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 ([#&#8203;1750](https://github.com/defilantech/LLMKube/issues/1750)) ([#&#8203;1758](https://github.com/defilantech/LLMKube/issues/1758)) ([5ef4fa0](https://github.com/defilantech/LLMKube/commit/5ef4fa03f8c65998d1ed5b3841fd86c849b8b02e))
- multi-node inference groups (spec.multiNode) for vLLM ([#&#8203;1746](https://github.com/defilantech/LLMKube/issues/1746)) ([b56c080](https://github.com/defilantech/LLMKube/commit/b56c08058084ba00876eb001096abdadd80e34a2))
- **observability:** pin the llama.cpp metric contract ([#&#8203;1186](https://github.com/defilantech/LLMKube/issues/1186)) ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;1726](https://github.com/defilantech/LLMKube/issues/1726)) ([e4a3669](https://github.com/defilantech/LLMKube/commit/e4a3669afe3fcc4be46c9d4de8368a62216432bc))
- **controller:** make zero-findings scope-overlap demotion inert ([#&#8203;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 ([#&#8203;1736](https://github.com/defilantech/LLMKube/issues/1736)) ([db98633](https://github.com/defilantech/LLMKube/commit/db986338a9c468e908f2e6f6a2a670d34804bc7d))
- **foreman:** clear Dispatched condition on terminal Workloads ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;1748](https://github.com/defilantech/LLMKube/issues/1748)) ([#&#8203;1751](https://github.com/defilantech/LLMKube/issues/1751)) ([ef69b4c](https://github.com/defilantech/LLMKube/commit/ef69b4c09f08f648d21590d6367cce75c746e3aa))
- **foreman:** report rejected submissions on max-turns INCOMPLETE ([#&#8203;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 ([#&#8203;1734](https://github.com/defilantech/LLMKube/issues/1734)) ([15ba740](https://github.com/defilantech/LLMKube/commit/15ba7408b3f3b4f4c9e138c42acba565209565b9))
- **foreman:** validate resolvedBy before ALREADY-RESOLVED skips verification ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;1647](https://github.com/defilantech/LLMKube/issues/1647)) ([f26150c](https://github.com/defilantech/LLMKube/commit/f26150cd8a4baf8102f86df04775c92e44196fac))
- **cli:** llmkube foreman run, the unattended orchestration loop ([#&#8203;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 ([#&#8203;1690](https://github.com/defilantech/LLMKube/issues/1690)) ([cf9f794](https://github.com/defilantech/LLMKube/commit/cf9f7942ae051aa2e66620495c448e32f6cd540a))
- **foreman:** block dependents of a contradicting dependency ([#&#8203;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 ([#&#8203;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 ([#&#8203;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) ([#&#8203;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 ([#&#8203;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) ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;1641](https://github.com/defilantech/LLMKube/issues/1641)) ([4ac7e6b](https://github.com/defilantech/LLMKube/commit/4ac7e6bee39349d493496c7f599228cf104df9c6))
- **foreman:** fill the transcript budget when truncating ([#&#8203;1673](https://github.com/defilantech/LLMKube/issues/1673)) ([76ce407](https://github.com/defilantech/LLMKube/commit/76ce40756e5cf275c884be531a2fd66e16cb366b))
- **foreman:** make the ALREADY-RESOLVED cascade-skip transitive ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;1668](https://github.com/defilantech/LLMKube/issues/1668)) ([a9b048c](https://github.com/defilantech/LLMKube/commit/a9b048c7daf7b7ed15dd353cb18cce458f9e5606))
- **prefetch:** honour InferenceService modelCache.claimName ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;1625](https://github.com/defilantech/LLMKube/issues/1625)) ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;1642](https://github.com/defilantech/LLMKube/issues/1642)) ([4e7ab7b](https://github.com/defilantech/LLMKube/commit/4e7ab7b74313c6bf9064d8a0d939a8338b0c8f3f))
- **foreman:** make the CustomResourceState config produce usable metrics ([#&#8203;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 ([#&#8203;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 ([#&#8203;1629](https://github.com/defilantech/LLMKube/issues/1629)) ([fba0bf4](https://github.com/defilantech/LLMKube/commit/fba0bf4d8cdeab13d521f0fa32da8272a2c4a0d1))
- **proposals:** foreman run, an unattended orchestration loop ([#&#8203;1652](https://github.com/defilantech/LLMKube/issues/1652)) ([df57f49](https://github.com/defilantech/LLMKube/commit/df57f490c1f4aa01ccb5dbf6e8dbf238aaee3a18))
- reframe the multi-GPU guide from an Issue [#&#8203;2](https://github.com/defilantech/LLMKube/issues/2) validation plan into a deployment guide ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;1614](https://github.com/defilantech/LLMKube/issues/1614)) ([477a599](https://github.com/defilantech/LLMKube/commit/477a599b06f3196438a055ab419a7661846587ba))
- **foreman:** deterministic cross-stage contradiction detection ([#&#8203;1589](https://github.com/defilantech/LLMKube/issues/1589)) ([0bd102a](https://github.com/defilantech/LLMKube/commit/0bd102a95514d33066b016f5edae278d3986257b))
- **foreman:** execution-verification section in the reviewer rubric ([#&#8203;1617](https://github.com/defilantech/LLMKube/issues/1617)) ([03702a0](https://github.com/defilantech/LLMKube/commit/03702a0a54858ad21fcd398adceee4786f9b8564))
- **foreman:** extract behaviour clauses from an issue body ([#&#8203;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 ([#&#8203;1611](https://github.com/defilantech/LLMKube/issues/1611)) ([61e65a4](https://github.com/defilantech/LLMKube/commit/61e65a4d3435256a3605614fc2ab6cfbe9d9bd3b))
- **foreman:** let GateProfile declare a test-layout convention ([#&#8203;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 ([#&#8203;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 ([#&#8203;1588](https://github.com/defilantech/LLMKube/issues/1588)) ([376fa58](https://github.com/defilantech/LLMKube/commit/376fa5869015d1dbc90998064a6574c63ad6f94a))
- **foreman:** test-layout mapping for parallel test trees ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;1606](https://github.com/defilantech/LLMKube/issues/1606)) ([135ba88](https://github.com/defilantech/LLMKube/commit/135ba88f5bbf36745c68561e67979110a2b052f2))
- **foreman:** skip the NoSystemPrompt floor for deterministic agents ([#&#8203;1615](https://github.com/defilantech/LLMKube/issues/1615)) ([3c99ac0](https://github.com/defilantech/LLMKube/commit/3c99ac04d0bf3770ac7028a996f2db9e7e24adff))

##### Documentation

- **foreman:** document gateProfile.testLayout ([#&#8203;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 ([#&#8203;1544](https://github.com/defilantech/LLMKube/issues/1544)) ([6694d0b](https://github.com/defilantech/LLMKube/commit/6694d0b010e64834e884a81f85412f7082ec9adf))
- **controller:** speculativeDecoding.draftModel for companion-file drafters ([#&#8203;1564](https://github.com/defilantech/LLMKube/issues/1564)) ([a8526a8](https://github.com/defilantech/LLMKube/commit/a8526a848ba018e38bbdbcbca86286a1b79c5b85))
- **controller:** surface actual GPU offload in InferenceService status ([#&#8203;1566](https://github.com/defilantech/LLMKube/issues/1566)) ([a2335c6](https://github.com/defilantech/LLMKube/commit/a2335c60929f62b97d5d63943a04c13b68a319ea))
- draft-model speculative decoding on InferenceService ([#&#8203;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 ([#&#8203;1546](https://github.com/defilantech/LLMKube/issues/1546)) ([0afa9c9](https://github.com/defilantech/LLMKube/commit/0afa9c9d6e7e402330ce3fc39aacfe363142ea3d))
- **foreman:** flag issue references removed by a diff ([#&#8203;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 ([#&#8203;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) ([#&#8203;1578](https://github.com/defilantech/LLMKube/issues/1578)) ([07754f1](https://github.com/defilantech/LLMKube/commit/07754f1c9bf9805eeb2f05e6a376a46551e527db))
- **foreman:** operator-emitted task outcome counters ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;1569](https://github.com/defilantech/LLMKube/issues/1569)) ([79f8f08](https://github.com/defilantech/LLMKube/commit/79f8f0846c06f72e8873acabb562f12be2ed2bfd))
- **controller:** let draft-mtp accept an optional draftModelRef ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 [#&#8203;1527](https://github.com/defilantech/LLMKube/issues/1527) rename ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;1481](https://github.com/defilantech/LLMKube/issues/1481)) ([#&#8203;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() ([#&#8203;1494](https://github.com/defilantech/LLMKube/issues/1494)) ([bf8c1a0](https://github.com/defilantech/LLMKube/commit/bf8c1a034b0209aad030905e2591941a209d63b5))
- **chart:** scope agent Deployment selectors to their pool ([#&#8203;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 ([#&#8203;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 ([#&#8203;1476](https://github.com/defilantech/LLMKube/issues/1476)) ([#&#8203;1507](https://github.com/defilantech/LLMKube/issues/1507)) ([82baff8](https://github.com/defilantech/LLMKube/commit/82baff88362cac188c3b4c68654734eaffa5e9b3))
- extract path refs the extension gate was discarding ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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) ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;1462](https://github.com/defilantech/LLMKube/issues/1462)) ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;1519](https://github.com/defilantech/LLMKube/issues/1519)) ([774e0b9](https://github.com/defilantech/LLMKube/commit/774e0b95865668fc422192575c4fc7b19279e90c))
- **router-proxy:** reject colliding listener addresses at startup ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;1514](https://github.com/defilantech/LLMKube/issues/1514)) ([12d59c2](https://github.com/defilantech/LLMKube/commit/12d59c2f62629ee636ae83bd6853e378aca5abae))
- **operations:** document ModelPool in the GPU-sharing guide ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;1471](https://github.com/defilantech/LLMKube/issues/1471)) ([6c122be](https://github.com/defilantech/LLMKube/commit/6c122bea5d77f1ffca975890c9d1ae6faa461321))
- **foreman:** read-only fetch\_pull\_request tool ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;1425](https://github.com/defilantech/LLMKube/issues/1425)) ([06670f9](https://github.com/defilantech/LLMKube/commit/06670f9905664ad9ae0f7f40a04139da9cf9c1cc))
- **controller:** diagnose model-transfer failures from init containers ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;1459](https://github.com/defilantech/LLMKube/issues/1459)) ([2f453d6](https://github.com/defilantech/LLMKube/commit/2f453d621279c787fa3592020901120e93ed36d6))
- **controller:** emit draft-simple for speculativeDecoding type draft ([#&#8203;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 ([#&#8203;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 ([#&#8203;1450](https://github.com/defilantech/LLMKube/issues/1450)) ([f054960](https://github.com/defilantech/LLMKube/commit/f0549605b029783fb2095d205a990d69c0bd6a7c))
- **controller:** set TerminationMessagePolicy on generated init containers ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;1366](https://github.com/defilantech/LLMKube/issues/1366)) ([2e8f8a8](https://github.com/defilantech/LLMKube/commit/2e8f8a8c8c122db46b67ede960152f0d80ff8590))
- **dashboards:** add a llama.cpp runtime dashboard ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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) ([#&#8203;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 ([#&#8203;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 ([#&#8203;1392](https://github.com/defilantech/LLMKube/issues/1392)) ([48d7d49](https://github.com/defilantech/LLMKube/commit/48d7d49a61c74a90b897eb273ab9aaebe21c2365))
- **controller:** skip model-cache PVC for pvc:// sources ([#&#8203;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 ([#&#8203;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 ([#&#8203;1389](https://github.com/defilantech/LLMKube/issues/1389)) ([ce828dd](https://github.com/defilantech/LLMKube/commit/ce828dd6baeb2039dc15b2be8afebada48d3e285))
- **router:** apply external.model as modelNameOverride on backendRefs ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;1402](https://github.com/defilantech/LLMKube/issues/1402)) ([422b9ef](https://github.com/defilantech/LLMKube/commit/422b9ef6f679e4bbdb3ab5abefbaeefec14f18ee))

##### Documentation

- add observability maintainer ([#&#8203;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 ([#&#8203;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 ([#&#8203;1267](https://github.com/defilantech/LLMKube/issues/1267)) ([c2d56b7](https://github.com/defilantech/LLMKube/commit/c2d56b7d31746726e5dc79e2f4ce5f94b6452560))
- **foreman:** test-dilution advisory for the coder gate ([#&#8203;1332](https://github.com/defilantech/LLMKube/issues/1332)) ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;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 ([#&#8203;1311](https://github.com/defilantech/LLMKube/issues/1311)) ([#&#8203;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 ([#&#8203;1322](https://github.com/defilantech/LLMKube/issues/1322)) ([#&#8203;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 ([#&#8203;1309](https://github.com/defilantech/LLMKube/issues/1309)) ([#&#8203;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) ([#&#8203;1299](https://github.com/defilantech/LLMKube/issues/1299)) ([#&#8203;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 ([#&#8203;1327](https://github.com/defilantech/LLMKube/issues/1327)) ([#&#8203;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 ([#&#8203;1342](https://github.com/defilantech/LLMKube/issues/1342)) ([#&#8203;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 ([#&#8203;1292](https://github.com/defilantech/LLMKube/issues/1292)) ([#&#8203;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 ([#&#8203;1343](https://github.com/defilantech/LLMKube/issues/1343)) ([#&#8203;1345](https://github.com/defilantech/LLMKube/issues/1345)) ([ae2dfc2](https://github.com/defilantech/LLMKube/commit/ae2dfc2ed7f2d130a12d9e6364f5e7ed03f70f11))
- **foreman:** record IsError on MCP transport failures ([#&#8203;1330](https://github.com/defilantech/LLMKube/issues/1330)) ([#&#8203;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 ([#&#8203;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 ([#&#8203;1329](https://github.com/defilantech/LLMKube/issues/1329)) ([#&#8203;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 ([#&#8203;1312](https://github.com/defilantech/LLMKube/issues/1312)) ([#&#8203;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…
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG] Coder's prBody is dropped when the PR opens on review GO, so Foreman PRs ship the raw unfilled template

2 participants