Skip to content

fix: v0.8.0 release blockers found in live model checks and the standards re-check - #81

Merged
MrScripty merged 10 commits into
mainfrom
fix/v080-release-blockers
Nov 4, 2026
Merged

MrScripty merged 10 commits into
mainfrom
fix/v080-release-blockers

Conversation

@MrScripty

@MrScripty MrScripty commented Nov 4, 2026 •

Copy link
Copy Markdown
Owner

Stacked on #80. Fixes found by running Kev, Laya and EmbeddingGemma 2 through Pumas on the owner library (llama.cpp b12099 CUDA 12, RTX 5090), and by re-checking the standards-remediation findings against 0.8.0.

Live result (after these fixes): EmbeddingGemma 2 text and image embeddings via /v1/model-operations (red image ↔ "red" text cosine 0.798 vs "blue" 0.699; blue ↔ "blue" 0.795 vs "red" 0.721); Kev and Laya decision operations (Kev 0.2 s). Before these fixes none of EmbeddingGemma 2's paths worked and llama.cpp CUDA builds could not be installed.

Licenses (torch-native-e2e failing on all OSes). The managed CPython 3.14.7 archives declare LICENSE.zstd.txt / LICENSE.zlib-ng.txt but omit them. The texts now come byte-exact from the exact source archives python-build-standalone 20260901 pins (digest-verified), with provenance records, accepted only for the declared path, target and release, and never presented as archive members. 0.8.0 notices and inventories regenerated.

llama.cpp install. Linux CUDA builds were listed but could not be installed. A failure before progress tracking was silent, and any install failure failed shutdown, which retains library ownership and blocked reopening the library. Effect-free failures are now outcomes, visible in progress.

Serving and operations.

  • Aliases were capped at 128 characters while llama.cpp uses the library ID as alias (EmbeddingGemma 2's is 147); the bound is now the 256 bytes the operations contract accepts.
  • Projector models launch with --alias, but dedicated readiness required the file path, so every projector model failed on a dedicated profile.
  • Image embeddings were advertised as available but always 503: the vision guard required a generation lifetime the embeddings route never has.
  • Embedding batches with dimensions were refused as invalid provider results (coherence compared raw against truncated widths).

Standards re-check. Startup no longer guesses a Hugging Face repo for partial files and downloads into it; import list params refuse malformed input instead of reporting success with nothing imported; rule-table rebuilds run in one savepoint.

Desktop. The "Used as" picker saves on Apply (not on every arrow-key step), keeps focus, re-reads the backend's result, and checks its category list against the generated contract type.

Tests. Full Rust suite 3166/3168 (the two failures are timing-dependent and pass 3/3 alone; unrelated areas), clippy clean, frontend 949/950 (1 skipped), release scripts (Node 41/41, Python 9/9, acceptance self-test 64), attribution default and s3. New tests fail without their fixes.

🤖 Generated with Claude Code

MrScripty and others added 5 commits November 4, 2026 01:49
…e omits

python-build-standalone 20260901's PYTHON.json declares licenses/LICENSE.zstd.txt
(all three targets) and licenses/LICENSE.zlib-ng.txt (Linux, macOS), but the
full archives do not contain them, so torch-native-e2e failed on every OS.

The texts are taken byte-exact from the exact source archives that release
pins (python/cpython-source-deps zstd-1.5.7 and zlib-ng-2.2.4, sha256 and size
verified), kept under scripts/release/licenses/managed-python-supplemental/
with a provenance record each, and never presented as archive members.

- The acceptance collector accepts a missing declared path only with a
  matching record for that target and release whose hash verifies.
- generate-notices and check-attribution include and verify them; the 0.8.0
  and 0.8.0-s3 notices and inventories are regenerated.
- .gitattributes keeps the texts byte-exact on Windows checkouts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rly failures

- Pumas lists llama.cpp CUDA 12/13 builds for Linux, but the installer could
  not select them: its Linux GPU preference had no CUDA entry and its CPU
  matcher excludes CUDA names. A runtime variant (`b12099+cuda-12`) carries
  only the archive the user chose, so the installer now installs that one.
- A failure before an install started tracking progress (release lookup,
  asset selection) was never logged or shown: progress stayed empty. It is
  now logged and visible in installation progress.
- Each installer starts tracking before its first effect (llama.cpp now
  starts it before preparing its workspace). A failure before that point
  created nothing, so it no longer fails shutdown; a failed shutdown retains
  library ownership, which had blocked reopening the library.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d profiles

- Served-model aliases were capped at 128 characters while llama.cpp serving
  defaults the alias to the library ID, and downloaded IDs often run past
  that (EmbeddingGemma 2's is 147), so those models could not be served. The
  bound is now the 256 bytes the model-operations contract accepts for
  `model`, one shared constant.
- A model with a projector launches with `--alias <library ID>`, but the
  dedicated readiness check required llama.cpp to report the file path, so
  every projector model (EmbeddingGemma 2 image embeddings, vision models)
  failed to become ready on a dedicated profile. Readiness accepts either
  identity the launch owns.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…and partial rebuilds

Found re-checking the standards remediation findings against 0.8.0:

- Startup recovery guessed a Hugging Face repository (`family/folder`) for
  any folder with partial files and no download record, then started a
  network download into it with no user action. Only a repository recorded
  in the `.pumas_download` marker now resumes; others are logged and left.
  Inspection failures are logged instead of dropped.
- import_batch, classify_model_import_paths and detect_sharded_sets turned a
  missing or malformed list into an empty one and reported success. They now
  refuse with the reason.
- Rebuilding the model-type rule tables (run when categories are added, as
  in 0.8.0) was four separate statements; an interruption after the rename
  stranded user rules. Each rebuild now runs in one savepoint.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ckend saved

- Picking an option no longer saves it: keyboard users stepping through the
  options saved a category on every step, and the select was disabled (and
  lost focus) while saving. An Apply button saves; the select stays usable.
- The metadata window re-reads the category, its source, task and modalities
  from the backend after a save instead of guessing them.
- "Detected: <chosen category>" misreported detection; the option is now
  "Detect automatically", and the hint names the current state and is the
  select's description. Saves are announced.
- The choosable category list is checked at compile time against the
  backend's generated category type.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor

Important

  • Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: bcac6500-966f-4615-89dc-d538c940654e
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

@greptile-apps

greptile-apps Bot commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerView in GreptileConfidence Score: 4/5

[Medium impact] The changes reach several release and model workflows, but stay within those bounded areas.

Fix same-tag install failure tracking before merging; quick retries can still block library shutdown.

Findings

  1. P1 Quick retries still block shutdown ▶
  2. P2 New category choices disappear ▶

Summary

This PR fixes release attribution, runtime installation, serving readiness, import checks, and the category picker.

  • Release records include verified license texts missing from managed Python archives.
  • Linux CUDA installs are selectable and early failures show in progress.
  • llama.cpp readiness recognizes long IDs and projector aliases.
  • Partial downloads resume only with a recorded repository ID.
  • Model import calls reject missing or malformed list parameters.
  • Governance rule-table rebuilds keep each replacement together.
  • The model category picker saves only when a person presses Apply.

Reviews (1) · Last reviewed commit: "fix(desktop): save a chosen category on ..." · Reviewed by Greptile

Comment on lines +1287 to +1288
let tracked_tag = tracker.get_current_state().and_then(|state| state.tag);
if tracked_tag.as_deref() != Some(tag.as_str()) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P1 Quick retries still block shutdown

Retrying the same failed install before progress clears can still block shutdown. The first failure before tracking creates completed progress for that tag. If the retry also fails before tracking, this comparison mistakes the previous attempt's tag for progress from the retry. It retains a shutdown failure even though neither attempt created an installation workspace.

Clear completed progress when admitting an attempt, or track whether this attempt started installation work.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Fixed in d837bf3: an admitted attempt now clears finished progress before doing anything, so the failure check only sees progress this attempt started. The regression test retries the same tag immediately (it fails without the fix).

const chosen = resolutionSource === USER_CATEGORY_SOURCE;
const [saved, setSaved] = useState<string | null>(null);

useEffect(() => setPending(current), [current]);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 New category choices disappear

A delayed category reload can discard a newer choice. After Apply, the select remains editable and saving ends without waiting for refreshCategoryFields. If the user picks another category before that read finishes, the returned category changes current, and this effect replaces the newer pending choice with the earlier saved value.

Preserve edits made after Apply when syncing the saved result, and add a delayed-read test.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Fixed in f648883: the picker follows the re-read category only while it still shows the previous or applied value, so a newer pick is kept. Added a delayed-read test (it fails on the old component) plus one for the normal follow-the-backend case.

MrScripty and others added 3 commits November 4, 2026 02:23
Typed image embeddings (`multimodal_embedding`, e.g. EmbeddingGemma 2) were
advertised as available but every request returned 503. The gateway's vision
guard raced its readiness probe against the generation lifetime and refused
when there was none, and the embeddings route is not a generation route, so
it never has one. The bounded probe now runs directly on such routes.

The refusal, when the guard does fail, says why instead of the generic
"currently unavailable" sentence. A gateway test sends an image embedding
through the public endpoint against a synthetic llama.cpp backend; it fails
without this change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…sted dimensions

With `dimensions` set, the batch coherence check compared each provider
vector against the previous vector's truncated width, so any batch of two or
more (text or image) was refused as an invalid provider result. Coherence
now compares the provider's own widths before truncation.

Found by a live EmbeddingGemma 2 run: one item with dimensions and batches
without dimensions worked; batches with dimensions returned 502.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Base automatically changed from docs/v080-cleanup to main November 4, 2026 18:01
MrScripty and others added 2 commits November 4, 2026 11:08
…tdown

A retry admitted before the previous attempt's progress was cleaned up saw
that attempt's finished progress for the same tag, took it for its own and
retained a shutdown failure although nothing was created. Clear finished
progress when an attempt is admitted. The regression test now retries at once.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ding

The picker followed every metadata re-read, so a pick made after Apply but
before the re-read arrived was replaced by the earlier saved value. Follow the
saved category only while the picker still shows the previous or applied one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MrScripty
MrScripty merged commit 0f3b3f3 into main Nov 4, 2026
12 of 20 checks passed
@MrScripty
MrScripty deleted the fix/v080-release-blockers branch November 4, 2026 18:18
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