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
video i2v: --duration is silently ignored when the duration tab probe fails (requested 4s, got 8s) #288
Observed (0.31.0, live run 2026-07-11, chalkboard i2v pilot)
gflow video i2v --duration 4 on the Frames submode (portrait, veo-lite, denon82 profile) produced an 8-second clip. The duration tab selector never matched and the failure was demoted to warnings:
Generation then proceeded with Flow's default (8s). The JSON result reports success with no indication the requested duration was dropped — the only evidence is ffprobe on the output file.
Why this matters
Duration is a contract parameter: downstream timeline math (scene slots in a Remotion cut) sizes freeze-holds and cut points from the requested value. A silent 4→8 substitution corrupts the edit plan without any failure signal. Same design principle as the #281 wrong-media fixes: when the UI automation cannot honor an explicit user parameter, fail fast (or at minimum surface it in the result payload), don't warn-and-continue.
Policy: explicit --duration + probe failure → hard error (new typed error, non-zero exit) unless a --best-effort style flag is passed. If warn-and-continue is kept for any path, the final JSON result must carry requested_duration vs effective_duration so callers can detect the substitution programmatically.
Repro context
3/3 i2v generations in the run showed the same probe failure; both completed clips measured 8.000s via ffprobe (one requested 4s).
Full structured logs available (correlation ids 17c1d945, 477bc557, 8ad4b3a1).
Fix in flight on draft PR #289: an explicit --duration whose duration_tab probe misses now raises UiSelectorDriftError (exit 23) with a debug_no_duration_tab.png viewport screenshot, instead of silently generating at Flow's default. Omitting --duration is unchanged.
The selector investigation itself stays open here. Leading hypothesis from the council review: locale-sensitive tab labels. The duration tabs are matched by visible text ([role='tab']:text-is('4s')) with no locale-invariant fallback — unlike the aspect tabs, which lead with crop_* icon ligatures, and this codebase has prior text-match rot on non-English accounts (upload-media, add-to-prompt tri-lingual fallback). A localized label like 4 s/4 с would miss text-is('4s') exactly as observed 3/3. When someone reproduces with a headed browser: please attach the debug screenshot and note the account locale of the profile (denon82) — if the label is localized, the fix is a locale-invariant anchor for the duration tab group, not a text-match patch.
Live investigation result (2026-07-11, denon82, credit-free): the duration_tab probe misses because the duration control is absent from this cohort's Frames-submode settings popover — not a renamed/localized tab.
Evidence: PR #289's fail-fast fired live (--duration 4 → exit 23, aborted pre-submit, saving the 10-credit generation) and captured debug_no_duration_tab.png. The popover shows, in full: Imagem/Vídeo mode tabs → Frames/Elementos sub-mode → aspect 9:16/16:9 → count 1x/x2/x3/x4 → model dropdown (Veo 3.1 - Lite) → 'A geração vai usar 10 créditos'. No duration row.
The locale hypothesis from the council review is refuted: the UI renders in Portuguese (labs.google/fx/pt/... — the profile's Chrome locale wins, as documented on #56) and the sibling count tabs (1x/x2, same text-match strategy) match fine.
Open question that remains on this issue: did Flow remove clip-length selection for this cohort/model, or move it (e.g. model-dependent, or post-generation)? Until answered, --duration cannot be honored on affected cohorts and #289's typed error is the correct permanent behavior there, with 'omit --duration' as the workaround.
Also observed while investigating (same session): project f6caf027 opens in the full-page media-library UI (#174 shape) with an 'Agente' composer pill, where even the mode_switch_trigger probe fails — fresh projects still get the classic composer and work. Worth a separate eye when tackling #174.
Shipped in PR #289 (merged to develop, releasing in v0.32.0) and live-verified: --duration 4 on the affected cohort now aborts pre-submit with UiSelectorDriftError (exit 23) + debug screenshot instead of silently producing an 8s clip — the run saved the 10-credit generation.
Root cause confirmed with screenshot evidence (comment above): the duration control is absent from this cohort's Frames-submode settings popover — not selector rot, nothing to patch. The 'removed vs moved by Flow' question is tracked in KNOWN_ISSUES ('Video duration tab probe misses…'); if Flow re-introduces the control, the existing selector cascade should match it again and the fail-fast simply stops firing. Closing as the gflow-side behavior is complete and correct.
Activity
ffroliva commentedon Jul 11, 2026
Fix in flight on draft PR #289: an explicit
--durationwhoseduration_tabprobe misses now raisesUiSelectorDriftError(exit 23) with adebug_no_duration_tab.pngviewport screenshot, instead of silently generating at Flow's default. Omitting--durationis unchanged.The selector investigation itself stays open here. Leading hypothesis from the council review: locale-sensitive tab labels. The duration tabs are matched by visible text (
[role='tab']:text-is('4s')) with no locale-invariant fallback — unlike the aspect tabs, which lead withcrop_*icon ligatures, and this codebase has prior text-match rot on non-English accounts (upload-media, add-to-prompt tri-lingual fallback). A localized label like4 s/4 сwould misstext-is('4s')exactly as observed 3/3. When someone reproduces with a headed browser: please attach the debug screenshot and note the account locale of the profile (denon82) — if the label is localized, the fix is a locale-invariant anchor for the duration tab group, not a text-match patch.ffroliva commentedon Jul 11, 2026
Live investigation result (2026-07-11, denon82, credit-free): the
duration_tabprobe misses because the duration control is absent from this cohort's Frames-submode settings popover — not a renamed/localized tab.Evidence: PR #289's fail-fast fired live (
--duration 4→ exit 23, aborted pre-submit, saving the 10-credit generation) and captureddebug_no_duration_tab.png. The popover shows, in full: Imagem/Vídeo mode tabs → Frames/Elementos sub-mode → aspect 9:16/16:9 → count 1x/x2/x3/x4 → model dropdown (Veo 3.1 - Lite) → 'A geração vai usar 10 créditos'. No duration row.The locale hypothesis from the council review is refuted: the UI renders in Portuguese (
labs.google/fx/pt/...— the profile's Chrome locale wins, as documented on #56) and the sibling count tabs (1x/x2, same text-match strategy) match fine.Open question that remains on this issue: did Flow remove clip-length selection for this cohort/model, or move it (e.g. model-dependent, or post-generation)? Until answered,
--durationcannot be honored on affected cohorts and #289's typed error is the correct permanent behavior there, with 'omit--duration' as the workaround.Also observed while investigating (same session): project f6caf027 opens in the full-page media-library UI (#174 shape) with an 'Agente' composer pill, where even the
mode_switch_triggerprobe fails — fresh projects still get the classic composer and work. Worth a separate eye when tackling #174.Merge pull request #289 from ffroliva/bugfix/288-duration-fail-fast
ffroliva commentedon Jul 11, 2026
Shipped in PR #289 (merged to develop, releasing in v0.32.0) and live-verified:
--duration 4on the affected cohort now aborts pre-submit withUiSelectorDriftError(exit 23) + debug screenshot instead of silently producing an 8s clip — the run saved the 10-credit generation.Root cause confirmed with screenshot evidence (comment above): the duration control is absent from this cohort's Frames-submode settings popover — not selector rot, nothing to patch. The 'removed vs moved by Flow' question is tracked in KNOWN_ISSUES ('Video duration tab probe misses…'); if Flow re-introduces the control, the existing selector cascade should match it again and the fail-fast simply stops firing. Closing as the gflow-side behavior is complete and correct.
fix(video): fail closed on count-tab miss; date the omni-flash i2v re…
fix(video): fail closed on count-tab miss; date the omni-flash i2v re…
docs(live): evidence ledger for the playwright 1.61 raise
chore(deps): raise playwright 1.59.x -> 1.61.x (needs a live generati…
spike(video): per-model capability matrix — root-causes #451/#288 dur…
spike(video): confirm the model capability matrix on a 2nd account (p…
fix(video): address /code-review findings on the capability guards
test(json): repoint the video fixture at omni-flash (CI regression)
fix(video): model-capability guards — root-cause fix for #451/#288 (#537
fix(video): fail fast when the duration tab probe misses an explicit …
fix(video): fail fast when the duration tab probe misses an explicit …
Merge pull request ffroliva#289 from ffroliva/bugfix/288-duration-fai…
chore(release): gate PROJECT_STATUS currency; fix rotted i2v e2e tests (
fix(cli,mcp): --duration with no --model no longer dies as "Unexpecte…
docs(known-issues): correct the #288 row after council review
docs(known-issues): record duration control as cohort-dependent, not …