Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
296 commits
Select commit Hold shift + click to select a range
305305a
feat(mcp): #546 - wait for the job's estimate, not a fixed 55 s; lem …
dkackman Sep 28, 2026
e5bdbed
Merge branch 'feat/377-1-long-wait-cap' into develop
dkackman Sep 28, 2026
b8499c3
docs: #218 - find_loop_bed design record and todo entry
dkackman Sep 28, 2026
1d96ec8
Merge branch 'docs/218-close-out-find-loop-bed' into develop
dkackman Sep 28, 2026
4a826ae
feat(catalog): #548 - templates/ltx2/upscale-clip, generative 2x upsc…
dkackman Sep 28, 2026
53baa0b
feat(docs): #548 - upscale-clip in the ltx-2.5 skill, the ltx2 README…
dkackman Sep 28, 2026
aa04263
Merge branch 'feat/542-a-upscale-clip' into develop
dkackman Sep 28, 2026
d8d4970
feat(docs): #548 - upscale-clip in the ltx-2.5 skill's Repairing section
dkackman Sep 28, 2026
77bb905
Merge branch 'feat/542-a-upscale-clip' into develop
dkackman Sep 28, 2026
cf45718
feat(catalog): #549 - templates/ltx2/refine-clip, 2x latent refine of…
dkackman Sep 28, 2026
cd7fcd3
feat(docs): #549 - refine-clip in the ltx-2.5 skill, the ltx2 README …
dkackman Sep 28, 2026
8b72d5b
feat(catalog): #549 - measured cost for refine-clip, 2.9 min cold on …
dkackman Sep 28, 2026
eac5972
Merge branch 'feat/543-a-refine-clip' into develop
dkackman Sep 28, 2026
b500dc0
feat(catalog): #549 - trim the source to num_frames before the upsampler
dkackman Sep 28, 2026
6922125
Merge branch 'feat/543-a-refine-clip' into develop
dkackman Sep 28, 2026
23adfe5
docs(proposals): #543 - close-out record for ltx2/refine-clip
dkackman Sep 28, 2026
7cf4f16
Merge branch 'docs/543-close-out-refine-clip' into develop
dkackman Sep 28, 2026
9d8089a
fix(mcp): #554 - refuse names/boundaries on get_output_frames without…
dkackman Sep 28, 2026
87b5aa9
Merge branch 'fix/554-frames-names-seams-only' into develop
dkackman Sep 28, 2026
f6bc577
fix(mcp): #555 - mix_audio's dB-typo heuristic ignores non-integer gains
dkackman Sep 28, 2026
1ac1307
Merge branch 'fix/555-mix-audio-gain-heuristic' into develop
dkackman Sep 28, 2026
51bdb9d
fix(mcp): #556 - keep_output carries its source job's provenance
dkackman Sep 28, 2026
773ebe9
Merge branch 'fix/556-keep-output-provenance' into develop
dkackman Sep 28, 2026
a2d4ba2
style: #556 - ruff-format the new keep_output provenance test
dkackman Sep 28, 2026
5370ac9
fix(mcp): #556 - update stale kept-asset-provenance test
dkackman Sep 28, 2026
989af54
fix(mcp): #557 - round a frame-addressed slice's end once, not in two…
dkackman Sep 28, 2026
23b4f1e
Merge branch 'fix/557-slice-audio-end-rounding' into develop
dkackman Sep 28, 2026
8ecc028
fix(mcp): #559 - request timestamps internally for every Whisper tran…
dkackman Sep 28, 2026
edb90fc
fix(mcp): #560 - tag composed sub-workflow manifest entries with pare…
dkackman Sep 28, 2026
090705d
fix(mcp): #561 - conform a composed child's own artifact when its par…
dkackman Sep 28, 2026
465c6b8
test(mcp): #561 - cover conform_artifacts, the parent-owns-saving cod…
dkackman Sep 28, 2026
f616fd5
fix(mcp): #562 - conform each concat_videos input's audio to its own …
dkackman Sep 28, 2026
430550d
style(mcp): #562 - satisfy ruff format on test_concat_videos.py
dkackman Sep 28, 2026
4126d50
fix(mcp): #561 - conform a composed child's artifacts before they cro…
dkackman Sep 28, 2026
47e3ebd
fix(mcp): #563 - warn when pair_audio regrids a real measured shot po…
dkackman Sep 28, 2026
50c8b0e
feat(prompts): add night tram scene description with tags and intende…
dkackman Sep 28, 2026
73ff60e
Merge branch 'develop' of https://github.com/dkackman/diffusers-workf…
dkackman Sep 28, 2026
95f2625
fix(api): streamline savePrompt function call in PromptEditorPage
dkackman Sep 28, 2026
7cddd41
fix(tests): update test functions to use temporary directories for ou…
dkackman Sep 28, 2026
45b237b
feat(tests): add integration tests for real models and enhance testin…
dkackman Sep 28, 2026
11d1f7f
feat(e2e): enhance end-to-end tests for saving workflows and toast no…
dkackman Sep 28, 2026
3afd70e
docs(stabilization): roadmap, assessment, Phase 0 plan and the freeze…
dkackman Sep 28, 2026
d24fa35
chore(stabilization): architecture metrics script and Phase 0 baseline
dkackman Sep 28, 2026
9566bd1
fix(validate): validation and the realized record see constraint-snap…
dkackman Sep 28, 2026
5810bea
fix(validate): sub-workflow warnings are strings at the author's step…
dkackman Sep 28, 2026
866dfa0
fix(server): detail-cache pruning tolerates concurrent requests
dkackman Sep 28, 2026
7da6d75
fix(runs): claim a run's directory and version atomically
dkackman Sep 28, 2026
a3e8a40
fix(runs): move open_run's lock out of the output tree
dkackman Sep 28, 2026
b03280e
fix(worker): validate a job against its own workspace's assets
dkackman Sep 28, 2026
b148ce2
fix(server): cover submit_job's own asset-scoping gap, simplify valid…
dkackman Sep 28, 2026
0f5519a
docs(stabilization): fold complexity, import-cycle and gate-report me…
dkackman Sep 28, 2026
33ce925
fix(step-cache): a step borrowing a pipeline misses when its source c…
dkackman Sep 28, 2026
3dd6bf5
fix(step-cache): a cache hit records its pipeline without loading it
dkackman Sep 28, 2026
4fcd72d
fix(step-cache): a hit that loaded nothing announces no pipeline release
dkackman Sep 28, 2026
fd68b86
docs(stabilization): B6 is a documented single-user limit, not a Phas…
dkackman Sep 28, 2026
69da2b4
fix(server): check a job's asset: references against its own workspac…
dkackman Sep 28, 2026
aef6ea8
test: replace two new dw string patches to restore the patch-target r…
dkackman Sep 28, 2026
89e413d
fix(runs): keep run locks under dw's settings directory, not the syst…
dkackman Sep 28, 2026
a4ca7e0
fix(server): take the run lock before sweeping an emptied identity fo…
dkackman Sep 28, 2026
3d1ddc0
docs(claude-md): name open_run as where a run takes its ordinal
dkackman Sep 28, 2026
9e7158b
docs(stabilization): Phase 0 gate names B6 as a documented limit, not…
dkackman Sep 28, 2026
934e057
Merge stabilization/phase-0: baseline metrics and correctness fixes B…
dkackman Sep 28, 2026
f458d04
docs(stabilization): Task 11 completes B2 - the lem timing showed the…
dkackman Sep 28, 2026
158d71a
fix(step-cache): a cached step defers its load until a step that runs…
dkackman Sep 28, 2026
daf6c4f
fix(step-cache): a released deferred hit still shares its components
dkackman Sep 28, 2026
8c945b9
fix(step-cache): a released deferred hit announces its release when i…
dkackman Sep 28, 2026
40b4148
Merge stabilization/phase-0b: a cached step defers its load until a s…
dkackman Sep 28, 2026
49e466d
docs(stabilization): Task 12 - borrowed pipeline keys must not hash a…
dkackman Sep 28, 2026
b60a737
fix(step-cache): borrowed pipeline keys come from the definition as w…
dkackman Sep 28, 2026
6a88c74
Merge stabilization/phase-0c: borrowed pipeline keys come from the de…
dkackman Sep 28, 2026
fb03dae
docs(stabilization): close gate 0 - B2 0.77 s cached rerun on lem, Ph…
dkackman Sep 28, 2026
f07eaf2
docs(stabilization): every gate report carries the full metrics table…
dkackman Sep 28, 2026
fa73622
docs(stabilization): Phase 1 plan - metrics v2, REPL removal, one pre…
dkackman Sep 28, 2026
b2bd055
feat(metrics): complexity and import-cycle ratchets; re-baseline (met…
dkackman Sep 28, 2026
a70f0ae
feat(metrics): arch_report.py gate report; gate 0 regenerated from it…
dkackman Sep 28, 2026
48fd4a1
docs(stabilization): stage B harness prompt - the metrics ratchet at …
dkackman Sep 28, 2026
444f1ac
Merge stabilization/phase-1a: metrics v2 ratchets, arch_report.py, st…
dkackman Sep 28, 2026
6c571e6
refactor: remove the REPL; WorkerManager moves to dw/worker_manager.py
dkackman Sep 28, 2026
0296cf1
docs: fix REPL leftovers the lowercase sweep couldn't see
dkackman Sep 28, 2026
3701101
docs: no page still describes the REPL as present
dkackman Sep 28, 2026
86f067d
refactor(workflow): one prepare pipeline - fold and expand shared by …
dkackman Sep 28, 2026
39a9786
refactor(server): one admission service for validate, submit and rerun
dkackman Sep 28, 2026
3e60b7a
refactor(run): python -m dw.run is a client of dw.serve
dkackman Sep 28, 2026
5fc58e8
fix(run): a job lost mid-wait is one error line, not a traceback
dkackman Sep 28, 2026
911aeba
fix(runs): a run claim survives a sibling's sweep removing its parent…
dkackman Sep 28, 2026
c8f59d3
fix(workflow): an undeclared constraint: frame_snap reached through a…
dkackman Sep 28, 2026
25815a8
fix(admission): a warning helper that raises never refuses a job
dkackman Sep 28, 2026
56bfa7a
fix(run): timeouts, Ctrl-C at submit, an unreadable inline resend and…
dkackman Sep 28, 2026
1194a27
docs: dw.run is a client - workspace, per-folder and trust flags are …
dkackman Sep 28, 2026
3ed0c3e
test(admission): a warning after the failing helper still arrives; do…
dkackman Sep 28, 2026
a113fa5
Merge stabilization/phase-1: REPL removed, one prepare pipeline, one …
dkackman Sep 28, 2026
7e4f73d
docs(stabilization): close gate 1 - report, lem timings, re-baseline
dkackman Sep 29, 2026
bf285e7
docs(stabilization): Phase 2 plan (staged 2a-2d), stage 2a detailed; …
dkackman Sep 29, 2026
c9c4775
feat(references): one module owns the reference prefixes
dkackman Sep 29, 2026
32f663e
refactor(references): prefix constants and sets come from dw.references
dkackman Sep 29, 2026
45de177
refactor(references): no module but dw.references spells a prefix
dkackman Sep 29, 2026
4fcbdf3
docs(stabilization): hot zone 2a gains the three files Task 3 touched
dkackman Sep 29, 2026
53a8e36
refactor(references): one author_index for every checker
dkackman Sep 29, 2026
7dfd316
docs(stabilization): hot zone 2a gains dw/tasks/voice_attribution.py …
dkackman Sep 29, 2026
178691e
docs(stabilization): stage 2a release notes and follow-ups
dkackman Sep 29, 2026
e27d5a8
Merge stabilization/phase-2a: dw/references.py owns the reference pre…
dkackman Sep 29, 2026
39035e2
docs(stabilization): stage 2a merged
dkackman Sep 29, 2026
aba78bb
docs(stabilization): stage 2b detailed (validation registry, B9, B10,…
dkackman Sep 29, 2026
819a3fd
fix(audio): #564 - log seam fade, score offset, fade-out; say when a …
dkackman Sep 29, 2026
5c245b4
Merge fix/564-shaping-logs: shaping arguments leave a log line (#564)
dkackman Sep 29, 2026
105dbe9
perf(media): a metadata-only probe for validation (B9)
dkackman Sep 29, 2026
0b7b7d5
Merge develop into stabilization/phase-2b (#564 landed on audio_utils…
dkackman Sep 29, 2026
359c02a
fix(media): probe_metadata falls back to a decode where a packet is n…
dkackman Sep 29, 2026
f4f438a
feat(validation): Finding, ValidationContext and one exception policy
dkackman Sep 29, 2026
30de87d
refactor(validation): validation_errors is a loop over the check regi…
dkackman Sep 29, 2026
e25cdbe
refactor(validation): one warning registry; a failed warning pass is …
dkackman Sep 29, 2026
08a285e
refactor(task_domains): the four rules written twice have one home each
dkackman Sep 29, 2026
e08dbd1
docs(stabilization): hot zone adds for_each.py and references.py (2b …
dkackman Sep 29, 2026
6b5cb4d
refactor(validation): fold select_validation into dw/validation.py
dkackman Sep 29, 2026
6626138
fix(validation): 2b final review - {"location"} media probed, type-on…
dkackman Sep 29, 2026
9d55b09
docs(stabilization): stage 2b release notes
dkackman Sep 30, 2026
72be3f7
Merge stabilization/phase-2b: validation registry, B9, B10, four rule…
dkackman Sep 30, 2026
3b49c48
docs(stabilization): stage 2b merged; stage 2c detailed (admitted sna…
dkackman Sep 30, 2026
492f0b6
refactor(worker): run the admitted snapshot; no re-read, no re-validate
dkackman Sep 30, 2026
886e5f0
test(worker): pin the admitted snapshot against an edited file
dkackman Sep 30, 2026
17cba12
refactor(worker): typed messages, one reply dispatcher with request ids
dkackman Sep 30, 2026
d517470
refactor(worker): pin the request-id echo on a failed request
dkackman Sep 30, 2026
66da9b7
fix(run): page a finished job's event tail to the end
dkackman Sep 30, 2026
eec9f7f
fix(worker): a crash answers a waiting request at once; dw.run never …
dkackman Sep 30, 2026
4bdb4d0
docs(stabilization): stage 2c release notes; worker docs follow the a…
dkackman Sep 30, 2026
45917df
Merge stabilization/phase-2c: the worker runs the admitted snapshot; …
dkackman Sep 30, 2026
1f94c2a
docs(stabilization): stage 2c merged; stage 2d detailed (pipeline ide…
dkackman Sep 30, 2026
ff9e29f
refactor(step_cache): pipeline identity has one home; one import cycl…
dkackman Sep 30, 2026
23882cb
fix(step_cache): a change up a borrow chain misses every step below it
dkackman Sep 30, 2026
501b7c1
fix(concat): #565 - warn at validate and run when audio_bleed_ms has …
dkackman Sep 30, 2026
2739b62
fix(step_cache): identical borrowers share one key
dkackman Sep 30, 2026
7c40e41
fix(pipeline): loading never edits the workflow's definition
dkackman Sep 30, 2026
aded0d8
refactor(runs): run_lock_path is public; recorded variables share the…
dkackman Sep 30, 2026
abce430
fix(workflow): a composed child owns a copy of the media it is handed
dkackman Sep 30, 2026
234814b
fix(concat): #566 - audio_bleed logs each bled seam; tonal warning na…
dkackman Sep 30, 2026
89bb3ce
fix(workflow): a composed child's copy is inside run's cleanup, and o…
dkackman Sep 30, 2026
f12de19
docs(stabilization): stage 2d release notes; CLAUDE.md step cache nam…
dkackman Sep 30, 2026
c5539dd
Merge stabilization/phase-2d: pipeline identity in step_cache, borrow…
dkackman Sep 30, 2026
9e25c49
docs(stabilization): gate 2 closed - report, lem timings, release not…
dkackman Sep 30, 2026
74b3547
docs(stabilization): Phase 3 plan - five stages, 3a (import cycles to…
dkackman Sep 30, 2026
a81571c
docs(stabilization): Phase 3 plan - Fable review: hot zone before Tas…
dkackman Sep 30, 2026
e10d653
docs(stabilization): Phase 3 approved - modules ratchet rises by name…
dkackman Sep 30, 2026
0fed9ce
docs(stabilization): 3a Task 2 - grid helpers take public names (pre-…
dkackman Sep 30, 2026
c243c5d
refactor(references): reference keys and audio format tables move to …
dkackman Sep 30, 2026
01fef64
docs(ui): FROM_FILE_KEY lives in dw/references.py now
dkackman Sep 30, 2026
bb36793
refactor(media_types): step values and their audio rules in one leaf;…
dkackman Sep 30, 2026
30dbf5b
refactor: the last four import cycles cut at their one edge each
dkackman Sep 30, 2026
ee35f59
test(step): guard test above the __main__ block; server CLAUDE.md lin…
dkackman Sep 30, 2026
1ea64f7
fix(3a): final review - vram test imports pipeline_identity from its …
dkackman Sep 30, 2026
ebf82dd
docs(stabilization): stage 3a done - cycles re-baselined to 0, releas…
dkackman Sep 30, 2026
6ca92aa
Merge stabilization/phase-3a: import cycles to zero (5 -> 0), dw/medi…
dkackman Sep 30, 2026
438f292
fix(shots): #568 - collision warning drops its own step prefix and sk…
dkackman Sep 30, 2026
3860df8
docs(stabilization): stage 3b detailed - routers and services with a …
dkackman Sep 30, 2026
23a28b5
docs(stabilization): 3b - Fable review: route parity as set plus fami…
dkackman Sep 30, 2026
bae9838
docs(stabilization): stage 3b hot zone live
dkackman Sep 30, 2026
22e450c
chore(scripts): surface_snapshot - route table, middleware, OpenAPI a…
dkackman Sep 30, 2026
0210a8e
docs(stabilization): 3b - files router after the /mcp pair (tail orde…
dkackman Sep 30, 2026
2ae7fc5
chore(scripts): surface_snapshot records the MCP server instructions too
dkackman Sep 30, 2026
e6ce220
refactor(server): stage 3b task 2 - catalog, http_security and admiss…
dkackman Sep 30, 2026
1ac031b
test(server): drop the build_plan patch no /api/jobs path reads
dkackman Sep 30, 2026
964b7b7
refactor(server): stage 3b task 3a - deps, admission's admit_for, and…
dkackman Sep 30, 2026
b0b7f16
refactor(server): stage 3b task 3b - outputs, the media, gallery, ass…
dkackman Oct 1, 2026
2d0df1d
test: two comments name the routers that now hold the code
dkackman Oct 1, 2026
98aba4c
refactor(server): stage 3b task 4a - JobHistory and Job leave jobs.py
dkackman Oct 1, 2026
e790618
fix(server): stage 3b task 4b - definition() from the snapshot, B10's…
dkackman Oct 1, 2026
7467b17
fix(server): submit_job passes an HTTPException through its post-admi…
dkackman Oct 1, 2026
3f46897
refactor(worker): message types to dw/worker_protocol.py; _handle_exe…
dkackman Oct 1, 2026
ad79091
docs: typed worker messages live in dw/worker_protocol.py
dkackman Oct 1, 2026
1d63fc5
refactor(serve): cut main into build_parser, configure_environment, c…
dkackman Oct 1, 2026
3ecb186
refactor(serve): drop the ServeConfig field run never reads
dkackman Oct 1, 2026
f1fe3ff
refactor(mcp): tools out of build_server into tools_catalog, tools_me…
dkackman Oct 1, 2026
6b145cb
fix(3b): final review - definition() reads the file a rerun admits, s…
dkackman Oct 1, 2026
dee098c
docs(stabilization): stage 3b done - re-baseline (modules 132->151, t…
dkackman Oct 1, 2026
cf1802c
Merge stabilization/phase-3b: server into routers and services (app.p…
dkackman Oct 1, 2026
d7a29c1
docs(stabilization): stage 3c detailed - LibraryPath, one constructor…
dkackman Oct 1, 2026
628d46e
docs(stabilization): 3c - Fable review: snapshot sees listing bodies,…
dkackman Oct 1, 2026
d8d6b1e
docs(stabilization): stage 3c hot zone live
dkackman Oct 1, 2026
40d6019
chore(stabilization): surface snapshot records the three library list…
dkackman Oct 1, 2026
ad3d173
refactor(stabilization): dw/library.py - LibraryPath, and the workflo…
dkackman Oct 1, 2026
1a5bdd4
refactor(stabilization): prompts and assets on LibraryPath; the worke…
dkackman Oct 1, 2026
7bf5ab5
docs: Workflow sources paragraph back to its line count (claude_md_li…
dkackman Oct 1, 2026
7feb7c3
fix(stabilization): pin the whole read-only tail; a dangling prompt l…
dkackman Oct 1, 2026
38366a1
refactor(stabilization): server consumers on LibraryPath; a named wor…
dkackman Oct 1, 2026
f43c019
fix(stabilization): finish D5 for the workspace registry; pin the pro…
dkackman Oct 1, 2026
46940b1
feat(stabilization)!: one library listing envelope for workflows, pro…
dkackman Oct 1, 2026
3038388
refactor(stabilization): library envelope review fixes - one 409 word…
dkackman Oct 1, 2026
542aed9
feat(stabilization)!: the web UI reads the one library listing envelope
dkackman Oct 1, 2026
f70a92c
fix(stabilization): workflow details always carry origin and writable
dkackman Oct 1, 2026
eb75938
docs(stabilization): stage 3c docs - the one library envelope, releas…
dkackman Oct 1, 2026
48b2b63
fix(stabilization): 3c final review - checkout workflows root keeps i…
dkackman Oct 1, 2026
9f291f3
fix(stabilization): 3c re-review - name the named-workspace tag limit…
dkackman Oct 1, 2026
4337eb8
docs(stabilization): stage 3c done - hot zone released, roadmap
dkackman Oct 1, 2026
e3807f8
Merge stabilization/phase-3c: LibraryPath - one library model for wor…
dkackman Oct 1, 2026
c2b268a
docs(stabilization): detail stage 3d (media + DSP, teacache deletion)…
dkackman Oct 1, 2026
19cd4c2
feat(stabilization): 3d task 1 - task surface in the snapshot; delete…
dkackman Oct 1, 2026
cd5d229
docs: WORKFLOW_GUIDE cache section introduces one cache block (3d Tas…
dkackman Oct 1, 2026
70ed900
test(stabilization): 3d task 2 - characterize the two true-peak overs…
dkackman Oct 1, 2026
00b3f6b
feat(stabilization): 3d task 2 - dw/dsp.py, the one pure DSP module
dkackman Oct 1, 2026
b742a2b
refactor(stabilization): 3d task 2 fix - dsp.resample_samples, dsp wi…
dkackman Oct 1, 2026
d49c742
test(stabilization): 3d task 3 - the layering test: av.open only in d…
dkackman Oct 1, 2026
49aa6a2
refactor(stabilization): 3d task 3 - dw/media.py, the one module that…
dkackman Oct 1, 2026
c49cc4f
refactor(stabilization): 3d task 3 fix round 1 - route the two resamp…
dkackman Oct 1, 2026
075a71b
refactor(stabilization): 3d task 4 - split audio_utils into audio_uti…
dkackman Oct 1, 2026
f2127c7
refactor(stabilization): 3d task 4 - one slice-region helper and one …
dkackman Oct 1, 2026
99916c7
refactor(stabilization): 3d task 5 - one public resample, dsp.resampl…
dkackman Oct 1, 2026
160305a
refactor(stabilization): 3d task 5 - concat_videos and dissolve_video…
dkackman Oct 1, 2026
7871129
fix(stabilization): 3d task 5 - dissolve_videos raises every shortfal…
dkackman Oct 1, 2026
2ddac3c
test(stabilization): 3d task 5 - dissolve and shot-span preflight tes…
dkackman Oct 1, 2026
f93a37b
fix(stabilization): 3d task 5 fix round 1 - dissolve keeps refusing a…
dkackman Oct 1, 2026
1d73af7
refactor(stabilization): 3d task 6 - find_loop_bed cut under 150 line…
dkackman Oct 1, 2026
89c142f
refactor(stabilization): 3d task 6 - attribute_voices cut under 150 l…
dkackman Oct 1, 2026
d21d0d0
refactor(stabilization): 3d task 6 - join_into_song cut under 150 lin…
dkackman Oct 1, 2026
e099eb5
docs(stabilization): stage 3d done - CLAUDE.md homes, final-review mi…
dkackman Oct 1, 2026
b9c2096
Merge stabilization/phase-3d: one media I/O module (dw/media.py) and …
dkackman Oct 1, 2026
e6466b9
docs(stabilization): detail stage 3e (engine splits); 3e hot zone live
dkackman Oct 1, 2026
1fb492c
refactor(stabilization): 3e task 1 - surface snapshot gains catalog_v…
dkackman Oct 1, 2026
d38863d
refactor(stabilization): 3e task 1 - result.py's writers, audio QC an…
dkackman Oct 1, 2026
4365484
refactor(stabilization): 3e task 1 - review minors (stable_message na…
dkackman Oct 1, 2026
36ae66d
refactor(stabilization): 3e task 2 - Result.save_artifact cut into pe…
dkackman Oct 1, 2026
e18f074
docs(stabilization): 3e task 2 - review minors (audio_qc docstrings n…
dkackman Oct 1, 2026
ec2b945
refactor(stabilization): 3e task 3 - plan.estimate cut into private h…
dkackman Oct 1, 2026
943e8ab
style(stabilization): 3e task 3 - review minor (import block blank line)
dkackman Oct 1, 2026
292749c
refactor(stabilization): 3e task 4 - drop _with_frame_rate's dead htt…
dkackman Oct 1, 2026
8b2a7d0
refactor(stabilization): 3e task 4 - argument_media module; NON_TYPE_…
dkackman Oct 1, 2026
b0bf061
refactor(stabilization): 3e task 4 - realize_args cut to complexity 9…
dkackman Oct 1, 2026
2e793b9
fix(stabilization): 3e task 4 - list items keep string-only path reso…
dkackman Oct 1, 2026
aa34feb
refactor(stabilization): 3e task 5 - introspection's type-reference c…
dkackman Oct 1, 2026
2d1124c
refactor(stabilization): 3e task 6 - trust gate moves to dw/trust.py
dkackman Oct 1, 2026
b609e5f
refactor(stabilization): 3e task 7 - pipeline.py splits into placemen…
dkackman Oct 1, 2026
de0728d
refactor(stabilization): 3e task 8 - PipelineOwnership owns a run's s…
dkackman Oct 1, 2026
a6074b6
refactor(stabilization): 3e task 8 - create_step_action cut to a disp…
dkackman Oct 1, 2026
8d1a3a2
fix(stabilization): 3e task 8 - a composed child keeps its handed arg…
dkackman Oct 1, 2026
296782e
refactor(stabilization): 3e task 8 - review minor (allocated_mb publi…
dkackman Oct 1, 2026
6713bab
refactor(stabilization): 3e task 9 - validation block joins dw/valida…
dkackman Oct 1, 2026
18a84cd
docs(stabilization): 3e task 9 - review minor (validation comment nam…
dkackman Oct 1, 2026
77af26f
test(stabilization): 3e task 10 - characterization: a released pipeli…
dkackman Oct 1, 2026
9504567
refactor(stabilization): 3e task 10 - Workflow.run cut into named pha…
dkackman Oct 1, 2026
e3d56fa
refactor(stabilization): 3e task 10 - size fallback 1: workflow_outpu…
dkackman Oct 1, 2026
1b66b7e
refactor(stabilization): 3e task 10 - size fallback 2: resident-reuse…
dkackman Oct 1, 2026
e5d442d
fix(stabilization): 3e task 10 - review round 1: resident reuse repub…
dkackman Oct 1, 2026
d558d48
fix(elision): _carry_release ignores a non-dict pipeline instead of r…
dkackman Oct 1, 2026
c61ff90
test: characterize the three previous_result: scanners before they sh…
dkackman Oct 1, 2026
cf9bbb4
refactor(references): one previous_result: walker for step_cache and …
dkackman Oct 1, 2026
5e8d945
docs(stabilization): stage 3e task 12 - re-baseline, doc homes, relea…
dkackman Oct 1, 2026
6abfca6
docs(stabilization): stage 3e done - final-review minors in the relea…
dkackman Oct 1, 2026
ee5c494
Merge stabilization/phase-3e: engine splits - result.py, pipeline.py,…
dkackman Oct 1, 2026
54f8a3c
docs(stabilization): gate 3 - lem timings, metrics with LCOM4, releas…
dkackman Oct 1, 2026
a8e13de
docs: 0.6.0 release notes; gate 3 records the venv rebuild as Don's
dkackman Oct 1, 2026
be337cc
fix(security): confine a refused prompt lookup lexically before probi…
dkackman Oct 1, 2026
e6c94c2
test: wait for the history row before restoring a job (CI race)
dkackman Oct 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
19 changes: 10 additions & 9 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

This is a declarative workflow engine for the HuggingFace Diffusers library that executes AI model pipelines via JSON configuration files.

## REPL Worker Architecture (NEW)
## Worker Architecture

The REPL uses a **persistent worker subprocess** for workflow execution to maintain GPU model cache:
`dw.serve` uses a **persistent worker subprocess** for workflow execution to maintain GPU model cache:
- Worker keeps models loaded in GPU across multiple runs
- Automatic workflow file change detection (SHA256 hash)
- Aggressive memory cleanup between runs (gc.collect + torch.cuda.empty_cache)
Expand All @@ -14,17 +14,17 @@ The REPL uses a **persistent worker subprocess** for workflow execution to maint

**Key modules:**
- `dw/worker.py` - Worker process with command loop and memory management
- `dw/repl.py` - REPL with worker lifecycle (start/stop/restart)
- `dw/worker_manager.py` - Worker lifecycle (start/stop/restart) for `JobManager`
- Communication via `multiprocessing.Queue` (command_queue, result_queue)

**Worker commands:** execute, shutdown, ping, clear_memory, memory_status
**Worker commands:** execute, cancel, shutdown, clear_memory, memory_status, probe_cache (typed messages in `dw/worker_protocol.py`; request/reply commands carry a `request_id`)

## Architecture Overview

**Core Components:**
- `dw/workflow.py`: Main orchestrator - loads JSON workflows, handles variable substitution, manages step execution
- `dw/workflow.py`: Main orchestrator - loads JSON workflows, handles variable substitution, manages step execution (the run's phases live in `dw/workflow_run.py`, validation in `dw/validation.py`)
- `dw/step.py`: Individual workflow step executor - runs pipelines/tasks/sub-workflows
- `dw/pipeline_processors/pipeline.py`: Manages HuggingFace pipeline loading, configuration, and shared components
- `dw/pipeline_processors/pipeline.py`: The `Pipeline` class - HuggingFace pipeline loading and shared components (placement, component loading, adapters and progress reporting are beside it in `placement.py`, `components.py`, `adapters.py`, `progress.py`)
- `dw/tasks/task.py`: Executes utility tasks (image processing, QR codes, data gathering)
- `dw/previous_results.py`: Handles cross-step data flow using cartesian products of previous results

Expand Down Expand Up @@ -72,7 +72,7 @@ The REPL uses a **persistent worker subprocess** for workflow execution to maint
**Execution:** `python -m dw.run workflow.json variable1=value1`

**Adding New Tasks:** Register a handler function in `dw/tasks/task.py` with the `@register_command("name")` decorator; `Task.run()` dispatches to the registry (falling back to image/video processor lookups for unregistered names)
**Adding Pipeline Types:** Update `workflow_schema.json` and ensure proper component loading in `pipeline.py`
**Adding Pipeline Types:** Update `workflow_schema.json` and ensure proper component loading in `pipeline_processors/components.py`

## Project-Specific Conventions

Expand All @@ -91,13 +91,14 @@ The REPL uses a **persistent worker subprocess** for workflow execution to maint

## Security

**Critical security module** (`dw/security.py`) provides comprehensive input validation and protection:
**Critical security modules**: `dw/security.py` provides comprehensive input validation and protection, and `dw/trust.py` gates the trust model for untrusted workflows:
- **Path validation**: Prevents traversal attacks, validates file extensions, enforces directory restrictions
- **Input sanitization**: Validates variable names (alphanumeric + underscore/hyphen only), string lengths, control characters
- **Command safety**: Sanitizes subprocess arguments, blocks shell metacharacters, enforces `shell=False`
- **URL validation**: Restricts to http/https schemes only
- **Workflow trust**: Controls what untrusted workflows may import (`dw/trust.py`)

All entry points (run.py, validate.py, repl.py) use security validation. When adding features:
All entry points (run.py, validate.py, serve.py) use security validation. When adding features:
- Always validate paths with `validate_path()` or `validate_workflow_path()`
- Use `validate_variable_name()` for user-provided variable names
- Sanitize URLs with `validate_url()` before remote loading
Expand Down
51 changes: 51 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,57 @@ jobs:
- name: Build
run: npm run build

e2e:
# Playwright against a real dw.serve, on PRs into master only - the
# release PR is where a stale spec has to be caught, and the job carries
# the backend install as well as the browser
if: github.event_name == 'pull_request' && github.base_ref == 'master'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: actions/setup-python@v7
with:
python-version: '3.12'
cache: pip
cache-dependency-path: |
pyproject.toml
requirements.txt
requirements-test.txt
- run: sudo apt-get update && sudo apt-get install -y libgl1 libglib2.0-0
- name: Install torch (CPU)
run: pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
- name: Install dependencies
run: |
pip install -r requirements.txt -r requirements-test.txt
pip install git+https://github.com/huggingface/diffusers
- uses: actions/setup-node@v7
with:
node-version-file: ui/.nvmrc
cache: npm
cache-dependency-path: ui/package-lock.json
- name: Build the UI the fixture server serves
working-directory: ui
run: |
npm ci
npm run build
- name: Install Chromium
working-directory: ui
run: npx playwright install --with-deps chromium
- name: E2E tests
working-directory: ui
env:
DW_E2E_PYTHON: python
run: npx playwright test
- name: Upload the Playwright report
if: failure()
uses: actions/upload-artifact@v7
with:
name: playwright-report
path: |
ui/playwright-report/
ui/test-results/
retention-days: 7

wheel:
# The packaged artifact: SPA built into the wheel. Tags and manual runs
# only - the jobs above already prove the build on every push.
Expand Down
9 changes: 0 additions & 9 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -54,15 +54,6 @@
"PYTHONPATH": "${workspaceFolder}"
}
},
{
"name": "REPL",
"type": "debugpy",
"request": "launch",
"module": "dw.repl",
"cwd": "${workspaceFolder}/",
"justMyCode": true,
"args": []
},
{
"name": "validate file",
"type": "debugpy",
Expand Down
Loading
Loading