Skip to content

release 0.16.0 - #1057

Merged
dkackman merged 137 commits into
masterfrom
develop
Oct 28, 2026
Merged

dkackman merged 137 commits into
masterfrom
develop

Conversation

@dkackman

Copy link
Copy Markdown
Owner

Summary

develop -> master for 0.16.0: 137 commits since v0.15.0. Notes are drafted in docs/RELEASING.md under 0.16.0 (paste into the release body after the tag publishes).

Headlines:

Verification

After merge

scripts/release.sh 0.16.0 --next 0.17.0-alpha.1
gh release edit v0.16.0 --notes-file <the 0.16.0 section>

Deploy needs a server restart (persistent worker) and a reinstall of scripts/dw-serve.service (RestartPreventExitStatus=2).

🤖 Generated with Claude Code

dkackman and others added 30 commits October 18, 2026 09:00
get_task's summary and the generate-speech template description named no
model beyond the Bark default, so a field agent concluded dw has no TTS
but Bark and ran Kokoro locally. Name Bark, MMS/VITS and SpeechT5 with the
voice control each takes in the docstring summary, the template
description and the lead of TASKS.md's Speech Generation section.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
forget_workspace retires every row to a '<name> (deleted)' workspace instead
of deleting unkept ones, so get_job / get_job_workflow still answer; unscoped
history listings skip retired rows.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…tch x width x height

Calibrated on an RTX 3090 with offload: model (15.8 GiB at 4x1344x768).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…t is unpriced

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…onse model

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…ntermediate when in intermediate/ or read by a later run

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…lder role, then rule 4, in dw/roles.py

Moves the fallback out of the gallery route into listed_role, the owner
the map names, so the listing and the metadata route agree. Updates the
roles docstring, the map row, and the role wording in the tool and API docs;
regenerates the OpenAPI document.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…fusal names output:<name> for an own output

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…output_reference and references.make_ref

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
… (patch-target ratchet)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…und beside the workflow, naming output:<name>

validate joined the bare name onto the workflow directory, which is
contained by construction, so it passed; the run's check_script reads
the raw string against the server's working directory and refuses it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…that resolves nowhere, hint only for own outputs

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…5 dB of the last word, so a score bed is not a clip

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…ls under their cap

SURFACE_BUDGET was a ratchet raised to each measurement plus <1 token, so
every docstring change paid for itself by trimming another tool's text, and
at least once the trim took a pointer agents needed (#574 re-broke #282).
It is now a fixed 16_000 with a stated policy: move narrative to a guide
and leave a pointer before raising it.

tests/test_guide_pointers.py checks that every guide pointer in the MCP
instructions, tool descriptions, skills and references opens a real section,
and that the tools pointing at a guide today keep their pointer.

The three skills within ~100 bytes of the 12 KiB cap move situational detail
into references, linked from SKILL.md with when to read them:
minimax-h3 staging rules, minimax-music3 memory check, series-episodes
cross-episode loudness.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…paint configuring templates/inpaint

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…ole, note, starred and version for the listing and the metadata route

gallery_metadata now reports starred.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…s from one (column, getter) table; parity test against the live Job

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…tion differs from the calibrated template

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…ct removal; removal and outpaint stay on templates/inpaint (FLUX.1 Fill)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…ory serves the same entries as a live job

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…history holds them

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…stereo spans of the vocal stem

Calibrated on two-minds Always On take A (AlwaysOnStems 494d1a7469b7):
chorus 1:19-1:34 windows corr -0.276..0.251, side/mid 0.609..1.682;
verse 1 corr 0.656..0.969, side/mid 0.016..0.208; verse 2 0.663..0.964,
0.018..0.208. Chosen: STACK_CORRELATION_MAX 0.45, STACK_SIDE_RATIO_MIN 0.4.
Intro hum (0:08-0:12) decorrelates like the chorus (corr -0.06..0.21) but sits
16.5 dB or more under the stem's level; STACK_LEVEL_BELOW_DB 14 excludes it.
Flags 1:19-1:34 and 1:59-2:09 (both choruses), nothing before 1:19.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… the separate_stems path; TASKS.md names the warning

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

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
dkackman and others added 29 commits October 26, 2026 18:04
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…st word is not clipped

ab163e4 shortened the trailing voiced block to keep the #970 tail rule
quiet, which ended the file 0.1 s after "echo" while still voiced, so
line_clipped_at_end (#953) fired. Silence to the end of shot B satisfies
both rules.

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

Builds the real H3 modular pipeline from tiny random-weight components on
CPU and compares a native run with a one-segment run_chain, default and
continuity guide: frames torch.equal, audio equal to the native prefix
(the chain trims codec padding by design).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…080p past a 24 GB card is refused at validate

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e cap, VRAM tile mode and guide section

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…graph swap in the Rule

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…cale-clip, estimate for restore-deblur/-decompression

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…s carry 24 fps; no per-tile decoding phase

- target_size_problems: the 16 px grid and 1920x1088 cap rule, shared by
  upscale_h3_latents' static_check (validate) and target_latent_size (run)
- run_tiled_refine returns videos as FrameList(fps=24), so pair_audio and the
  writer play them at H3's rate rather than 8 fps
- decoded_later(): a tile's denoise loop ending no longer emits 'decoding';
  the one canvas decode does
- guide: the 768p section names the 1920x1088 cap

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…1 frames (481 OOMs on 24 GB)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…use it; map row

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

resolve_device sends 'mps' to the CPU on a machine without it, so the
test failed on Linux CI ('cpu' == 'mps') and develop's CI had been red
since at least 1075788. Use the all_backends_available fixture the
placement tests already use, so the named device reaches the command
unchanged.

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

Dev-only transitive dependency of jsdom (vitest's DOM), so nothing that
ships was exposed. Lockfile-only: jsdom already allows ^8.11.2.

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

192557c let the named device reach the remover, but the image and mask
tensors then went to 'mps' too, and the CI runner's torch has no mps
build ('PyTorch is not linked with support for mps devices'). The test
checks the device the remover is loaded on, so keep the tensors on the
CPU in this test alone.

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

Job 16c15bbff9d9 (base -> up -> refine -> mux, base also feeding refine
and mux) drew its skipping edges straight through the boxes between, and
three labels landed on one spot. One line per producer/consumer pair now
carries every argument it feeds; an edge skipping a column runs in its own
lane above the boxes; ports spread along each box side; the column gap
widens to the longest adjacent label; labels draw last with a halo.

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

lem's `devices` setting names cuda:0,cuda:1; with one card out the startup
check refused (exit 2) and systemd's Restart=on-failure looped it. An absent
entry in a list of several is now dropped with a warning and the server
starts on the rest; a list with no card present, or a single absent card,
still refuses. The unit stops on exit 2 (RestartPreventExitStatus) since a
refused configuration cannot be fixed by restarting.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…refine-clip; skill 481 -> 401 frames

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
….5 + 64.16 B/voxel); agreement test allows a template-specific formula

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
… split three oversized modules, fix review findings

Ratchet: both baselines were red since 2026-10-20 with no named rise.
- import_cycles 1 -> 0: validate_weight_name moves to dw/security.py and
  the registry reaches image_utils' processor hook by registration
  (register_weights_fallback), so weights.py and registry.py no longer
  close the locations/registry/image_utils ring; HELD_LATENTS_OUTPUT moves
  beside its siblings in h3_rules.py so h3_hold/h3_hold_steps stay one-way.
- modules_over_size_ceiling 3 -> 0: dw/plan_downloads.py (download
  sources, out of plan.py 1,188 -> 869), dw/tasks/script_take.py (take
  side, out of script_check.py 1,141 -> 1,038), dw/pipeline_processors/
  mag_calibration.py (MagCache calibration, out of components.py
  1,101 -> 962).
- functions_over_150_lines 1 -> 0: script_check.check split into
  _line_pass/_line_entry/_shot_rules phases.
- complex_functions 3 -> 2: h3_rules._tile_problems split into four
  rule-family helpers (cc 20 -> 3).
- UI: FlowView.svelte 617 -> 420 with the layout in ui/src/lib/editor/
  flowLayout.ts (named functions under 60 lines / cc 10).
- Baseline raised for two counts only, as the rule requires naming:
  modules 220 -> 226 (h3_tiles, remove_object, weights from the range
  plus the three splits above) and test_dw_patch_targets 309 -> 316
  (the range's new task/engine tests; measured 316 before this pass).

Review findings:
- transformers no longer loads into the server's validate path: segment,
  audio_transcription, text_generation, background_remover and
  depth_estimator import it inside the function (module-level wrappers
  keep the tests' patch targets).
- H3 tiled refine encodes the held soundtrack once per refine: tile 0
  returns the encode and later tiles carry it (EncodedAudioReference).
- The write-only `kept` job_history column and mark_kept are retired
  (#944 retires every row); existing databases keep the physical column.
- gallery_metadata reads notes.json once (output_annotations returns
  run_note); _stamp_roles no longer reads notes it discards
  (with_run_state(note=False)).
- Jobs page filters follow the hash: navigating to the bare jobs route
  clears them.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…e URL asked for

SE-F036 could not tell a refused hop from an upstream error: a hop refused
by the scheme rule read only 'Invalid URL: URL scheme not allowed: file'.
_follow now wraps any hop refusal as "Refusing a redirect to '<target>'
(from '<url>'): <rule>". The per-hop re-check itself was already sound and
pinned; the suite's 403s were httpbin.org refusing internal targets on its
own. First-hop upstream statuses are reported unchanged. Pinned on the local
127.0.0.1 redirector in test_outbound.py; SECURITY docs state the shape.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… reports; guide's keep-the-544p recipe corrected

An H3 base step handed `videos` on as bare frame lists; only the tiled
refine wrapped its in FrameList(24). pair_audio on previous_result:
base.videos fell back to 8 fps, fit measured 124 frames as 15.5 s and
padded the 5.17 s track by 10.32 s, and result.fps re-timed the picture
afterwards - the guide recommended that knob, which runs too late.

- dw/output_extraction.py attach_video_frame_rate (from _run_once beside
  attach_audio_sample_rate) rates `videos` off the pipeline's own `fps`
  (MiniMaxH3ModularPipeline.fps = 24); dw/media_types.py rated_videos is the
  one helper, used by the tiled refine too. pair_audio_with_frames carries
  the frames' rate onto the AudioVideo.
- pair_audio's video_fps_defaulted warning and docs name the step's `fps`
  argument, not result.fps, as the remedy.
- Guide recipe drops result.fps; TASKS and the map row updated.
- Reproducer: test_modular_output_properties ...pairs_at_its_own_rate_with_
  no_padding; seam pinned by test_pipeline_components::TestVideoFrameRate.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@dkackman
dkackman merged commit f50056c into master Oct 28, 2026
13 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant