Skip to content

chore(server): promote the llama.cpp b10238 bump and dependency updates to production - #219

Merged
dvcdsys merged 14 commits into
mainfrom
develop
Aug 3, 2026
Merged

chore(server): promote the llama.cpp b10238 bump and dependency updates to production#219
dvcdsys merged 14 commits into
mainfrom
develop

Conversation

@dvcdsys

@dvcdsys dvcdsys commented Aug 3, 2026

Copy link
Copy Markdown
Owner

Promotes the current develop to main so server/v0.12.8 can be tagged.

What ships

llama.cpp b10238 (#217) — bumps every pin in the repo and fixes the bundle
breakage the new upstream layout exposed. fetch-llama.sh now ships the whole
*.dylib set instead of a hand-maintained list, matching the rule
Dockerfile/Dockerfile.cuda already encode as COPY /app/*.so*.

Two follow-up fixes found while regression-testing that change:

  • 95e703d — the new @rpath guard could pass vacuously on exactly the bundle
    it exists to reject: otool exits 0 on a non-Mach-O file, and an absent
    otool fed the loop an empty list, either of which reads as "nothing
    missing". It now requires the tool, requires it to succeed, and rejects
    output that is not a dependency listing. Also corrects two docs claims the
    bump left stale (llama-checksums.txt asserted a CI gate that does not
    exist; README.md still documented the replaced fixed dylib list).
  • 02ee183make bundle copied into a directory nothing ever cleaned, so
    the shipped bundle accumulated the dylibs of every version ever built there.
    A b8914-era tree rebuilt on b10238 produced 45 files where the fetch staged
    36, the extras being 9 stale b8914 dylibs (13 MB) sitting next to their
    replacements. Now 36 files / 52 MB, matching the fetch exactly.

Dependency updates — npm group (16 updates), Go group (3), GitHub Actions
(setup-go 7, setup-node 7, docker/login-action 4.5.1).

Verification

Full regression on all three build surfaces, each exercising the
llama-dependent path end to end (index a repo, then two semantic queries that
must resolve to different files — returning a hit is not enough, since a
broken embedding path still returns something):

Surface Build Run Index Search Metadata
macOS native (b10238, Metal) ✅ 52 MB ✅ ready in 3.4s
Docker CPU (arm64)
Docker CUDA (amd64, RTX 3090) ✅ 1.48 GB ✅ healthy

GPU attribution verified explicitly rather than inferred from container health:
the llama-server PID from docker top appears in
nvidia-smi --query-compute-apps with 504 MiB, ruling out a silent CPU
fallback.

Security gate — trivy diff of develop-cu128 against the released
v0.12.7-cu128, both scanned on the amd64 host:

base      v0.12.7-cu128 : CRITICAL=0  HIGH=4
candidate develop-cu128 : CRITICAL=0  HIGH=4
new: 0

All four HIGHs are the known pre-existing findings in the bundled ngrok
binary and are identical on both sides. This closes the gate PR #217 flagged as
outstanding.

🤖 Generated with Claude Code

dependabot Bot and others added 14 commits July 20, 2026 14:55
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 5 to 7.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](actions/setup-node@v5...v7)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [actions/setup-go](https://github.com/actions/setup-go) from 6 to 7.
- [Release notes](https://github.com/actions/setup-go/releases)
- [Commits](actions/setup-go@v6...v7)

---
updated-dependencies:
- dependency-name: actions/setup-go
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [docker/login-action](https://github.com/docker/login-action) from 4.4.0 to 4.5.1.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](docker/login-action@af1e73f...abd2ef4)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-version: 4.5.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps the go group with 3 updates in the /server directory: [github.com/getkin/kin-openapi](https://github.com/getkin/kin-openapi), [github.com/oapi-codegen/runtime](https://github.com/oapi-codegen/runtime) and [modernc.org/sqlite](https://gitlab.com/cznic/sqlite).


Updates `github.com/getkin/kin-openapi` from 0.144.0 to 0.145.0
- [Release notes](https://github.com/getkin/kin-openapi/releases)
- [Commits](getkin/kin-openapi@v0.144.0...v0.145.0)

Updates `github.com/oapi-codegen/runtime` from 1.5.0 to 1.6.0
- [Release notes](https://github.com/oapi-codegen/runtime/releases)
- [Commits](oapi-codegen/runtime@v1.5.0...v1.6.0)

Updates `modernc.org/sqlite` from 1.53.0 to 1.54.0
- [Changelog](https://gitlab.com/cznic/sqlite/blob/master/CHANGELOG.md)
- [Commits](https://gitlab.com/cznic/sqlite/compare/v1.53.0...v1.54.0)

---
updated-dependencies:
- dependency-name: github.com/getkin/kin-openapi
  dependency-version: 0.145.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: go
- dependency-name: github.com/oapi-codegen/runtime
  dependency-version: 1.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: go
- dependency-name: modernc.org/sqlite
  dependency-version: 1.54.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: go
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps the npm group with 16 updates in the /server/dashboard directory:

| Package | From | To |
| --- | --- | --- |
| [@radix-ui/react-dialog](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/dialog) | `1.1.19` | `1.1.23` |
| [@radix-ui/react-dropdown-menu](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/dropdown-menu) | `2.1.20` | `2.1.24` |
| [@radix-ui/react-label](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/label) | `2.1.11` | `2.1.15` |
| [@radix-ui/react-radio-group](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/radio-group) | `1.4.3` | `1.4.7` |
| [@radix-ui/react-scroll-area](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/scroll-area) | `1.2.14` | `1.2.18` |
| [@radix-ui/react-select](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/select) | `2.3.3` | `2.3.7` |
| [@radix-ui/react-slider](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/slider) | `1.4.3` | `1.4.7` |
| [@radix-ui/react-slot](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/slot) | `1.3.0` | `1.3.3` |
| [@radix-ui/react-switch](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/switch) | `1.3.3` | `1.3.7` |
| [@radix-ui/react-tabs](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/tabs) | `1.1.17` | `1.1.21` |
| [@radix-ui/react-tooltip](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/tooltip) | `1.2.12` | `1.2.16` |
| [@tanstack/react-query](https://github.com/TanStack/query/tree/HEAD/packages/react-query) | `5.101.2` | `5.101.4` |
| [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) | `6.0.3` | `6.0.4` |
| [autoprefixer](https://github.com/postcss/autoprefixer) | `10.5.2` | `10.5.4` |
| [postcss](https://github.com/postcss/postcss) | `8.5.19` | `8.5.24` |
| [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) | `8.1.4` | `8.1.5` |



Updates `@radix-ui/react-dialog` from 1.1.19 to 1.1.23
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/dialog/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/dialog)

Updates `@radix-ui/react-dropdown-menu` from 2.1.20 to 2.1.24
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/dropdown-menu/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/dropdown-menu)

Updates `@radix-ui/react-label` from 2.1.11 to 2.1.15
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/label/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/label)

Updates `@radix-ui/react-radio-group` from 1.4.3 to 1.4.7
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/radio-group/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/radio-group)

Updates `@radix-ui/react-scroll-area` from 1.2.14 to 1.2.18
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/scroll-area/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/scroll-area)

Updates `@radix-ui/react-select` from 2.3.3 to 2.3.7
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/select/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/select)

Updates `@radix-ui/react-slider` from 1.4.3 to 1.4.7
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/slider/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/slider)

Updates `@radix-ui/react-slot` from 1.3.0 to 1.3.3
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/slot/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/slot)

Updates `@radix-ui/react-switch` from 1.3.3 to 1.3.7
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/switch/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/switch)

Updates `@radix-ui/react-tabs` from 1.1.17 to 1.1.21
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/tabs/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/tabs)

Updates `@radix-ui/react-tooltip` from 1.2.12 to 1.2.16
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/tooltip/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/tooltip)

Updates `@tanstack/react-query` from 5.101.2 to 5.101.4
- [Release notes](https://github.com/TanStack/query/releases)
- [Changelog](https://github.com/TanStack/query/blob/main/packages/react-query/CHANGELOG.md)
- [Commits](https://github.com/TanStack/query/commits/@tanstack/react-query@5.101.4/packages/react-query)

Updates `@vitejs/plugin-react` from 6.0.3 to 6.0.4
- [Release notes](https://github.com/vitejs/vite-plugin-react/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-react/commits/plugin-react@6.0.4/packages/plugin-react)

Updates `autoprefixer` from 10.5.2 to 10.5.4
- [Release notes](https://github.com/postcss/autoprefixer/releases)
- [Changelog](https://github.com/postcss/autoprefixer/blob/main/CHANGELOG.md)
- [Commits](postcss/autoprefixer@10.5.2...10.5.4)

Updates `postcss` from 8.5.19 to 8.5.24
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](postcss/postcss@8.5.19...8.5.24)

Updates `vite` from 8.1.4 to 8.1.5
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.1.5/packages/vite)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-dialog"
  dependency-version: 1.1.23
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: "@radix-ui/react-dropdown-menu"
  dependency-version: 2.1.24
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: "@radix-ui/react-label"
  dependency-version: 2.1.15
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: "@radix-ui/react-radio-group"
  dependency-version: 1.4.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: "@radix-ui/react-scroll-area"
  dependency-version: 1.2.18
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: "@radix-ui/react-select"
  dependency-version: 2.3.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: "@radix-ui/react-slider"
  dependency-version: 1.4.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: "@radix-ui/react-slot"
  dependency-version: 1.3.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: "@radix-ui/react-switch"
  dependency-version: 1.3.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: "@radix-ui/react-tabs"
  dependency-version: 1.1.21
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: "@radix-ui/react-tooltip"
  dependency-version: 1.2.16
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: "@tanstack/react-query"
  dependency-version: 5.101.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: "@vitejs/plugin-react"
  dependency-version: 6.0.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: autoprefixer
  dependency-version: 10.5.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: postcss
  dependency-version: 8.5.23
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: vite
  dependency-version: 8.1.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
...

Signed-off-by: dependabot[bot] <support@github.com>
…p/actions/setup-node-7

chore(deps): bump actions/setup-node from 5 to 7
…p/actions/setup-go-7

chore(deps): bump actions/setup-go from 6 to 7
…p/docker/login-action-4.5.1

chore(deps): bump docker/login-action from 4.4.0 to 4.5.1
…elop/go-74bf316670

chore(deps): bump the go group across 1 directory with 3 updates
…ashboard/develop/npm-ca177858e0

chore(deps): bump the npm group across 1 directory with 16 updates
Upstream moved well past every pin we carry. This bumps all three of
them and fixes the bundle breakage the new layout exposed.

Pins:
  - Dockerfile.cuda  7b3d7834 -> fd68d130 (:server-cuda)
  - Dockerfile       6bc9134e -> 9e60dd36 (:server, multi-arch)
  - Makefile         LLAMA_VERSION b8914 -> b10238 (+ checksum row)

fetch-llama.sh shipped a hand-maintained list of dylibs. b10238 moved
each tool's logic into its own libllama-<tool>-impl.dylib, so the list
produced a bundle whose llama-server aborted at dyld load time:

    Library not loaded: @rpath/libllama-server-impl.dylib

Ship the whole dylib set instead — the same lesson the Dockerfiles
already encode with `COPY /app/*.so*`. The other tools' impl dylibs
cost ~1 MB of a ~52 MB bundle. Standalone binaries are still dropped.
A post-copy otool check now fails the fetch when any @rpath dependency
of llama-server is missing, so the next layout change surfaces at
fetch time instead of on an operator's machine.

Also fix the weekly pin-freshness workflow's duplicate detection: the
issue title contains "(" and ":", which GitHub's search parser reads as
a qualifier, so `--search "$title in:title"` never matched and every run
filed a fresh duplicate (#170 and #205 are the same reminder). Match the
exact title against the open-issue list instead.

Verified:
  - CPU image builds locally (arm64) and /app/llama-server runs;
    docker scout: 0 CRITICAL / 0 HIGH / 0 MEDIUM / 0 LOW, 73 MB
  - macOS arm64 bundle: llama-server --version -> b10238, all @rpath
    dependencies resolve
  - CUDA image: /app/llama-server + libllama-server-impl.so present in
    the new digest and the `COPY /app/*.so*` glob still captures them;
    a full CUDA build + scan still needs the amd64 builder (host was
    offline) and must run before the next server release

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
chore(server): bump llama.cpp to b10238 / current image digests
…tale docs

The @rpath dependency check added alongside the b10238 bump could pass
vacuously on exactly the bundle it exists to reject:

  - `otool` exits 0 when handed a non-Mach-O file (it prints "… is not an
    object file" and returns success), so a malformed llama-server yielded
    an empty dependency list, which read as "nothing missing".
  - An absent otool (no Xcode CLT) fed the loop an empty list for the same
    net effect, and process substitution does not propagate the failure
    under `set -euo pipefail`.

Require the tool, require it to succeed, and reject output that is not a
dependency listing. Verified on three cases: non-Mach-O input and missing
otool now exit 1 with an actionable message; a real Mach-O whose deps all
resolve still passes.

Also correct two docs claims the b10238 change left stale:

  - llama-checksums.txt asserted "CI fails hard on SHA mismatch". No
    workflow runs fetch-llama.sh — the whole macOS bundle path executes
    only on a developer's Mac. Say where the gate actually is.
  - server/README.md still documented the hand-maintained dylib list that
    the bump replaced with a whole-directory copy. That fixed list is the
    artifact that caused the dyld-load failure in the first place.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
`make bundle` did `cp -R $(LLAMA_DIR)/. $(BUNDLE_DIR)/llama/` into a
directory nothing ever cleaned. cp -R merges, so the shipped bundle
accumulated the dylibs of every llama.cpp version ever built in that tree.

Found by rebuilding a b8914-era working copy on b10238: the bundle came out
with 45 files where the fetch staged 36, the extras being 9 stale b8914
dylibs (13 MB) dated three weeks earlier — libllama.0.0.8914.dylib,
libllama-common.0.0.8914.dylib, libmtmd.0.0.8914.dylib and the
libggml-*.0.10.0.dylib set, sitting next to their b10238 replacements.

They were inert here only because the @rpath names the new llama-server
resolves happened to be overwritten by the fresh copies. A version that
drops a library instead of replacing it would leave the stale one loadable,
which is the failure fetch-llama.sh already guards its own staging dir
against ("stale dylibs could get picked up by DYLD") — but the bundle is
the directory that actually ships and runs. The macOS re-sign step also
runs `codesign` over llama-server only, so stale differently-signed dylibs
sat next to fresh ones in the same amfid-sensitive directory.

After the fix the bundle is 36 files / 52 MB, matching the fetch exactly.
Correct the size figure in the fetch-llama.sh comment to match (the ~42 MB
it claimed was measured before the impl-dylib split).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@dvcdsys
dvcdsys merged commit 7afb0d0 into main Aug 3, 2026
13 checks passed
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.

1 participant