Fresh-context adversarial reviews of the video panel stack (#123-#135) were run before merge. Medium/high findings were fixed on the branches; this issue collects the remaining low-priority items. (#125's items are tracked separately in #136.)
Graph compilation (#126)
- Extend-mode metadata
num_frames records the settings value, but the delivered concat has trimmedFrames + numFrames - 2 frames — fine for recall, wrong as provenance.
buildWanVideoGraph ignores getVideoPromptPolicy().negativeUsedInGraph: at CFG 1 (accelerator default) every Wan run pays a pointless UMT5-XXL encode and metadata claims a negative prompt the denoise ignored.
- Test gaps: no
pos_cond/neg_cond → denoise edge assertions; H3 first+last and H3 extend-to-destination are untested; compiled field names are never validated against the backend schema.
Panel shell (#127)
- Invoke can be disabled by a stale stored model while the compile path would succeed via catalog fallback (self-heals when the Video tab mounts).
- Legacy-rehydrated video queue rows fall through to image dims and lose their prompt in the history list (retry submission itself is correct).
- Test gaps: video branches of
compileInvocationSnapshot/enqueueCompiledSnapshot, IterationsField, and the mount write-back have no tests.
Conditioning media (#128)
- Frame-count estimates that overshoot by >4 (or clips with no probed fps, which fall back to 16) can still compile out-of-range positive trim indices; the real fix is storing the probed frame count in video records server-side.
- Degenerate 1-2 frame estimates produce a trim record whose default endFrame exceeds the slider max.
- Extend-mode FPS display: the disabled slider shows
values.fps while duration text and the compiled graph use the source clip's fps.
- Cross-slot async upload race: whichever of first-frame/initial-video finishes last silently clears the other (terminal state is still exclusive; UX only).
- No migration for the pre-merge negative-endFrame persisted convention (unreleased-branch projects only).
videoPolicies "cannot be combined" validation reason is defense-in-depth that is now unreachable (rollback path fixed); the mutual exclusion in the UI setters deserves a direct test.
Concepts / components (#129)
- Weight 0 (or negative) on an accelerator LoRA keeps the fast path "alive" — indistinguishable in effect from the disable case that breaks it.
- Duplicate LoRA keys in hand-edited persisted state are never deduped (duplicate React keys, joint updates).
- The component-source test cannot detect loss of the Diffusers-only filter clause.
Polish / entry points (#131)
isVideoSettings doc claims strictness over keys normalize invents, but healing now invents more keys than the strict list covers (no external callers today).
- A corrupt persisted video queue item now heals to prompt ''/seed 0 on retry instead of becoming an invalid submission.
- The launchpad "Generate a video" intent leaves the Generate (image) form active and shows with zero video-capable models installed (matches the upscale intent's pattern).
VideoHeaderActions and the two context-menu handlers have no tests.
Recall (#134)
- Target resolution is unrecoverable for media-conditioned runs (recorded dims derive from the media ratio, so the exact-preset inversion fails); an exact inversion over (media ratio × resolution options) is possible since the media is being recalled.
- Component slots round-trip asymmetrically: absent recorded components never clear panel components, and a recorded key is applied without a type/slot-filter check (transient — the sync slot-filters at render).
- The executor strips 'media' from the reported fields when nothing rehydrates, even when the patch still clears held media.
- Accelerator-by-key fallout: pair reinstalled under new keys → loras cleared + accelerator off, but recalled steps=4/CFG=1 stay — silent non-distilled 4-step setup behind a toast claiming "concepts".
executeVideoRecall has no test file (the image sibling does); videoRecall.test.ts uses arrayContaining, so silently dropped fields pass.
Expert warning (#135)
- Pathological edge: a non-string-variant Wan main plus a mis-tagged single-expert file can orphan a
wanLowNoiseModel value in a hidden slot after a swap.
- The swap path silently discards the selection transition's
clearedLabels (a legitimate "Acceleration" clearing would be un-toasted in the same edge).
🤖 Generated with Claude Code
https://claude.ai/code/session_01LUjUcPHzQCoL7dqgsVzi63
Fresh-context adversarial reviews of the video panel stack (#123-#135) were run before merge. Medium/high findings were fixed on the branches; this issue collects the remaining low-priority items. (#125's items are tracked separately in #136.)
Graph compilation (#126)
num_framesrecords the settings value, but the delivered concat hastrimmedFrames + numFrames - 2frames — fine for recall, wrong as provenance.buildWanVideoGraphignoresgetVideoPromptPolicy().negativeUsedInGraph: at CFG 1 (accelerator default) every Wan run pays a pointless UMT5-XXL encode and metadata claims a negative prompt the denoise ignored.pos_cond/neg_cond→ denoise edge assertions; H3 first+last and H3 extend-to-destination are untested; compiled field names are never validated against the backend schema.Panel shell (#127)
compileInvocationSnapshot/enqueueCompiledSnapshot,IterationsField, and the mount write-back have no tests.Conditioning media (#128)
values.fpswhile duration text and the compiled graph use the source clip's fps.videoPolicies"cannot be combined" validation reason is defense-in-depth that is now unreachable (rollback path fixed); the mutual exclusion in the UI setters deserves a direct test.Concepts / components (#129)
Polish / entry points (#131)
isVideoSettingsdoc claims strictness over keys normalize invents, but healing now invents more keys than the strict list covers (no external callers today).VideoHeaderActionsand the two context-menu handlers have no tests.Recall (#134)
executeVideoRecallhas no test file (the image sibling does);videoRecall.test.tsusesarrayContaining, so silently dropped fields pass.Expert warning (#135)
wanLowNoiseModelvalue in a hidden slot after a swap.clearedLabels(a legitimate "Acceleration" clearing would be un-toasted in the same edge).🤖 Generated with Claude Code
https://claude.ai/code/session_01LUjUcPHzQCoL7dqgsVzi63