You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
get_gallery_metadata: kept asset reports inputs: null where its source output listed its input assets #902
Repro (workspace qa-ep176, since deleted; the kept asset stands):
Inline job 979687c8a3ec (workflow: get_job_workflow("979687c8a3ec") — get_last_frame of asset:qa-cast/ep175-episode.mp4 and of asset:qa-cast/ep174-episode.mp4, a 3-entry LTX i2v for_each, one entry on asset:qa-cast/priya-portrait.jpg, concat_videos → normalize_audio → pair_audio).
get_gallery_metadata(name="qa-ep176-cut/20261014-103814-4b281efa/final/qa-ep176-cut-episode.7-0.0.mp4", workspace="qa-ep176") returned "inputs": [{"reference":"asset:qa-cast/ep175-episode.mp4","kind":"asset"}, {"reference":"asset:qa-cast/ep174-episode.mp4","kind":"asset"}, {"reference":"asset:qa-cast/priya-portrait.jpg","kind":"asset"}], "role": "final".
get_gallery_metadata(name="asset:qa-cast/ep176-episode.mp4") returns the same job, run_id, note and media, but "inputs": null.
Expected: the kept asset reports the same inputs lineage as the output it was kept from. It still carries job.id, so the server knows where it came from.
Actual:inputs: null. In this series every episode is built from earlier kept episodes. Once the workspace is gone, the only way to see which assets an episode was cut from is get_job_workflow plus reading the steps by hand. role: null on an asset is reasonable; dropping inputs loses information.
Low priority (friction, not a failure). Found while running TESTER_TASK.agent.md (ep176).
Fixed in 11cc864 on develop, deployed to lem (healthy, 10:45). keep_output now records the source run's manifest inputs in the asset's sidecar provenance (beside job/run_id/version), and get_gallery_metadata on an asset: reads them back, so inputs matches the output it was kept from. role stays null for assets. Limits: only files kept after this deploy carry it (earlier kept assets, including the ep176 one, stay inputs: null; re-keep with overwrite to refresh), and it is recorded only when the source file still has a job in history (same gate as the rest of provenance). Test: extended the #556 kept-job test in tests/test_server_workspaces.py.
Architecture review queued by the loop driver: this hand-off changed dw/ or dw_mcp/ on develop (302bae18cd..11cc864008: dw/server/routes/assets.py dw/server/routes/media.py). The reviewer checks it against docs/ARCHITECTURE.md before the tester verifies.
Read: git diff 302bae18cd..11cc864008 under dw/ and dw_mcp/, i.e. 11cc864 (dw/server/routes/assets.py, dw/server/routes/media.py). I checked it against docs/ARCHITECTURE.md and item 3 of docs/stabilization/harness/stage-c-guardrails.md.
Second owner: none. keep_output_as_asset reads the source run's inputs by calling dw/server/outputs.py's run_inputs on the directory validated_run_split returns. That is the same call gallery_metadata makes for an output (media.py:179-182), so the manifest is not parsed a second time and the path is not split a second time. gallery_metadata reads inputs back from the kept-asset provenance it already reads for job/run_id/version (keep_output drops the source job's provenance: a kept asset's get_gallery_metadata has job null even though keep_output knew the job #556).
Build vs. buy: nothing hand-rolled.
Map: no new module, and no rule moves between modules, so no row is needed. No existing row names these functions in a way the change contradicts.
Context: the rationale is in a code comment and in the gallery_metadata docstring. No CLAUDE.md was touched.
Non-blocking nits:
validated_run_split(ws.outputs, source) is now called twice in keep_output_as_asset: once in the body.note is None branch and again at the new line 503.
The run_inputs import sits out of alphabetical order in the ..outputs import list.
No arch-approved waiver was needed. Over to the tester to verify.
Inline job 6cee0715fc6f: one get_last_frame step on asset:qa-cast/ep175-episode.mp4, saved as a PNG.
get_gallery_metadata on the output qa-v902/20261014-104901-39d691b0/qa-v902-frame.0-0.0.png returned inputs: [{"reference":"asset:qa-cast/ep175-episode.mp4","kind":"asset"}] and role: "final".
Kept it twice: once with shared=true (asset:v902-shared-frame.png), the same case as the original repro, and once workspace-local (asset:v902-local-frame.png), an adjacent case.
get_gallery_metadata on each asset returned the same job.id, run_id, version and note, with role: null. Both returned inputs: [{"reference":"asset:qa-cast/ep175-episode.mp4","kind":"asset"}]. That matches the source output, so it is no longer null.
I didn't re-check the ep176 asset: the hand-off says assets kept before this deploy keep inputs: null. Cleanup: I deleted the shared asset and the workspace.
Activity
fix(gallery): #902 - keep_output carries the source run's inputs so a…
dkackman commentedon Oct 14, 2026
Fixed in 11cc864 on develop, deployed to lem (healthy, 10:45).
keep_outputnow records the source run's manifestinputsin the asset's sidecar provenance (beside job/run_id/version), andget_gallery_metadataon anasset:reads them back, soinputsmatches the output it was kept from.rolestays null for assets. Limits: only files kept after this deploy carry it (earlier kept assets, including the ep176 one, stayinputs: null; re-keep with overwrite to refresh), and it is recorded only when the source file still has a job in history (same gate as the rest of provenance). Test: extended the #556 kept-job test in tests/test_server_workspaces.py.— claude-sonnet-5-5 via anthropic
dkackman commentedon Oct 14, 2026
Architecture review queued by the loop driver: this hand-off changed
dw/ordw_mcp/ondevelop(302bae18cd..11cc864008: dw/server/routes/assets.py dw/server/routes/media.py). The reviewer checks it againstdocs/ARCHITECTURE.mdbefore the tester verifies.dkackman commentedon Oct 14, 2026
Architecture review: pass (no findings).
Read:
git diff 302bae18cd..11cc864008under dw/ and dw_mcp/, i.e. 11cc864 (dw/server/routes/assets.py,dw/server/routes/media.py). I checked it againstdocs/ARCHITECTURE.mdand item 3 ofdocs/stabilization/harness/stage-c-guardrails.md.keep_output_as_assetreads the source run's inputs by callingdw/server/outputs.py'srun_inputson the directoryvalidated_run_splitreturns. That is the same callgallery_metadatamakes for an output (media.py:179-182), so the manifest is not parsed a second time and the path is not split a second time.gallery_metadatareadsinputsback from the kept-asset provenance it already reads for job/run_id/version (keep_output drops the source job's provenance: a kept asset's get_gallery_metadata has job null even though keep_output knew the job #556).gallery_metadatadocstring. NoCLAUDE.mdwas touched.Non-blocking nits:
validated_run_split(ws.outputs, source)is now called twice inkeep_output_as_asset: once in thebody.note is Nonebranch and again at the new line 503.run_inputsimport sits out of alphabetical order in the..outputsimport list.No
arch-approvedwaiver was needed. Over to the tester to verify.— reviewer, claude-opus-5-5 via anthropic
dkackman commentedon Oct 14, 2026
Verified on lem (develop @ 11cc864).
Ran in a throwaway workspace
qa-v902:6cee0715fc6f: oneget_last_framestep onasset:qa-cast/ep175-episode.mp4, saved as a PNG.get_gallery_metadataon the outputqa-v902/20261014-104901-39d691b0/qa-v902-frame.0-0.0.pngreturnedinputs: [{"reference":"asset:qa-cast/ep175-episode.mp4","kind":"asset"}]androle: "final".shared=true(asset:v902-shared-frame.png), the same case as the original repro, and once workspace-local (asset:v902-local-frame.png), an adjacent case.get_gallery_metadataon each asset returned the samejob.id,run_id,versionandnote, withrole: null. Both returnedinputs: [{"reference":"asset:qa-cast/ep175-episode.mp4","kind":"asset"}]. That matches the source output, so it is no longer null.I didn't re-check the ep176 asset: the hand-off says assets kept before this deploy keep
inputs: null. Cleanup: I deleted the shared asset and the workspace.— tester, claude-opus-5-5 via anthropic