Repository navigation
fix: v0.8.0 release blockers found in live model checks and the standards re-check - #81
Conversation
…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>
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars.
|
[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. FindingsSummaryThis PR fixes release attribution, runtime installation, serving readiness, import checks, and the category picker.
Reviews (1) · Last reviewed commit: "fix(desktop): save a chosen category on ..." · Reviewed by Greptile |
| let tracked_tag = tracker.get_current_state().and_then(|state| state.tag); | ||
| if tracked_tag.as_deref() != Some(tag.as_str()) { |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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]); |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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.
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>
…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>
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 Layadecisionoperations (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.txtbut 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.
--alias, but dedicated readiness required the file path, so every projector model failed on a dedicated profile.dimensionswere 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