Skip to content

QVAC-24253 feat[api]: expose split-mode 'tensor' in llm-llamacpp - #4121

Merged
iancris merged 18 commits into
mainfrom
QVAC-24253/tensor-split-mode
Sep 1, 2026
Merged

iancris merged 18 commits into
mainfrom
QVAC-24253/tensor-split-mode

Conversation

@iancris

@iancris iancris commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

🎯 Problem

@qvac/llm-llamacpp ships pipeline parallelism (split-mode: 'layer') and accepts the legacy 'row'
mode, which it degrades to 'layer' because no shipped backend provides split buffers. It does not
expose LLAMA_SPLIT_MODE_TENSOR — qvac-fabric's meta-device tensor parallelism, which splits weights
and KV cache across every visible GPU. So no form of real tensor parallelism was reachable: row is
inert and tensor did not exist.

Asana: QVAC-24253

📝 How

LoadFitNormalization.cpp — parse 'tensor', plus one block enforcing what fabric requires of the
mode, each rejected up front with InvalidArgument rather than surfacing as an opaque native failure:

  • Flash attention required — fabric returns a null context otherwise. Both flash-attn and
    flash_attn spellings are checked, and either being falsey rejects; the underscore form is never
    normalised into the hyphen key when a caller sets it directly, so reading only one would let off through.
  • Auto-fit disabledcommon_params_fit refuses SPLIT_MODE_TENSOR and swallows it into a WARN that
    common_init_result ignores, so the load proceeds unfitted either way. Disabling it explicitly makes the
    logs say what is actually happening.
  • Architecture denylistllm_arch_supports_sm_tensor lives in fabric's internal src/llama-arch.h,
    outside the installed include tree, so the addon mirrors it (27 entries at v10297.1.0) and pins it with
    a test. Fabric's own check remains the backstop.

The block sits after tuneLoadConfigMap, which applies the flash-attn defaults, so it is the first point
where the effective value can be read. It keys on params.split_mode, so a tensor request that fell back
to CPU skips every check.

BackendSelection.cpp — tensor mode passes an explicit --device list. Enumeration skips RPC devices
(matching fabric's rule, so a local iGPU is not dropped on iGPU+RPC setups), prefers discrete over
integrated, and dedupes on props.device_id (PCI bus id) rather than description — two identical cards
report identical descriptions, so deduping on description would collapse a 2× RTX 4090 host to one GPU.

Deliberately unchanged — the row-split probe stays ROW-only. SPLIT_MODE_TENSOR needs no split
buffers; routing it through gpuBackendSupportsRowSplit() would silently degrade it to 'layer' on every
shipped backend. A comment and a test pin that.

Also included: a model-fit mobile-bundling fix (85082071a)

Unrelated to the tensor work and pre-existing on main since model-fit 0.6.0 (#3930); it is here only
because this PR's mobile validation surfaced it. model-fit's mobile tests failed at Build mobile app
before any device was reached:

ModuleTraverseError: MODULE_NOT_FOUND: Cannot find module '../../binding-internal.js'

bare-pack resolves the generated static requires eagerly, including ones nested inside test bodies, and the
framework shims only public entry points — so ../../binding-internal.js resolves to a file nothing
creates. Fix: move the two raw-fitter cases to test/integration/fit-internal.test.js and exclude that one
file from the generated mobile suite. No assertion changed and nothing is skipped — both cases still run
on desktop, since test:integration:suite globs independently of the exclusion list. They were never
runnable on mobile. Also declares bare-url, which test/mobile/integration-runtime.cjs requires and
nothing listed.

🧪 Tested

Local (macOS arm64, BUILD_TESTING=ON, Release), built from source against the overlay:

  • *TensorSplit*12/12: parse + fit disabled; fit left enabled for none/layer/row; underscore and
    uppercase keys; row probe not invoked; never degraded; both flash-attn: off and flash_attn: off
    rejected, including contradictory pairs; unsupported architecture rejected by name; CPU fallback clears
    to NONE; the denylist pin; invalid-value error text.
  • Regression pass over LoadFitNormalizationTest.* : LoadFitSnapshotTest.* : TuneConfigMap* : *BackendSelection*229/229.
  • typecheck, test:types:consumer, lint:js, lint:ts, check:generated, git-clang-format — clean.

Not run locally: the model-level test (needs the multi-GB GGUF set, covered by cpp-tests) and the two
multi-GPU integration cases (gated on QVAC_HAS_MULTI_GPU=1, which no workflow sets — they need a two-GPU
host and remain unexecuted).

🔬 Validation

Desktop — runs at 165d0735d, resolving 10297.1.1 from the registry

These build against the published qvac-fabric 10297.1.1, with no overlay involved. A further merge
from main has since landed on the branch; its CI generation supersedes these links but does not change
what they demonstrate.

Plus Merge Guard ✅, Classification-ggml ✅, and all five repo-wide checks (SDK Pod, NOTICE drift, License
compliance, Check Approvals, Security baseline) ✅ — 14/14 runs green, zero retries.

The preceding generation at 1f3e4c6ed — the same tree before merging main — was 14/14 green with
zero retries
.

Resolution is confirmed to come from the registry rather than a local port — e.g. fabric/arm64-osx:

qvac-fabric[core,gpu-backends,hip-backend,llama]:arm64-osx@10297.1.1
  -- git+https://github.com/tetherto/qvac-registry-vcpkg.git@c1235541954a39047d0ded5f0ee93896092ecba0
Building qvac-fabric[...]@10297.1.1...

vcpkg-overlays/ports appears nowhere in the log, and c1235541… is the exact git-tree recorded in the
registry's versions DB. It compiled rather than restoring a cache entry — the ABI hash differs from the
overlay round's, as expected once REF is v${VERSION} instead of a literal commit, so no stale artifact
could be mistaken for a fresh build.

Earlier round — the same fabric commit, pre-tag

Before v10297.1.1 was cut, every consumer was validated green against 9d181fe64 via a temporary
overlay pin (since reverted in d4db95f83). Two jobs failed there and passed on retry, both network faults
on the darwin-x64 pool that never reached fabric compilation: Could not resolve host: github.com
mid-vcpkg (ocr-ggml) and npm error network read ETIMEDOUT (embed-llamacpp).

What the bump covers: v10297.1.0...v10297.1.1 touches Vulkan (ggml-vulkan.cpp, new
topk_radix_select.comp, vulkan-shaders-gen.cpp), Qwen4-Next (qwen4exp.cpp, models.h,
llama-kv-cells.h), llama-context.cpp (two fused-op autotune defaults), and test-backend-ops.cpp.
No behavioural addon change was needed: src/llama-arch.cpp is untouched, so
llm_arch_supports_sm_tensor is unchanged and the 27-entry denylist stays correct. The three
"as of v10297.1.0" snapshots (the denylist comment, its test comment, docs/multi-gpu.md) were
re-pointed at v10297.1.1 on that basis; the historical statements stay pinned where they were.

Mobile — branch-native, against 10297.1.1

Every run below is pinned to this branch's own compiled native code, published to GitHub Packages from
165d0735d as @tetherto/<addon>-mono@<ver>-tmp.runid-<id> and installed on the device. Each log states
it outright — Verified: prebuilds come from @tetherto/<addon>-mono@… (pinned, GitHub Packages) — so these
are not the published npm release. Samsung Galaxy S25 Ultra / Apple iPhone 17.

package Android iOS
embed-llamacpp 33515096857 33516902330
llm-llamacpp 33515120919 🔄 33546113021
model-fit 33514976493 — 3/3 on device 33515970754
ocr-ggml 33514989725 — 9/9 on device 33516608633
translation-nmtcpp 33515003614 — 3/3 on device 33516621820

Every mobile test passes on device — Android 5/5, iOS 4/4 with llm-llamacpp's still running.

Several of these runs carry a red or cancelled badge. Read the device verdict, not the badge. An AWS
outage (below) left the workflows unable to read results back from Device Farm; the tests themselves ran
and passed, and those results were verified manually in the Device Farm console.

ocr-ggml and translation-nmtcpp appear here for the first time ever:
their publish-gpr job was skipped on every non-release-* branch, so no dev build existed to pin and
neither addon could be mobile-tested against branch code at all.
#4175 fixed that and merged into this branch — both
published and passed on first use.

The outage, for reference — a reporting failure, not a test failure. From ~14:08Z the Device Farm role
lost devicefarm:GetUpload:

AccessDeniedException calling GetUpload: User: .../assumed-role/GitHub-OIDC-connector/GitHubActions
is not authorized to perform: devicefarm:GetUpload

It still has CreateUpload — the .ipa uploads fine — so the failure lands on the very next call. Not
retryable: embed-llamacpp was retried to 4 attempts and denied identically every time (14:10 → 15:42).
Not caused by this PR either: the equivalent iOS run 24 hours earlier (33401204861) polled the same API
with zero denials.

It shows up two different ways, which is why some rows are cancelled rather than failed:

  • Fail fast — runs reaching the upload poll after ~14:08Z exit immediately (embed-llamacpp).
  • Hang silently — runs already past upload spin in Monitor Device Farm test run until timeout,
    because aws_retry() in monitor-test-run/action.yml discards stderr and returns empty, making a
    permission denial indistinguishable from "no status yet". llm-llamacpp's Android log carries 841
    AWS API attempt N/3 failed lines, the first at 14:10:34 — four seconds after embed-llamacpp iOS's
    first denial. Those runs were cancelled rather than left to burn their timeout.

The four Android runs that completed before ~14:08Z were never affected and are green in CI as well as
on device.

fabric has no mobile row because it has no mobile integration workflow.

classification-ggml also fires here because it path-matches, but it is not a vcpkg fabric consumer —
it has no qvac-fabric dependency or floor and links the published @qvac/fabric npm prebuild, which the
overlay never reaches. Its result carries no validation weight.

⚠️ Breaking

None from the tensor work: purely additive, a new accepted value for an existing optional config key.
Existing split-mode values behave exactly as before, row still degrades to layer, and the mobile
rejection is unchanged.

Release blast radius: squash-merging publishes 6 packagesembed-llamacpp 0.37.0,
fabric 0.10.0, llm-llamacpp 0.49.0, model-fit 0.8.0, ocr-ggml 0.21.0,
translation-nmtcpp 0.13.0.

llm-llamacpp is 0.49.0, not 0.48.0: main already released 0.48.0 (#4167) and both sides bumped
from 0.47.0 identically, so package.json auto-merged clean and the collision was invisible to git.
Publishing as 0.48.0 would have shipped a second, conflicting release.

🔌 API Changes

// packages/llm-llamacpp/src/index.ts — LoadConfig
- "split-mode"?: "none" | "layer" | "row";
+ "split-mode"?: "none" | "layer" | "row" | "tensor";

Pinned by a type test asserting 'tensor' is assignable and the union stays closed —
test/types/consumer-cjs.test-d.ts carries a @ts-expect-error on an invalid mode, which stops compiling
if the union is ever widened to string.

'tensor' is EXPERIMENTAL and desktop-only. It requires flash attention, disables auto-fit (set
ctx_size explicitly for large models
, or the load can OOM where auto-fit would have trimmed the
context), and is unavailable for some architectures. Fabric expects good performance mainly on multi-GPU
CUDA, which this package does not ship — every shipped backend takes the meta backend's generic fallback
reduction. Correct, but not assumed faster than 'layer' without measurement.

🤖 Generated with Claude Code

@iancris
iancris requested review from a team as code owners August 27, 2026 18:05
@iancris iancris added run-cpp-addon-tests CI: run C++ addon tests (requires verified) NLP llm and embed labels Aug 27, 2026
@github-actions

github-actions Bot commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Review Status

Current Status: ✅ APPROVED
Approvals so far: Team Lead: 1, Member: 1

@github-actions

Copy link
Copy Markdown
Contributor

License compliance — clean

No new dependency license findings in this PR.

Warn-only (shadow) mode — this check does not block merges yet.

Updated automatically by the canonical license compliance workflow.

NOTICE presence (advisory)

Missing NOTICE (advisory, does not block):

  • ./.github/actions/release-merge-guard
  • ./docs/website
  • ./packages/ggml-coload-smoke
  • ./packages/fabric/test/integration
  • ./packages/inference-addon-cpp/mobile
  • ./packages/sdk/e2e
  • ./packages/llm-llamacpp/benchmarks/performance
  • ./packages/llm-llamacpp/benchmarks/server
  • ./packages/vla-ggml/sim/server
  • ./packages/embed-llamacpp/benchmarks/performance
  • ./packages/embed-llamacpp/benchmarks/server
  • ./packages/asr-ggml/benchmarks/server

@iancris iancris removed NLP llm and embed run-cpp-addon-tests CI: run C++ addon tests (requires verified) labels Aug 27, 2026
@iancris
iancris force-pushed the QVAC-24253/tensor-split-mode branch from f41f5a5 to 45a83e4 Compare August 27, 2026 18:13
@iancris
iancris force-pushed the QVAC-24253/tensor-split-mode branch from 45a83e4 to bf394e8 Compare August 27, 2026 18:36
@iancris iancris added the run-cpp-addon-tests CI: run C++ addon tests (requires verified) label Aug 27, 2026
@gianni-cor

Copy link
Copy Markdown
Contributor

Addon-side note: moving the tensor-mode params.fit_params = false enforcement to after the generic common-arg parsing looks feasible and would make the override authoritative.

Right now the PR disables fit before the remaining config map is converted into llama.cpp args and parsed. Since qvac-fabric exposes --fit [on|off], a caller can still pass e.g. { "split-mode": "tensor", fit: "on" }; the later parser then sets params.fit_params back to true, so tensor mode reaches qvac-fabric with auto-fit enabled again.

Suggested shape: keep the tensor-mode validation where it is if needed for the pre-parser flash-attn/default logic, but either move just the params.fit_params = false assignment/log to after the arg parsing loop, or add a second post-parse tensor block that forces it off. A small unit test with split-mode=tensor + fit=on would pin the behavior.

@gianni-cor

Copy link
Copy Markdown
Contributor

Could you also add an explicit flash-attention config field to the LLM addon typings, similar to the embedding addon, and propagate it through the SDK schema?

Right now index.d.ts mentions flash-attn: off only in the split-mode docs, but LlamaConfig has no narrow typed field for it; direct addon consumers only get it via the broad [key: string] escape hatch. The embed addon exposes this deliberately as flashAttention?: "on" | "off" | "auto", and the SDK schema also knows about that field.

For this PR, making flash attention part of the typed LLM surface would make the new tensor-mode requirement much clearer and testable. Please add the LLM addon field(s) ("flash-attn" and/or flash_attn, whichever spelling you want to support publicly), narrow it to the values qvac-fabric accepts, add type tests, and then update @qvac/inference / SDK llamacppCompletionConfigSchema so SDK loadModel callers can pass it too. That also lets the tensor-mode flash-attn=off rejection be exercised consistently through both direct-addon and SDK paths.

iancris added a commit that referenced this pull request Aug 28, 2026
Addresses the PR #4121 review and both of gianni-cor's comments.

Pin an explicit --device list for tensor mode (the merge blocker).
qvac-fabric selects devices for SPLIT_MODE_TENSOR through a branch that
applies no device-type filter and no deduplication, unlike the branch
'none'/'layer'/'row' take. Omitting --device therefore split weights and
the KV cache onto the integrated GPU of any discrete + integrated host —
pacing the whole model by its weakest participant — and sharded a GPU
registered by both Vulkan and HIP under GGML_BACKEND_DL twice. main-gpu
could not correct either: fabric's pruning is gated on split_mode NONE.
The addon now enumerates devices itself for tensor mode only, preferring
discrete over integrated and deduplicating by description, and leaves
'layer'/'row' to fabric's own filtered selection as before.

Apply the auto-fit override after argument parsing, not before it
(gianni-cor). fabric registers --fit as a common arg, so it reaches
params through the generic passthrough; a caller passing
{ "split-mode": "tensor", "fit": "on" } previously had fit_params set
back to true after the tensor block cleared it, making the notice a lie
and restoring the spurious "failed to fit params" WARN this feature
exists to avoid.

Reject every falsey flash-attn spelling, not just "off". fabric's
--flash-attn routes through common_arg_utils::is_falsey, which also
accepts "disabled", "false" and "0"; those three previously reached
fabric in exactly the state the guard exists to prevent.

Raise the auto-fit notice from INFO to WARNING. Every sibling "we
overrode your setting" notice in this function is WARNING, and the
library's default verbosity suppresses INFO, so the one message carrying
an OOM consequence was the only invisible one.

Word the flash-attn rejection for finetuning. tuneLoadConfigMap is what
writes flash-attn=off when finetuning, so the old message told callers to
remove a key they never set. The placement comment's BitNet half was also
dead — "bitnet" is rejected by the architecture check first — and now
cites finetuning, the live reason.

Drop the false "pinned by a test" claim. The denylist test reads nothing
from qvac-fabric; it checks the addon against a second copy of the same
literals and cannot detect drift. Renamed to ...CoversFabric, it now
asserts the architecture name appears in the error rather than merely
that something threw ("bitnet" satisfied the old assertion via the
flash-attn branch), and the code comment says plainly that re-deriving
the list on a fabric bump is manual.

Fix the integration assertion that could never pass. extractBufferDevices
requires "<Device> model buffer size", but tensor mode logs the composed
meta buffer as "Meta(Vulkan0,Vulkan1) model buffer size", where the token
is followed by ',' or ')'. Device names are now parsed out of the Meta()
name, and the test also asserts no integrated GPU participates.

Add flash-attn to the typed LlamaConfig surface (gianni-cor), narrowed to
the values fabric accepts, with type tests. Propagating it and 'tensor'
into the @qvac/inference schema is separate SDK-pod work and is called
out in the docs and CHANGELOG instead.

Docs: correct "mistral" — no such architecture exists at v10297.0.0
(mistral3 does; mistral4 is unsupported) — and record the SDK limitation,
the device-selection behaviour, and four new fallback rows.

Also fixes a use-after-free ASan caught in the new device enumeration:
the description pointer was held across the ggml_backend_dev_name call,
which is invalid against any implementation that stores results in a
reallocating container.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@iancris iancris added the run-desktop-addon-tests CI: run desktop integration tests (requires verified) label Aug 28, 2026
iancris and others added 5 commits August 31, 2026 10:32
fabric#214 was rebased onto the current temp-10297 (its 6 commits, one a
redundant merge, became 5 with new SHAs), so the overlay's old pin
1d14f65 is no longer on any branch. Repin to the new head 5854dddb5 with
a freshly computed SHA512.

This is not just a SHA change: the rebase moves the branch 21 commits
forward on temp-10297, and one of those inserts a field mid-struct in
both common_params and llama_model_params —

    enum llama_tensor_read_lazy tensor_read_lazy;   // before main_gpu

so every field after it shifts. An INCREMENTAL rebuild across this
change does not fail to link; it silently produces a binary that reads
cache_type_k from the wrong offset, which surfaced here as an ASan BUS
inside ggml_type_name via common_params_parser_init. A clean rebuild is
required for any consumer crossing this fabric version.

Verified after wiping the build tree: vcpkg resolves the overlay
(qvac-fabric[core,gpu-backends,llama]:arm64-osx@10297.214.0 built from
source) and addon-test passes 228/228 on darwin-arm64. The rebased
fabric branch itself was built and its two touched tests run green
before it was pushed (test-fit-params, test-unified-memory-props).

Still DO NOT MERGE — revert this commit and the overlay commit before
merging.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…inst temp-10297

Rollout Phase A for qvac-fabric 10297.1.0. Repins the shared qvac-fabric
overlay port to temp-10297 @ 94357c6b1 and points all 7 consumers at it, so
they build against the release branch head before the v10297.1.0 tag exists
and before anything is published to the registry.

Supersedes the narrower single-consumer overlay this PR already carried,
which pinned fabric PR #214's head (5854dddb5). That pin is now redundant:
#214 merged into temp-10297 as 94357c6b1, so the new pin contains the same
fit work plus everything else on the branch.

Consumer version>= pins are untouched — the overlay bypasses version
resolution, so only the overlay port's own version matters here; bumping the
pins is Phase B. default-registry.baseline is untouched in all 7 (each
carries a different baseline; none was modified).

TEMPORARY. This commit is reverted by /rollout-phase-b --on-top-of-pr before
the fabric dependency bump. The PR itself is meant to merge; this commit is
not.

NOTE FOR PHASE B: the overlay spans THREE commits on this PR, not one.
Reverting only this commit would restore the 5854dddb5 pin and leave
llm-llamacpp overlaid. All three must go:
  bf394e8  created overlay + llm-llamacpp key
  e8a02ee  repinned to 5854dddb5
  (this commit)                             repin to temp-10297 + 6 consumers

Verified locally on darwin-arm64: vcpkg built
qvac-fabric[core,gpu-backends,llama]:arm64-osx@10297.1.0 from source (not a
cache restore, so portfile.cmake executed), and addon-test passes 228/228
after a clean rebuild.

Rollout-Overlay: qvac-fabric 10297.1.0 ref=temp-10297 sha=94357c6b16aaae0470fa3702247ec2d6fc677edb

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
model-fit is the only fabric consumer whose mobile integration tests fail, and
the failure reproduces on Android and iOS, on self-hosted Linux and
GitHub-hosted macOS runners, always at "Build mobile app" before any device is
reached:

  ModuleTraverseError: MODULE_NOT_FOUND: Cannot find module
  '../../binding-internal.js' imported from
  '.../test-framework/backend/test/integration/fit.test.js'

The mobile framework (tetherto/qvac-test-addon-mobile) copies the whole test/
tree into its own backend/, emits a static require for every file listed in
test/mobile/integration.auto.cjs, and bundles with bare-pack — which resolves
those requires eagerly, including ones nested inside test bodies. It shims only
the public entry points into backend/ (index.js, binding.js, addon.js), so
../../binding-internal.js resolves to backend/binding-internal.js, which nothing
creates. The private surface is packaged but deliberately absent from `exports`
(asserted in test/desktop/llama-config.test.js), so it cannot be reached by
package name either. model-fit is the only addon in the repo with a
private-surface relative require in an integration test, which is why the
framework's fixed shim list has never had to cover it.

Move the two raw-fitter cases into test/integration/fit-internal.test.js and
exclude that file from the generated mobile suite. No assertion changed and
nothing is skipped: both cases still run on desktop, since
test:integration:suite globs test/integration/*.test.js independently of the
exclusion list. They were never runnable on mobile in the first place.

The exclusion list is shared by the generator and the validator, which must
agree — validate-mobile-tests.js asserts exact set equality against
integration.auto.cjs, so changing one alone turns CI red. It is kept
dependency-free because the generator runs under `bare` and the validator under
`node`. integration.auto.cjs is unchanged by this commit, as expected.

Also declares bare-url, which test/mobile/integration-runtime.cjs requires and
nothing in this package listed. Not the cause of the failure above — sibling
addons place it inconsistently (ocr-ggml in dependencies, llm-llamacpp in
devDependencies) and both bundle fine, so the framework evidently provides it.
Declared as a devDependency since it is only used by test files.

Broken since 0.6.0 (975b36e, #3930). Pre-existing on main; this PR otherwise
touches one line of model-fit.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Rollout Phase B. v10297.1.0 is tagged and the registry PR is open, so the
overlay has done its job: consumers resolve qvac-fabric from the registry again.

Reverts all three overlay commits, newest first, since the pin moved twice
during validation:

  cb96599  overlay-validate the 7 fabric consumers against temp-10297
  8e9633d  repin validation overlay to the rebased fabric#214 head
  598bb0b  pin qvac-fabric to PR #214 via validation overlay

Completeness sweep against the merge base (5f212a1), all clean:

  - the revert is the exact inverse of the overlay: no diff against 598bb0b^
    across vcpkg-overlays and packages/*/vcpkg-configuration.json
  - vcpkg-overlays/ports/qvac-fabric is gone
  - no "overlay-ports" key remains in any vcpkg-configuration.json
  - no default-registry.baseline drift in any of the 7

vcpkg-overlays/triplets and vcpkg-overlays/toolchains are permanent repo
infrastructure and are deliberately untouched — only the ports/qvac-fabric
subtree was rollout scaffolding.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Rollout Phase B consumer side. Raises the version>= floor to 10297.1.0 in all 7
fabric consumers and releases each package.

  package              version>=            package
  embed-llamacpp       10297.0.0 -> .1.0    0.36.0 -> 0.37.0
  fabric               10297.0.0 -> .1.0    0.9.0  -> 0.10.0
  llm-llamacpp         10297.0.0 -> .1.0    0.47.0 -> 0.48.0
  model-fit            10297.0.0 -> .1.0    0.7.0  -> 0.8.0
  ocr-ggml             10297.0.0 -> .1.0    0.20.0 -> 0.21.0
  translation-nmtcpp   10297.0.0 -> .1.0    0.12.0 -> 0.13.0
  vla-ggml             10297.0.0 -> .1.0    0.23.0 -> 0.24.0

All seven are pre-1.0, so every one takes the minor path. translation-nmtcpp is
included in that: npm still shows latest 10.0.0 from its previous numbering, but
its main line was restarted at 0.x and origin/main is the authority.

v10297.1.0 spans 59 commits over 10297.0.0 — MTP drafter (#210), pipeline-parallel
ACCEL fix (#220), Metal optimisations (#216), Qwen4-Next (#218), fit host-memory
budgeting (#214) and a CUDA build-warning fix (#226).

llm-llamacpp's entry is dated rather than newly written: this PR already carried
the split-mode 'tensor' work under [Unreleased], and that work releases as 0.48.0.
model-fit's mobile-bundling fix does the same as 0.8.0. ocr-ggml and
translation-nmtcpp keep their empty [Unreleased] placeholders, with the dated
entry inserted below.

CI is expected to fail until the registry PR merges — version>= 10297.1.0 cannot
resolve before then. Retrigger afterwards.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

🧪 C++ Test Coverage Report

Coverage:

📊 Detailed Coverage
Filename                         Regions    Missed Regions     Cover   Functions  Missed Functions  Executed       Lines      Missed Lines     Cover    Branches   Missed Branches     Cover
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
NmtLazyInitializeBackend.cpp          99                20    79.80%          11                 1    90.91%         157                36    77.07%          66                21    68.18%
NmtLazyInitializeBackend.hpp           2                 0   100.00%           1                 0   100.00%           1                 0   100.00%           0                 0         -
TranslationModel.cpp                 296               168    43.24%          28                 8    71.43%         506               213    57.91%         181               122    32.60%
TranslationModel.hpp                   1                 0   100.00%           1                 0   100.00%           1                 0   100.00%           0                 0         -
nmt.cpp                               72                22    69.44%           9                 1    88.89%         137                28    79.56%          44                16    63.64%
nmt.hpp                               51                 4    92.16%          11                 2    81.82%          53                 4    92.45%          28                 0   100.00%
nmt_beam_search.cpp                  116                25    78.45%          10                 3    70.00%         254                32    87.40%          76                19    75.00%
nmt_graph_decoder.cpp                164                78    52.44%          15                 7    53.33%         540               161    70.19%         112                69    38.39%
nmt_graph_encoder.cpp                 54                13    75.93%           3                 0   100.00%         268                33    87.69%          37                16    56.76%
nmt_loader.cpp                       270                67    75.19%          14                 0   100.00%         774                97    87.47%         161                67    58.39%
nmt_state_backend.cpp                253                94    62.85%          21                 0   100.00%         489               128    73.82%         165                87    47.27%
nmt_tokenization.cpp                  88                21    76.14%           8                 0   100.00%         135                36    73.33%          61                26    57.38%
nmt_utils.cpp                        120                89    25.83%           8                 3    62.50%         180               134    25.56%          78                63    19.23%
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
TOTAL                               1586               601    62.11%         140                25    82.14%        3495               902    74.19%        1009               506    49.85%

gianni-cor
gianni-cor previously approved these changes Aug 31, 2026
Comment thread packages/llm-llamacpp/docs/multi-gpu.md Outdated
Comment thread packages/llm-llamacpp/addon/src/model-interface/LoadFitNormalization.cpp Outdated
Comment thread packages/llm-llamacpp/addon/src/model-interface/LoadFitNormalization.cpp Outdated
iancris and others added 2 commits August 31, 2026 19:55
…list

Three review comments from @jpgaribotti, all valid.

1. flash-attn / flash_attn dual-key could bypass the tensor-mode guard.

The guard stopped at the first key it found, so
{ "split-mode": "tensor", "flash-attn": "on", "flash_attn": "off" } passed it:
"flash-attn"=on is not falsey, and "flash_attn" was never examined. Both keys
then reach the configVector loop and fabric sees two contradictory
--flash-attn flags. ConfigMap is an unordered_map, so which one lands last —
and therefore wins in fabric's parser — is unspecified; the pair could disable
flash attention under tensor mode, exactly what the guard exists to prevent.

Now checks BOTH spellings and rejects if either is falsey. Pinned by
TensorSplitRejectsContradictoryFlashAttnKeys, which asserts both orderings so
the non-determinism cannot hide a regression.

2. The architecture denylist was stale against the fabric this PR ships.

It was verified by hand against v10297.0.0 (30 entries). This PR bumps to
10297.1.0, where llm_arch_supports_sm_tensor has 27: deepseek4, qwen35 and
qwen35moe gained tensor-split support and were removed. Keeping them here
rejected three architectures fabric accepts — an over-broad rejection
introduced by the bump itself.

Removed them, re-pinned the comment to v10297.1.0 (27 entries), and moved all
three into the positive assertions in TensorSplitArchDenylistCoversFabric so
re-adding them fails. The natural mistake is to re-add: their siblings
deepseek2/deepseek32 and qwen3next are still unsupported.

The comment now says explicitly that a denylist drifts in both directions and
must be re-derived, not only appended to.

3. Docs and CHANGELOG still described the description-based dedupe this PR
   already rejected.

Device enumeration dedupes on props.device_id (PCI bus id); the published
wording still said "deduplicated by device description", which is the 2x
identical-card collapse the follow-up commit fixed. docs/multi-gpu.md and
CHANGELOG.md now say device_id and state why description is wrong. The same
two files also listed DeepSeek-V4 and Qwen3.5 as excluded, stale for the same
reason as (2); corrected alongside.

Verified: addon-test 229/229 across LoadFitNormalizationTest, LoadFitSnapshotTest,
TuneConfigMap* and *BackendSelection*; git-clang-format reports no changes.

The two comments from @gianni-cor were already addressed earlier in this PR
(fit_params override moved after arg parsing in 1a54941; addon flash-attn
typings added, SDK schema deferred).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Brings in 10 commits, two of which touch llm-llamacpp:

  979b2fd QVAC-23752 chore: bump llm-llamacpp to 0.48.0 (#4167)
  40b5858 QVAC-23752 feat[bc]: remove sliding-context support (#3938)

Resolutions:

1. packages/llm-llamacpp/package.json -> 0.49.0

   This is the resolution that matters, and git could not see it. Both sides
   independently bumped 0.47.0 -> 0.48.0, so the file auto-merged clean on
   identical content — but main's 0.48.0 is a DIFFERENT release (#4167, the
   sliding-context removal), already on main. Shipping our fabric bump as
   0.48.0 would publish a second, conflicting 0.48.0. Ours moves to 0.49.0.

   The other six consumers do not collide: each is exactly one minor ahead of
   main (embed 0.37.0, fabric 0.10.0, model-fit 0.8.0, ocr-ggml 0.21.0,
   translation-nmtcpp 0.13.0, vla-ggml 0.24.0), so they are unchanged.

2. packages/llm-llamacpp/CHANGELOG.md — the only textual conflict.

   Kept both entries. Ours is renumbered to [0.49.0] - 2026-08-31 and sits
   above main's [0.48.0] - 2026-08-31, which is preserved verbatim.

Everything else auto-merged, including LoadFitNormalization.cpp/.hpp, which
both sides edited — main removed sliding-context handling, this branch added
the tensor-mode guards.

Verified after the merge:
  - addon-test 229/229 across LoadFitNormalizationTest, LoadFitSnapshotTest,
    TuneConfigMap* and *BackendSelection*
  - typecheck, test:types:consumer, git-clang-format all clean
  - generated wrappers in sync: tsc produced no diff beyond the merge

The 155 failures in the full addon-test run are pre-existing and local-only —
the model-backed suites need GGUFs that are absent here ("Llama-3.2-1B-Instruct
-Q4_0.gguf not found in models/unit-test"); CI's cpp-tests lane downloads them.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

🧪 C++ Test Coverage Report

Coverage:

📊 Detailed Coverage
Filename                         Regions    Missed Regions     Cover   Functions  Missed Functions  Executed       Lines      Missed Lines     Cover    Branches   Missed Branches     Cover
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
NmtLazyInitializeBackend.cpp          99                20    79.80%          11                 1    90.91%         157                36    77.07%          66                21    68.18%
NmtLazyInitializeBackend.hpp           2                 0   100.00%           1                 0   100.00%           1                 0   100.00%           0                 0         -
TranslationModel.cpp                 296               168    43.24%          28                 8    71.43%         506               213    57.91%         181               122    32.60%
TranslationModel.hpp                   1                 0   100.00%           1                 0   100.00%           1                 0   100.00%           0                 0         -
nmt.cpp                               72                22    69.44%           9                 1    88.89%         137                28    79.56%          44                16    63.64%
nmt.hpp                               51                 4    92.16%          11                 2    81.82%          53                 4    92.45%          28                 0   100.00%
nmt_beam_search.cpp                  116                25    78.45%          10                 3    70.00%         254                32    87.40%          76                19    75.00%
nmt_graph_decoder.cpp                164                78    52.44%          15                 7    53.33%         540               161    70.19%         112                69    38.39%
nmt_graph_encoder.cpp                 54                13    75.93%           3                 0   100.00%         268                33    87.69%          37                16    56.76%
nmt_loader.cpp                       270                67    75.19%          14                 0   100.00%         774                97    87.47%         161                67    58.39%
nmt_state_backend.cpp                253                94    62.85%          21                 0   100.00%         489               128    73.82%         165                87    47.27%
nmt_tokenization.cpp                  88                21    76.14%           8                 0   100.00%         135                36    73.33%          61                26    57.38%
nmt_utils.cpp                        120                89    25.83%           8                 3    62.50%         180               134    25.56%          78                63    19.23%
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
TOTAL                               1586               601    62.11%         140                25    82.14%        3495               902    74.19%        1009               506    49.85%

…297 @ 9d181fe64)

*** DO NOT MERGE THIS COMMIT — REVERT IT BEFORE THIS PR LANDS. ***

The PR itself is meant to merge; only this commit is throwaway. It pins all
seven fabric consumers at an unpublished, un-tagged branch head so CI can
validate them against it. Merging it would make the repo depend on a local
overlay directory and a floating commit that no registry entry describes.

This is a SECOND, INDEPENDENT overlay generation. 314c362 already reverted
the first three (598bb0b, 8e9633d, cb96599) from the 10297.1.0 round.
That revert does NOT cover this commit — this one needs its own revert.

What it validates
-----------------
temp-10297 has moved five commits past v10297.1.0, to 9d181fe64. The diff
v10297.1.0...9d181fe64 touches eight files:

  Vulkan          ggml-vulkan.cpp, vulkan-shaders/topk_radix_select.comp (new),
                  vulkan-shaders-gen.cpp
  Qwen4-Next      src/models/qwen4exp.cpp, src/models/models.h,
                  src/llama-kv-cells.h            (upstream PR #229)
  Fused-op        src/llama-context.cpp — auto_fgdn / auto_flid default to false
  Tests           tests/test-backend-ops.cpp

No addon change accompanies this pin. src/llama-arch.cpp is NOT in that set,
so llm_arch_supports_sm_tensor is unchanged and the 27-entry denylist in
LoadFitNormalization.cpp stays correct. The llama-context.cpp change only
flips two fused-op autotune defaults; it does not touch SPLIT_MODE_TENSOR or
its flash-attention requirement.

Contents
--------
- vcpkg-overlays/ports/qvac-fabric/{portfile.cmake,vcpkg.json}, copied verbatim
  from the registry at origin/main, with exactly three edits: REF pinned to the
  literal commit instead of v${VERSION}, the matching archive SHA512, and the
  version set to 10297.1.1.
- "overlay-ports" added as the first key of the seven consumer
  vcpkg-configuration.json files.

Deliberately NOT changed: each consumer's default-registry.baseline (all seven
differ and none may move), and the "version>=" floors — 10297.1.1 already
satisfies the existing >= 10297.1.0, and raising floors is Phase B's job.

The distinctive 10297.1.1 version is what makes the pin falsifiable: an install
log must show the port resolving out of vcpkg-overlays/ and then

  Building qvac-fabric[...]@10297.1.1

A "Restored N package(s)" line alone does not prove this ref was compiled.

Rollout-Overlay: qvac-fabric 10297.1.1 ref=temp-10297 sha=9d181fe643481d9a1cdf241871fe5935ae407ebe

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

🧪 C++ Test Coverage Report

Coverage:

📊 Detailed Coverage
Filename                         Regions    Missed Regions     Cover   Functions  Missed Functions  Executed       Lines      Missed Lines     Cover    Branches   Missed Branches     Cover
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
NmtLazyInitializeBackend.cpp          99                20    79.80%          11                 1    90.91%         157                36    77.07%          66                21    68.18%
NmtLazyInitializeBackend.hpp           2                 0   100.00%           1                 0   100.00%           1                 0   100.00%           0                 0         -
TranslationModel.cpp                 296               168    43.24%          28                 8    71.43%         506               213    57.91%         181               122    32.60%
TranslationModel.hpp                   1                 0   100.00%           1                 0   100.00%           1                 0   100.00%           0                 0         -
nmt.cpp                               72                22    69.44%           9                 1    88.89%         137                28    79.56%          44                16    63.64%
nmt.hpp                               51                 4    92.16%          11                 2    81.82%          53                 4    92.45%          28                 0   100.00%
nmt_beam_search.cpp                  116                25    78.45%          10                 3    70.00%         254                32    87.40%          76                19    75.00%
nmt_graph_decoder.cpp                164                78    52.44%          15                 7    53.33%         540               161    70.19%         112                69    38.39%
nmt_graph_encoder.cpp                 54                13    75.93%           3                 0   100.00%         268                33    87.69%          37                16    56.76%
nmt_loader.cpp                       270                67    75.19%          14                 0   100.00%         774                97    87.47%         161                67    58.39%
nmt_state_backend.cpp                253                94    62.85%          21                 0   100.00%         489               128    73.82%         165                87    47.27%
nmt_tokenization.cpp                  88                21    76.14%           8                 0   100.00%         135                36    73.33%          61                26    57.38%
nmt_utils.cpp                        120                89    25.83%           8                 3    62.50%         180               134    25.56%          78                63    19.23%
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
TOTAL                               1586               601    62.11%         140                25    82.14%        3495               902    74.19%        1009               506    49.85%

Reverts cab43ac, the temporary overlay that pinned the 7 fabric consumers to
temp-10297 @ 9d181fe64 for Phase A validation. That validation is complete and
green on all 7, so the scaffolding comes off.

qvac-fabric 10297.1.1 is now tagged (v10297.1.1 at the same commit) and headed
for the registry, so the next commit raises the consumer floors to it and the
port resolves from the registry again rather than from a local directory.

Verified byte-exact against the pre-overlay tree:
  git diff cab43ac^ -- vcpkg-overlays "packages/*/vcpkg-configuration.json"
is empty, no "overlay-ports" key remains anywhere, and no
default-registry.baseline moved. vcpkg-overlays/{triplets,toolchains} are
permanent infrastructure and are untouched — only ports/qvac-fabric was
scaffolding.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Raises every consumer's "version>=" floor from 10297.1.0 to 10297.1.1, now that
v10297.1.1 is tagged at temp-10297 HEAD (9d181fe64) and headed for the registry
in qvac-registry-vcpkg#343.

Five fabric commits over 10297.1.0:
  - Vulkan: ggml-vulkan.cpp, new vulkan-shaders/topk_radix_select.comp,
    vulkan-shaders-gen.cpp
  - Qwen4-Next: src/models/qwen4exp.cpp, src/models/models.h,
    src/llama-kv-cells.h
  - src/llama-context.cpp: auto_fgdn / auto_flid now default to false
  - tests/test-backend-ops.cpp

No package.json bump. All 7 packages are already one minor ahead of origin/main
on this branch from the 10297.1.0 round and none of those releases has shipped,
so the fabric line folds into the existing unreleased entry for each rather than
adding a second bump. Double-bumping would ship a wrong number and collide with
main at merge time.

The three llm-llamacpp version pins that are "as of" snapshots move to
v10297.1.1: the denylist comment in LoadFitNormalization.cpp, the matching
comment in test_load_fit_normalization.cpp, and the excluded-architecture
sentence in docs/multi-gpu.md. The list itself is unchanged and still 27
entries -- v10297.1.0...v10297.1.1 does not touch src/llama-arch.cpp, so
llm_arch_supports_sm_tensor is identical. The historical statements (which
architectures changed at v10297.0.0 -> v10297.1.0) are deliberately left
pinned to those versions.

Validated before the tag was cut: all 7 consumers green against this exact
fabric commit via the overlay pin that the preceding commit reverts.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

🧪 C++ Test Coverage Report

Coverage:

📊 Detailed Coverage
Filename                         Regions    Missed Regions     Cover   Functions  Missed Functions  Executed       Lines      Missed Lines     Cover    Branches   Missed Branches     Cover
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
NmtLazyInitializeBackend.cpp          99                20    79.80%          11                 1    90.91%         157                36    77.07%          66                21    68.18%
NmtLazyInitializeBackend.hpp           2                 0   100.00%           1                 0   100.00%           1                 0   100.00%           0                 0         -
TranslationModel.cpp                 296               168    43.24%          28                 8    71.43%         506               213    57.91%         181               122    32.60%
TranslationModel.hpp                   1                 0   100.00%           1                 0   100.00%           1                 0   100.00%           0                 0         -
nmt.cpp                               72                22    69.44%           9                 1    88.89%         137                28    79.56%          44                16    63.64%
nmt.hpp                               51                 4    92.16%          11                 2    81.82%          53                 4    92.45%          28                 0   100.00%
nmt_beam_search.cpp                  116                25    78.45%          10                 3    70.00%         254                32    87.40%          76                19    75.00%
nmt_graph_decoder.cpp                164                78    52.44%          15                 7    53.33%         540               161    70.19%         112                69    38.39%
nmt_graph_encoder.cpp                 54                13    75.93%           3                 0   100.00%         268                33    87.69%          37                16    56.76%
nmt_loader.cpp                       270                67    75.19%          14                 0   100.00%         774                97    87.47%         161                67    58.39%
nmt_state_backend.cpp                253                94    62.85%          21                 0   100.00%         489               128    73.82%         165                87    47.27%
nmt_tokenization.cpp                  88                21    76.14%           8                 0   100.00%         135                36    73.33%          61                26    57.38%
nmt_utils.cpp                        120                89    25.83%           8                 3    62.50%         180               134    25.56%          78                63    19.23%
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
TOTAL                               1586               601    62.11%         140                25    82.14%        3495               902    74.19%        1009               506    49.85%

@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

🧪 C++ Test Coverage Report

Coverage:

📊 Detailed Coverage
Filename                         Regions    Missed Regions     Cover   Functions  Missed Functions  Executed       Lines      Missed Lines     Cover    Branches   Missed Branches     Cover
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
NmtLazyInitializeBackend.cpp          99                20    79.80%          11                 1    90.91%         157                36    77.07%          66                21    68.18%
NmtLazyInitializeBackend.hpp           2                 0   100.00%           1                 0   100.00%           1                 0   100.00%           0                 0         -
TranslationModel.cpp                 296               168    43.24%          28                 8    71.43%         506               213    57.91%         181               122    32.60%
TranslationModel.hpp                   1                 0   100.00%           1                 0   100.00%           1                 0   100.00%           0                 0         -
nmt.cpp                               72                22    69.44%           9                 1    88.89%         137                28    79.56%          44                16    63.64%
nmt.hpp                               51                 4    92.16%          11                 2    81.82%          53                 4    92.45%          28                 0   100.00%
nmt_beam_search.cpp                  116                25    78.45%          10                 3    70.00%         254                32    87.40%          76                19    75.00%
nmt_graph_decoder.cpp                164                78    52.44%          15                 7    53.33%         540               161    70.19%         112                69    38.39%
nmt_graph_encoder.cpp                 54                13    75.93%           3                 0   100.00%         268                33    87.69%          37                16    56.76%
nmt_loader.cpp                       270                67    75.19%          14                 0   100.00%         774                97    87.47%         161                67    58.39%
nmt_state_backend.cpp                253                94    62.85%          21                 0   100.00%         489               128    73.82%         165                87    47.27%
nmt_tokenization.cpp                  88                21    76.14%           8                 0   100.00%         135                36    73.33%          61                26    57.38%
nmt_utils.cpp                        120                89    25.83%           8                 3    62.50%         180               134    25.56%          78                63    19.23%
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
TOTAL                               1586               601    62.11%         140                25    82.14%        3495               902    74.19%        1009               506    49.85%

tobi-legan
tobi-legan previously approved these changes Sep 1, 2026
jpgaribotti
jpgaribotti previously approved these changes Sep 1, 2026
iancris and others added 2 commits September 1, 2026 21:36
Brings in 10 commits. One conflict, in packages/vla-ggml/vcpkg.json.

Resolution: take main's side and drop the qvac-fabric dependency entirely.

  #3998 migrated vla-ggml off the vcpkg qvac-fabric port and onto the shared
  npm runtime (@qvac/fabric ^0.9.0 in package.json). This branch had bumped
  that same dependency's "version>=" floor to 10297.1.1, so git saw a
  modify/delete on the surrounding block.

  vla-ggml is no longer a vcpkg fabric consumer, so there is no floor to
  raise. main's .github/fabric-consumers.json is the authority and now lists
  vla-ggml under "npm_runtime" beside classification-ggml. The resolved file
  is byte-identical to origin/main.

The other six consumers are untouched by main and keep their 10297.1.1
floors. No package.json version collision this time: all seven remain exactly
one minor ahead of origin/main.

Deliberately NOT changed: vla-ggml's "@qvac/fabric": "^0.9.0". Bumping it to
^0.10.0 is not part of a fabric rollout -- classification-ggml sits at ^0.8.0
against a published fabric 0.9.0, so these npm-runtime consumers are not kept
in lockstep with fabric releases.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
vla-ggml is no longer a vcpkg qvac-fabric consumer. #3998 migrated it to the
shared npm runtime (@qvac/fabric), and main's .github/fabric-consumers.json
now lists it under "npm_runtime" beside classification-ggml. The preceding
merge resolved its vcpkg.json by dropping the qvac-fabric dependency.

So the two release artifacts this branch still carried for vla were wrong:

  - CHANGELOG [0.24.0] claimed `qvac-fabric` bumped 10297.0.0 -> 10297.1.1.
    That dependency does not exist for this package any more, so the entry
    describes something that cannot happen.

  - package.json 0.23.0 -> 0.24.0 would publish a release whose only stated
    change is that false entry.

Both reverted. packages/vla-ggml is now byte-identical to origin/main, and
this PR no longer touches it at all.

Note what this deliberately does NOT do: main landed #3998 with no changelog
entry and no version bump, so the migration sits unreleased on 0.23.0.
Bumping vla here would have published someone else's unreleased feature under
a changelog entry invented by this PR. Releasing that migration belongs to
whoever owns #3998.

Release blast radius drops from 7 packages to 6: embed-llamacpp 0.37.0,
fabric 0.10.0, llm-llamacpp 0.49.0, model-fit 0.8.0, ocr-ggml 0.21.0,
translation-nmtcpp 0.13.0.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@iancris

iancris commented Sep 1, 2026

Copy link
Copy Markdown
Contributor Author

/review

@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

🧪 C++ Test Coverage Report

Coverage:

📊 Detailed Coverage
Filename                         Regions    Missed Regions     Cover   Functions  Missed Functions  Executed       Lines      Missed Lines     Cover    Branches   Missed Branches     Cover
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
NmtLazyInitializeBackend.cpp          99                20    79.80%          11                 1    90.91%         157                36    77.07%          66                21    68.18%
NmtLazyInitializeBackend.hpp           2                 0   100.00%           1                 0   100.00%           1                 0   100.00%           0                 0         -
TranslationModel.cpp                 296               168    43.24%          28                 8    71.43%         506               213    57.91%         181               122    32.60%
TranslationModel.hpp                   1                 0   100.00%           1                 0   100.00%           1                 0   100.00%           0                 0         -
nmt.cpp                               72                22    69.44%           9                 1    88.89%         137                28    79.56%          44                16    63.64%
nmt.hpp                               51                 4    92.16%          11                 2    81.82%          53                 4    92.45%          28                 0   100.00%
nmt_beam_search.cpp                  116                25    78.45%          10                 3    70.00%         254                32    87.40%          76                19    75.00%
nmt_graph_decoder.cpp                164                78    52.44%          15                 7    53.33%         540               161    70.19%         112                69    38.39%
nmt_graph_encoder.cpp                 54                13    75.93%           3                 0   100.00%         268                33    87.69%          37                16    56.76%
nmt_loader.cpp                       270                67    75.19%          14                 0   100.00%         774                97    87.47%         161                67    58.39%
nmt_state_backend.cpp                253                94    62.85%          21                 0   100.00%         489               128    73.82%         165                87    47.27%
nmt_tokenization.cpp                  88                21    76.14%           8                 0   100.00%         135                36    73.33%          61                26    57.38%
nmt_utils.cpp                        120                89    25.83%           8                 3    62.50%         180               134    25.56%          78                63    19.23%
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
TOTAL                               1586               601    62.11%         140                25    82.14%        3495               902    74.19%        1009               506    49.85%

This branch was previously deployed

1 inactive deployment
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

run-coload-tests CI: run multi-addon co-load smoke (requires verified) run-cpp-addon-tests CI: run C++ addon tests (requires verified) run-desktop-addon-tests CI: run desktop integration tests (requires verified)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants