Skip to content

Video panel stack: low-priority follow-ups from adversarial reviews of #126-#135 #138

Description

@lstein

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions