Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
137 commits
Select commit Hold shift + click to select a range
c2a2bb9
chore: open 0.16.0-alpha.1 on develop
dkackman Oct 18, 2026
b094a8a
docs(tasks): name generate_speech's TTS families where an agent looks
dkackman Oct 19, 2026
70e6aba
fix(server): #944 - a deleted workspace's job rows stay resolvable by id
dkackman Oct 19, 2026
47001f3
feat(catalog): #945 - models/z-image declares a vram_estimate over ba…
dkackman Oct 19, 2026
db1cd2a
fix(plan): #948 - a task-only workflow's unknown estimate names why i…
dkackman Oct 19, 2026
2ff8a66
fix(server): #948 - declare unpriced_reason in the plan estimate resp…
dkackman Oct 19, 2026
7c7f46a
fix(gallery): #928 - a file of a run with no recorded role lists as i…
dkackman Oct 19, 2026
cea2574
style: #928 - ruff format
dkackman Oct 19, 2026
a9aa90e
chore(api): #928 - regenerate the OpenAPI document
dkackman Oct 19, 2026
b3a16fa
fix(roles): #928 - a run that recorded no role takes its file's subfo…
dkackman Oct 19, 2026
e428f63
fix(locations): #951 - validate checks a bare relative media name; re…
dkackman Oct 19, 2026
5c15481
fix(locations): #951 - own-output hint resolves through runs.resolve_…
dkackman Oct 19, 2026
015ddd2
test: #951 - drop the media_roots patch from the own-output hint test…
dkackman Oct 19, 2026
19773c4
fix(locations): #951 - validate refuses a bare own-output name not fo…
dkackman Oct 20, 2026
9d483ff
fix(locations): #952 - validate refuses any bare relative media name …
dkackman Oct 20, 2026
19474c0
fix(check-script): #953 - line_clipped_at_end needs the tail within 1…
dkackman Oct 20, 2026
48cfa71
test(mcp): fixed surface ceiling, guide-pointer resolution test, skil…
dkackman Oct 20, 2026
c08ba4f
feat(catalog): #946 - models/z-image-inpaint, Z-Image Turbo masked in…
dkackman Oct 20, 2026
4fdcc50
fix(catalog): #946 - drop empty cost list from z-image-inpaint
dkackman Oct 20, 2026
1c53c50
refactor(server): #949 - output_annotations builds an output file's r…
dkackman Oct 20, 2026
46b1036
refactor(server): #950 - job history reads columns by name and record…
dkackman Oct 20, 2026
ee1fc73
feat(validate): #954 - vram_config_differs note when offload/quantiza…
dkackman Oct 20, 2026
bae4bee
docs(catalog): #946 - z-image-inpaint is masked add/replace, not obje…
dkackman Oct 20, 2026
e26b893
fix(server): #957 - stamp manifest roles on the job at finish so hist…
dkackman Oct 20, 2026
50e56a9
test(server): #957 - the job is stamped with roles at finish; assert …
dkackman Oct 20, 2026
5c05c1d
feat(stems): #955 - separate_stems warns stacked_vocals over layered-…
dkackman Oct 20, 2026
5e8642b
test(stems): #955 - stacked_vocals spans, merge, drop, truncation and…
dkackman Oct 20, 2026
2915844
Merge feat/947-A-stacked-vocals: #955 stacked_vocals warning on separ…
dkackman Oct 20, 2026
3750bcf
docs(tasks): #958 - stem separation example and prose use file_base_name
dkackman Oct 20, 2026
cf9f136
docs(proposals): #947 - design record for the stacked_vocals warning
dkackman Oct 20, 2026
18f8486
Merge docs/947-close-out: #947 design record
dkackman Oct 20, 2026
b541b9f
fix(check-script): #959 - judge the clipped tail against the line's l…
dkackman Oct 20, 2026
cea2119
Merge fix/959-clip-line-level: #959
dkackman Oct 20, 2026
04d81aa
style(tests): #959 - ruff format
dkackman Oct 20, 2026
5917752
fix(check-script): #960 - report audible untranscribed sound between …
dkackman Oct 20, 2026
9ac46b1
Merge fix/960-between-lines: #960
dkackman Oct 20, 2026
07f12f9
fix(check-script): #961 - keep a scripted loop's first take and flag …
dkackman Oct 20, 2026
468f9cd
Merge fix/961-loop-first-take: #961
dkackman Oct 20, 2026
2ff472f
docs(check-script): #961 - transcript_loop rule
dkackman Oct 20, 2026
a5d7536
fix(check-script): #962 - collapse looped discarded runs, mark lines …
dkackman Oct 20, 2026
222cc05
fix(check-script): #963 - re-transcribe a looped cut shot by shot whe…
dkackman Oct 20, 2026
40ae142
fix(check-script): #964 - judge the stretches a stray word leaves in …
dkackman Oct 20, 2026
ab22e15
fix(check-script): #964 - place a between-lines untranscribed stretch…
dkackman Oct 20, 2026
6f7fd3d
refactor(check-script): #964 - place a between-lines stretch with ove…
dkackman Oct 20, 2026
fda2ebf
fix(check-script): #965 - a second copy of a line inside its matched …
dkackman Oct 20, 2026
e18d0a3
fix(check-script): #966 - a run scoring the mismatch threshold agains…
dkackman Oct 20, 2026
a722ab9
fix(check-script): #967 - a between-lines speech_not_transcribed coun…
dkackman Oct 22, 2026
ab163e4
fix(check-script): #970 #971 - judge the tail after the last word lik…
dkackman Oct 22, 2026
2c50c20
docs(check-script): #971 - repeated_span discard reason
dkackman Oct 22, 2026
2bbbc85
fix(admission): #972 - an unknown argument is reported as itself, not…
dkackman Oct 22, 2026
273c00f
fix(validation): #972 - the null-variable rule lives in _task_errors;…
dkackman Oct 22, 2026
89e75ac
feat(tasks): #973 - remove_object, a prompt-free LaMa removal task
dkackman Oct 22, 2026
8bc5b88
feat(tasks): #973 - remove_object tests and TASKS.md section
dkackman Oct 22, 2026
c7a694d
Merge feat/956-A-remove-object: #973 remove_object task
dkackman Oct 22, 2026
3ac72b5
fix(admission): #976 - a document error no longer hides an unknown ar…
dkackman Oct 23, 2026
4844c1f
feat(catalog): #974 - remove-object and segment-and-remove templates,…
dkackman Oct 23, 2026
d1141a6
Merge feat/956-B-removal-routing: #974 removal routing and templates
dkackman Oct 23, 2026
bfb4e22
fix(segment): #974 - take each box's best-rated SAM2 mask, not the first
dkackman Oct 23, 2026
941b5fd
feat(catalog): #974 - remove-object defaults to a mask of the cup
dkackman Oct 23, 2026
1a6d8b5
Merge feat/956-B-removal-routing: #974 bounce fix - segment's best ma…
dkackman Oct 23, 2026
98edd7c
docs(proposals): #956 close-out - remove_object design record
dkackman Oct 23, 2026
4be37f5
Merge docs/956-remove-object-complete: #956 design record
dkackman Oct 23, 2026
36305b3
feat(plan): #977 - task steps declare required_weights; the plan list…
dkackman Oct 23, 2026
b0d0d85
feat(plan): #977 - tests and docs for task required_weights
dkackman Oct 23, 2026
c6ff498
Merge feat/975-A-task-weights: #977 task required_weights in the plan
dkackman Oct 23, 2026
138bbc4
feat(admission): #977 - the validate plan passed verbatim is a bound …
dkackman Oct 23, 2026
88ca4e4
Merge feat/975-A-plan-ack: #977 verbatim plan as bound acknowledgement
dkackman Oct 23, 2026
4a21d41
test(server): #977 - finished_job waits for the history row
dkackman Oct 23, 2026
a27b61b
Merge feat/975-A-plan-ack: #977 history-row race in test_server_jobs
dkackman Oct 23, 2026
9da24cc
feat(plan): #978 - file-level download entries, single-file task and …
dkackman Oct 23, 2026
d5bb9f8
Merge feat/975-B-file-weights: #978 file-level download entries
dkackman Oct 23, 2026
b72ca04
docs(architecture): #978 - task weights row names each task's source …
dkackman Oct 23, 2026
b01f123
Merge feat/975-B-file-weights: #978 architecture map row
dkackman Oct 23, 2026
3b983fc
docs(proposals): #975 design record - task weights in downloads_required
dkackman Oct 23, 2026
68ae280
Merge docs/975-task-weights-complete: #975 design record
dkackman Oct 23, 2026
b80dec7
fix(plan): #981 - downloads_required lists load_components repo overr…
dkackman Oct 25, 2026
a92c425
docs(audits): #988 - WanGP probes for claims 1 and 4
dkackman Oct 25, 2026
31ab159
Merge feat/985-A-wangp-probes: #988 WanGP probes audit
dkackman Oct 25, 2026
f9b96b2
fix(tasks): #990 - slice_audio start_seconds + num_frames keeps the f…
dkackman Oct 25, 2026
5d140a1
docs(audits): #988 - re-measure sung sync after #990
dkackman Oct 25, 2026
05e2f4d
Merge feat/985-A-wangp-probes: #988 sung sync re-measured
dkackman Oct 25, 2026
74bef86
feat(plugin): #989 - H3 locked-frame lip sync is FL2VA + hold_audio; …
dkackman Oct 25, 2026
6335367
Merge feat/985-B-h3-skill-rules: #989 H3 skill rules from WanGP probes
dkackman Oct 25, 2026
0d2c845
feat(enhancer): #989 - H3 enhancer writes spoken and sung lines as <d…
dkackman Oct 25, 2026
6997c2c
Merge feat/985-B-h3-enhancer-dialogue: #989 H3 enhancer <d> blocks
dkackman Oct 25, 2026
0a33609
docs: #985 close-out - H3 WanGP field-notes design record
dkackman Oct 25, 2026
92966da
Merge docs/985-closeout: #985 design record
dkackman Oct 25, 2026
46dc022
fix(h3): #992 - dialogue shots drop the turbo LoRA; image-to-video de…
dkackman Oct 25, 2026
b6306c6
Merge fix/992-h3-dialogue-no-turbo: #992
dkackman Oct 25, 2026
a6fb614
fix(validate): #993 - no undertrained warning on a null lora whose st…
dkackman Oct 25, 2026
cb87cfe
Merge fix/993-null-lora-warning: #993
dkackman Oct 25, 2026
149ff11
docs(skill): #994 #1004 - minimax-h3 chain trim, guide VRAM wording
dkackman Oct 26, 2026
96ec189
Merge branch 'develop' of https://github.com/dkackman/diffusers-workf…
dkackman Oct 26, 2026
26bc2d9
fix(worker): #995 #996 - recycle a worker whose CUDA context a device…
dkackman Oct 26, 2026
9c6bcdc
Merge origin/develop into fix/995-sticky-cuda
dkackman Oct 26, 2026
0bc12e1
docs(skill): #994 - trim minimax-h3 skill under the size cap
dkackman Oct 26, 2026
13f02ae
Merge branch 'develop' of https://github.com/dkackman/diffusers-workf…
dkackman Oct 26, 2026
96f6956
docs(templates): #1029 - qualify 'exactly 2x the source' under fit=crop
dkackman Oct 26, 2026
1db4086
docs(skill): #1034 - script-to-video seam re-roll guidance
dkackman Oct 26, 2026
e2bb5ba
fix(plan): #1037 - inherited quote pays the model load once across sc…
dkackman Oct 26, 2026
78c31cb
fix(observed): #1037 - median over the newest runs, not the whole his…
dkackman Oct 26, 2026
3cb3cce
fix(server): #1038 - 409 rebind plan carries the observed estimate va…
dkackman Oct 26, 2026
1075788
fix(audio): #1039 - normalize_audio(limit) warns when the limiter wor…
dkackman Oct 26, 2026
beac6e1
fix(audio): #1041 - normalize_audio(limit) reads a saved cut's manife…
dkackman Oct 26, 2026
3e8b93f
feat(assess): #1042 - look stats at decode and seam look fields in an…
dkackman Oct 26, 2026
98f27cc
Merge feat/1031-a-seam-look: #1042 seam look fields
dkackman Oct 26, 2026
cee80db
feat(assess): #1042 - look_stats detail uses scipy.ndimage.uniform_fi…
dkackman Oct 26, 2026
9411935
Merge feat/1031-a-seam-look-scipy: #1042 arch-review fix
dkackman Oct 26, 2026
8de796b
docs: #1031 close-out - seam look measures design record
dkackman Oct 26, 2026
b8f7174
Merge docs/1031-closeout: #1031 design record
dkackman Oct 26, 2026
5fac750
feat(format): enhance formatMtime to include current year logic and u…
dkackman Oct 26, 2026
7a78344
feat(format): add formatDay and formatExact functions; update JobsPag…
dkackman Oct 27, 2026
57daeb2
fix(test): #970 - pad the tagged-lines fixture with silence so its la…
dkackman Oct 27, 2026
db634e5
test(chain): #1046 - one-segment H3 chain is bit-identical to a nativ…
dkackman Oct 27, 2026
8be7740
fix(catalog): #1050 - ltx2/upscale-clip declares a vram_estimate so 1…
dkackman Oct 27, 2026
ccd7a52
feat(h3): #1048 - refine_tiles tile plan on the 32 px grid
dkackman Oct 27, 2026
127badc
feat(h3): #1048 - refine_tiles: tiled refine engine, 1920x1088 upscal…
dkackman Oct 27, 2026
62eda42
Merge feat/1043-a-refine-tiles (#1048)
dkackman Oct 27, 2026
4ea7092
docs(arch): #1048 - h3_tiles row: real import direction, decode-free …
dkackman Oct 27, 2026
ddac282
Merge feat/1043-a-refine-tiles-map (#1048)
dkackman Oct 27, 2026
b965ae4
fix(vram): #1053 #1052 - one VRAM error per projection; calibrate ups…
dkackman Oct 27, 2026
1a02b6c
feat(h3): #1048 - upscale cap refused at validate; tiled refine video…
dkackman Oct 27, 2026
ce30438
Merge feat/1043-a-refine-tiles-fix (#1048)
dkackman Oct 27, 2026
1276a89
fix(ltx2): #1052 - calibrate image-to-video vram_estimate; default 40…
dkackman Oct 27, 2026
6fddc84
feat(h3): #1048 - one FrameList, in media_types; tiled refine videos …
dkackman Oct 27, 2026
da6996b
Merge feat/1043-a-refine-tiles-framelist (#1048)
dkackman Oct 27, 2026
192557c
fix(test): remove_object device test assumed an mps backend on the CI…
dkackman Oct 27, 2026
8fa46ec
fix(ui): bump undici 8.11.2 -> 8.12.3 (GHSA-xjj6-f33q-929c, Dependabo…
dkackman Oct 27, 2026
bf0897c
fix(test): remove_object device test moved tensors to mps on a torch …
dkackman Oct 27, 2026
a8fcffa
fix(ui): flow view routes column-skipping edges in lanes and merges s…
dkackman Oct 27, 2026
dc10493
fix(server): a pulled card in a --devices list no longer stops the se…
dkackman Oct 27, 2026
0c4b23c
fix(ltx2): #1054 - calibrate vram_estimate for keyframes, two-stage, …
dkackman Oct 27, 2026
1ac6388
fix(ltx2): #1054 - reference-sheet declares its own vram_estimate (17…
dkackman Oct 27, 2026
3595d8b
refactor: merge-readiness pass - break the task-weights import cycle,…
dkackman Oct 27, 2026
0c284c2
fix(outbound): #1055 - a refused redirect hop names the target and th…
dkackman Oct 27, 2026
7a0884e
fix(h3): #1056 - a pipeline step's videos carry the rate the pipeline…
dkackman Oct 28, 2026
f59b99c
docs(releasing): draft the 0.16.0 release notes
dkackman Oct 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 13 additions & 7 deletions docs/ARCHITECTURE.md

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion docs/DEPENDENCIES.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ pyproject; install.ps1 installs it explicitly on Windows.

## Platform-Specific Dependencies

**All platforms (core ML):** peft, transformers, accelerate, safetensors, controlnet_aux, sentencepiece, torchsde, torchao, optimum-quanto, gguf, kornia, ftfy, sdnq, spandrel, facexlib (spandrel + facexlib back the `upscale` and `restore_faces` tasks). On first use, `restore_faces` has facexlib download its face detection and parsing weights (about 110 MB) from facexlib's own GitHub releases into the facexlib package directory. It is the one model download that bypasses the Hugging Face cache, dw's download manager and the `plan.downloads_required` estimate.
**All platforms (core ML):** peft, transformers, accelerate, safetensors, controlnet_aux, sentencepiece, torchsde, torchao, optimum-quanto, gguf, kornia, ftfy, sdnq, spandrel, facexlib (spandrel + facexlib back the `upscale` and `restore_faces` tasks). On first use, `restore_faces` has facexlib download its face detection and parsing weights (about 110 MB) from facexlib's own GitHub releases into the facexlib package directory. It is the one model download that bypasses the Hugging Face cache and dw's download manager; a validate's `plan.downloads_required` lists the two weights as URL entries while they are missing from that directory.

**All platforms (sparse attention):** comfy-kitchen (Sol-Attn sparse attention for MiniMax H3's generated-video rows, #931). Its compiled CUDA/HIP kernels ship for Linux and Windows; elsewhere it installs an eager-only build.

Expand Down
12 changes: 7 additions & 5 deletions docs/MCP.md

Large diffs are not rendered by default.

137 changes: 137 additions & 0 deletions docs/RELEASING.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,143 @@ notes from commits at tag time (see below). This section is a scratch pad
for items a branch's author wants the next release note to name; clear it
when a release ships.

### 0.16.0

<!-- Drafted from v0.15.0..develop (7a0884ee). Paste into the GitHub release body once the tag has published: gh release edit v0.16.0 --notes-file ... -->

A release about reaching past a 24 GB card and about removing things from
a picture. MiniMax H3 refines to 1920x1088 in tiles, the plan prices every
weight a task step will fetch before a run is accepted, and the cost quotes
and VRAM ceilings for LTX-2.5 and Z-Image are calibrated against real runs.
A prompt-free object-removal task joins the catalog with a small inpaint
model beside it, and check-script is sturdier on looped, clipped and
repeated takes.

**H3 tiled refine to 1920x1088** (#1043, #1048, #1056)

- An H3 refine step takes `refine_tiles: {width, height, overlap}` and
denoises an upscaled plate in feathered tiles on the 32 px grid, so a
1920x1088 refine fits a 24 GB card. The tiles blend in latent space and
the canvas decodes once; the soundtrack held from the base take is
encoded once per refine, not once per tile. The guide's *Refining above
768p in tiles* section is the recipe: 544p base, `upscale_h3_latents`,
tiled refine on the 768p turbo LoRA, one decode (about 12 min on an RTX
3090 for 124 frames).
- `upscale_h3_latents` caps at 1920x1088 (or 1088x1920) and validate
refuses past it; references, guides, keyframes and `<Picture N>` are
refused in tile mode; validate prices tile mode by the tile and the
decode, not as a full-canvas denoise.
- Every pipeline step whose pipeline reports its own frame rate now hands
its `videos` on carrying it, so `pair_audio` on an H3 base take fits the
track at 24 fps instead of the 8 fps fallback. The guide's keep-the-544p
recipe no longer asks for `result.fps`, which runs after the task.
- `analyze_seams` reports look measures (lightness, contrast, saturation,
detail) at each seam beside the motion fields, so a re-roll can say
which side stepped (#1031, #1042). The `script-to-video` skill says when to
re-roll a seam (#1034).
- H3 dialogue shots drop the turbo LoRA, the enhancer writes spoken and
sung lines as `<d>` blocks, and locked-frame lip sync is FL2VA with
`hold_audio` (#985, #989, #992). `slice_audio` with `start_seconds` and
`num_frames` keeps the frame length (#990). A one-segment H3 chain is
bit-identical to a native run (#1046).

**Object removal** (#956, #973, #974, #946)

- `remove_object` erases a masked region with LaMa, prompt-free, and
`templates/remove-object` and `templates/segment-and-remove` (SAM2 mask
from a box or a label, then erase) run it. `segment` takes each box's
best-rated SAM2 mask rather than its first.
- `models/z-image-inpaint` configures `templates/inpaint` with Z-Image
Turbo for masked add-or-replace, a fraction of FLUX.1 Fill's 54 GB. The
guide's *Erasing versus repainting a masked region* section routes
between the two.

**Cost, downloads and admission** (#975, #977, #978, #981, #1037, #1038, #948, #954)

- A validate's `downloads_required` lists the Hugging Face repos and
single files task steps fetch (`segment`, `remove_background`,
`diffusion_upscale`, `transcribe_audio`, `check_script`,
`generate_speech`, `attribute_voices`, `text_generation`,
`image_to_text`, `judge`, the image processors, `upscale`,
`restore_faces`, `remove_object`, `upscale_h3_latents`,
`crop_face_track`, `interpolate_frames`, and facexlib's two weights),
plus `load_components` repo overrides. Entries gain optional `filename`
and `revision`; the OpenAPI document and the UI's types carry them.
- The validate plan passed back verbatim is a bound acknowledgement. A
bound `acknowledged_cost` taken from a validate made before this deploy
is answered 409 `downloads` when the workflow has one of these tasks and
its repo is not cached: re-validate and resend the new `acknowledge`.
The 409's rebind plan carries the observed estimate validate quotes.
- The observed estimate is the median of the newest runs, not the whole
history, and an inherited quote pays the model load once across scaled
steps. A task-only workflow's unknown estimate names why it is unpriced
(`unpriced_reason`), and validate notes `vram_config_differs` when a
step's offload or quantization differs from the calibrated template.
- Validate reports one VRAM error per projection. LTX-2.5's
`upscale-clip`, `image-to-video`, `keyframes`, `two-stage`,
`refine-clip` and `reference-sheet` declare calibrated `vram_estimate`s,
so a 1080p or 481-frame request past a 24 GB card is refused at
validate instead of running out of memory late in the denoise; the
image-to-video default and the `ltx-2.5` skill move to 401 frames
(#1050, #1052, #1053, #1054). `models/z-image` declares one over batch,
width and height (#945).

**check-script and audio** (#953, #955, #959-#971, #1039, #1041)

- A looped cut is re-transcribed shot by shot when shots are known; a
scripted loop keeps its first take and flags `transcript_loop`; a chunk
repeating the previous span is discarded as `repeated_span`; a second
copy of a line inside its matched words is `unscripted_speech`; audible
untranscribed sound between two lines, and after the last one, is
reported and placed in the shot holding most of it; a clipped tail is
judged against the line's loudest window, so a score bed is not a clip.
- `separate_stems` warns `stacked_vocals` over layered-stereo spans of the
vocal stem (#947). `normalize_audio(limit)` warns when the limiter works
mostly on one shot of a cut, and reads a saved cut's manifest shots when
given its path.

**Server, worker and validation** (#928, #944, #949, #950, #951, #952, #957, #972, #976, #993, #995, #996)

- A worker whose CUDA context a device-side assert poisoned is recycled
instead of answering every later job with the same error. A pulled card
in a `--devices` list no longer stops the server: it starts on the cards
present and warns. `scripts/dw-serve.service` sets
`RestartPreventExitStatus=2` so a refused configuration stops the unit
rather than looping; reinstall the unit to pick it up.
- A file of a run with no recorded role lists as intermediate when in
`intermediate/` or read by a later run; manifest roles are stamped on
the job at finish so history serves what a live job did; a deleted
workspace's job rows stay resolvable by id.
- Validate refuses a bare relative media name that resolves nowhere,
naming `output:<name>` for an own output; an unknown argument is
reported as itself; a document error no longer hides an unknown argument
in the same call; no undertrained-LoRA warning on a null LoRA whose steps
were raised.
- A redirect hop the outbound guard refuses now names the target and the
URL asked for, so a refused hop reads apart from an upstream error
(#1055).

**Web UI**

- The flow view routes column-skipping edges in lanes and merges same-pair
labels. The jobs page filters follow the URL hash. Jobs and models list
the day (with the year only when it is not this one) and give the exact
timestamp where it matters. undici 8.12.3.

**Engine structure**

- The task-weights hook path is acyclic (`validate_weight_name` in
`dw/security.py`, processor weights registered into the task registry),
and `transformers` no longer loads into the server's validate path.
`dw/plan_downloads.py`, `dw/tasks/script_take.py` and
`dw/pipeline_processors/mag_calibration.py` split out of their parents;
`docs/ARCHITECTURE.md` names each seam.

**Dependencies and deploy**

- No dependency floors changed. The engine changes in this release need a
server restart (the persistent worker) after deploy.

### 0.15.0

<!-- Drafted from v0.14.0..develop (0c4ed5ea). Paste into the GitHub release body once the tag has published: gh release edit v0.15.0 --notes-file ... -->
Expand Down
8 changes: 7 additions & 1 deletion docs/SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,13 @@ One policy now answers all of it, untrusted:
(`MAX_MEDIA_REDIRECTS`), and each `Location` passes the same scheme and
host policy before it is dialed. A public URL answering `302` to
`http://127.0.0.1:8765/api/server` is refused with the target named, and
nothing is fetched from it. Images are decoded from the fetched bytes and
nothing is fetched from it. A refused hop's error always begins
`Refusing a redirect to '<target>' (from '<the URL asked for>'): ` and
then gives the rule that refused it (an internal address, a scheme other
than http(s), an unresolvable host), whereas an error status from a URL
itself stays the HTTP client's own `403 Client Error: Forbidden for url:
...` - so a refused redirect and an upstream failure read differently
(#1055). Images are decoded from the fetched bytes and
still go through diffusers' `load_image`, so EXIF orientation and RGB
conversion are unchanged. Each hop's host is resolved once, by the policy,
and dialed at the address it checked - so a name that answers differently
Expand Down
1 change: 1 addition & 0 deletions docs/SECURITY_QUICKREF.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,4 +109,5 @@ Invalid: file:///etc/passwd, ftp://server/file
| `Path contains dangerous pattern matching \.\.` | Path traversal | Use absolute or `./` relative paths |
| `Invalid variable name: my.var` | Special characters | Use `my_var` instead |
| `Invalid URL: URL scheme not allowed: file` | Non-http scheme | Use https or local file path |
| `Refusing a redirect to '<target>' (from '<url>'): ...` | A media URL redirected to an internal host or a non-http scheme | Host the media where it is served directly; a refused hop is never fetched |
| `Argument contains dangerous characters: ...` | Shell metacharacters | Remove `` ` `` `$` `\|` `&` `;` `>` `<` |
Loading
Loading