Skip to content

Release 0.12.0 - #845

Merged
dkackman merged 57 commits into
masterfrom
develop
Oct 11, 2026
Merged

dkackman merged 57 commits into
masterfrom
develop

Conversation

@dkackman

Copy link
Copy Markdown
Owner

develop -> master for 0.12.0: the quantized-component cache (`DW_QUANTIZED_CACHE=1`), the disk-cache registry with its Caches panel, transcription hallucination guards for music-video cuts, and the gallery envelope's `interval_seconds`. The drafted notes are the 0.12.0 section of docs/RELEASING.md.

Preflight on this Mac: ruff clean, ratchet green (modules 208, patch targets 326, both raised in db0f8b3), 13887 unit tests, 5 MPS integration tests, 505 vitest, 109 Playwright e2e. The two develop CI reds since #834 (ServerPage over the UI size ceiling, a flaky traversal test) are fixed in 5c64df3 and b02cf89.

🤖 Generated with Claude Code

dkackman and others added 30 commits October 10, 2026 19:52
…kflow runs more steps or frames than the template

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…nds (min 0.05, capped at 2400 bins)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…long transcript chunks and warn in plan_cuts

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…port cycle; loudest-window measure lives in dsp

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…pect; plan_cuts leaves them out and warns once per run

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d SDNQ loads on lem

Stage 0 of #815: standalone operator script (no dw engine imports) that
times on-the-fly SDNQ loads against save_sdnq_model/load_sdnq_model for the
H3 and LTX-2.5 default configs, page cache warm and cold (per-file
posix_fadvise DONTNEED), and prints the table with the H3 gate verdict.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… on disk behind DW_QUANTIZED_CACHE=1

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…'s own process, download only what a load reads, fsync before eviction and read every page inside the timing

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…-aa0c30a7eac0e5702' into feat/815-A-quantized-cache
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The architecture review bounced the hand-written hub-cache layout
(models-- folder naming, refs/ read, snapshots/ joins). Commit resolution
and the completeness check now go through try_to_load_from_cache; dw keeps
only which files a component needs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…TE /api/caches, get_server_info caches

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

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
List dw's disk caches (GET /api/caches) after Directories: root, size,
files, last used, enabled and the volume's free/total bar. A Clear button
per cache asks through confirmDialog quoting cost_of_clearing (triton's
carries the shared-cache warning), is disabled with not_clearable_reason
when the root isn't dw's, and shows the server's text on a refusal (409).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…snapshot in its repo folder; name why a miss missed

- snapshot_complete checks containment against the repo's own folder
  (symlinks resolved), so a repo folder linked to another disk is found
- save_commit is lookup_commit's commit, with a recorded commit required
  to agree: an entry is never written that an identical lookup can't read
- a miss carries a reason: no_entry, incomplete_snapshot or
  load_failed: <type>; a failing entry raises after it is deleted

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
formatBytes floors at 1 KB, so an empty inductor cache read
'1 KB, 0 files' in the confirm while the table showed 0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…dnq's load rewrites it

SDNQConfig.to_dict() shares the config's own lists, and sdnq appends the
modules it leaves unquantized to modules_to_not_convert during the load.
The key read before the load therefore changed under it: the save keyed
the post-load config, so no later lookup matched, and the appended list
could differ by card.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…n the worker's hash order

SDNQConfig dedupes modules_to_not_convert, modules_to_not_use_matmul and
modules_dtype_dict's lists through list(set(...)), so their order follows
each process's string-hash seed. Every worker held H3's nine-name
transformer list in its own order, and so keyed the same config
differently per card. The key now sorts them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…peated shot name is unambiguous

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
dkackman and others added 27 commits October 11, 2026 14:12
…t load path (LTX-2.5)

A component an SDNQ config quantizes in load_component's from_pretrained
branch is looked up with stage A's key, snapshot rule, free-space floor and
atomic save. A hit skips the load and download_watch, and is placed on the
config's return_device.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…sor names, so Gemma 4 loads back

transformers 5's save_pretrained writes a model in its checkpoint's original
layout (the weight conversion mapping run backwards), and load_sdnq_model
loads names as they are. LTX-2.5's Gemma 4 text encoder has a mapping for its
vision tower, so every saved entry failed to load with a RuntimeError and was
re-quantized and re-saved on every run. Save with save_original_format=False
where save_pretrained takes it. A load_failed reason now carries the first line
of the error's message.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#827)

LTX-2.5's transformer/ holds a 4-shard and an 8-shard set; the index
names the 4. Asking snapshot_download for every *.safetensors under
local_files_only demanded the unused set and raised
IncompleteSnapshotError on a snapshot complete for what a load reads.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…on a built UI

With ui/dist present, create_app mounts the UI's StaticFiles at /, which
takes a path no route matches and answers DELETE with 405; without it
the same request is 404. The test asserted 404 and failed on any
checkout with a built UI (mini-ai returns 405 live). Route tests now
run without a UI unless they ask for one, and the traversal test pins
both outcomes, with nothing touched either way.

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

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
mini-ai supervises dw.serve with a KeepAlive LaunchDaemon
(system/com.local.dw). deploy.sh did not know, so each deploy stopped
the server and started a screen copy while launchd started its own; the
two raced for the port and the loser crash-looped - 9150 'address
already in use' errors in mini-ai's log. With the daemon loaded
(DW_LAUNCHD_LABEL, default com.local.dw), deploy now only stops the
server and waits for launchd's restart. Linux and boxes without the
daemon are unchanged.

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

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

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

The architecture review found the key pattern and the HF_HOME/dw-quantized
default defined in both modules. quantized_cache now exposes is_key() and
default_root(); disk_caches calls them, and delete_entry builds the path
through quantized_cache.entry_path.

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

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ipped, not fatal

sweep() and _entry_sizes() validate each child of the cache root against the
root. A symlinked entry pointing at another disk resolves outside it, and
validate_path refuses that with a PathTraversalError - a SecurityError, which
configure_at_startup's OSError catch did not cover, so dw.serve never started
while DW_QUANTIZED_CACHE=1. The child is now logged and left alone, the sweep
carries on, and startup also catches SecurityError.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…erval; interval_seconds has a ceiling

The 2400-bin cap added for fine intervals also applied at the default 1.0 s,
so a track over 40 minutes that master answered got a 422. The limit is now
the larger of the cap and the bins the default interval gives, so a request
is never refused for being no finer than the default.

interval_seconds had no upper bound: pydantic reads "inf" from a query string,
and 1e305 overflows the bin-sample product the same way, both a 500 instead of
the 422 the route promises. MAX_ENVELOPE_INTERVAL (3600 s) bounds it; NaN
fails the floor check.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…> 326

dw/quantized_cache.py, dw/disk_caches.py and dw/script_lines.py (#815, #828,
#822) are three new modules; script_lines replaces an import cycle. The patch
target is tests/test_quantized_cache.py's startup fixture.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… under the 600-line ceiling

ServerPage.svelte reached 725 lines with the #833 Caches panel and the UI
ratchet (files_over_size_ceiling 0 -> 1) has failed develop CI since.
The panel's state, handlers, template and the styles only it uses move
to ui/src/lib/CachesPanel.svelte; ServerPage renders it. No behaviour
change - the ServerPage tests cover the panel through the page as before.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ses, not an exact listing

test_traversal_name_touches_nothing compared tree(tmp_path) before and
after the request, but the server's own workspace lives under tmp_path
and adds files there (outputs/, the job history's -shm/-wal) on its own
schedule, so the test flaked on CI. It now plants the traversal target's
would-be victim, asserts it survives, and checks the parent gained
nothing lost rather than changed nothing.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@dkackman
dkackman merged commit 9eb535e into master Oct 11, 2026
14 of 16 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