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
Migrated host: agent-only composer (no classic composer) — video t2v --project fails with UiSelectorDriftError, .settings-trigger-button hidden, no agent-mode-chip #799
(Without --project it fails earlier with 401 at labs.google/fx/api/trpc/project.createProject, as expected per #639.)
Result
Exit 23, before submit (no credits spent):
migrated host: the settings trigger (.settings-trigger-button) did not become visible within 30s on https://flow.google.com/project/<id> (host=migrated)
55 × locator resolved to hidden <button hidden="" ... aria-label="Settings trigger" class="... settings-trigger-button ...">
_exit_agent_mode returned absent — no button.agent-mode-chip[aria-pressed='true'] on the page.
Incident bundle: ui.json has all tag counts = 0 and the screenshot is blank white (same symptom as #792, but landscape 16:9 here).
What the project page actually shows (checked manually in a normal browser)
There is no Agent toggle/chip anywhere.
The only composer is the right-hand agent panel: session title ("Untitled session"), greeting "What do you want to create?", suggestion cards, and a prompt box at the bottom.
Next to the prompt box there is a "Settings" button. It opens an "Agent settings" pane with:
Default video generation: aspect 16:9 / 9:16, count x1–x4, model dropdown (Omni 1.1 Flash)
"Save" button
So on this cohort the classic migrated composer that MigratedComposer.ensure_editor waits for does not exist; model/aspect/count are agent defaults, not per-request settings.
Expected
Either a driver for the agent-only composer (set video defaults in Agent settings → type prompt → approve/"Never confirm" → wait → download), or a typed, pre-submit error that names this cohort instead of generic selector drift.
Acknowledging this properly — it sat a day without a comment, which it didn't deserve. The report is unusually complete: the manual DOM description is what makes it actionable.
This is a third cohort, and it is not the one we already handle. We have two migrated-host arms on record (#749): a classic composer, and an agent composer reached by button.agent-mode-chip[aria-pressed='true']. When that chip is pressed, .settings-trigger-button gets a bare hidden attribute — exactly the DOM you captured. So #751's recovery was built for a state that looks identical to yours from the outside. It un-presses the chip. You have no chip to un-press.
That is the important part of your report: yours isn't a stuck mode we can recover from, it's a composer that has no classic arm at all. Your observation that model / aspect / count live in Agent settings as defaults rather than per-request controls is the same finding from the other side — there is nowhere for --aspect 16:9 to go on that page.
Two things follow.
The generic exit 23 is our bug, and it's the cheap half.ensure_editor waits 30 s for a control that is structurally absent and reports selector drift. It should detect the agent-only composer before submit and fail with a typed error that names the cohort. That's next on our list and doesn't need your account.
A driver for the agent-only composer is the real feature and is a larger piece of work. We're not going to promise a date for it, but it's tracked here.
On your incident bundle — the all-zero ui.json and white screenshot are a separate bug of ours, not a property of your page: the driver parked the page on about:blank in a finally before the incident was captured, so we screenshotted the blank page. Fixed in #794, shipped in v0.73.2. That won't help you directly while #791 keeps you on a fork of 0.73.1; if you want a real bundle before 0.74.0, cherry-picking #794 onto your branch is a small, self-contained commit.
And to state the obvious constraint: you are blocked by #791, which is why you're running someone else's fork at all. That's the one we're fixing first. We're deliberately not cutting 0.74.0 until #791 and #795 are in it, because a release before then reaches neither you nor @ai4U23.
A driver for the agent-only composer is up for review in #824.
It was built and verified on an account in this cohort (Google AI Pro, en locale, no agent-mode-chip):
gflow image t2i — 3:4 × 2 images, and the MCP gflow_generate_image twin
gflow video t2v — a 4 s 9:16 clip, downloaded as MP4
How it works: aspect / count / model are set in Agent settings for the run and restored afterwards; the request goes to the agent in plain language; completion is read from the page. "Confirm before generating" follows a new GFLOW_CLI_AGENT_CONFIRM=account|always|never (default leaves your account's setting alone).
Not covered yet on this composer (exit 36 before anything is clicked): image-to-image, image-to-video, reference-to-video, character references, Agent instructions, and more than one video per request.
@Cstanish127 — one thing we could not measure: the request text is English, and your account is ru. If you can try the branch, whether the agent accepts it there would be very useful to know.
On trying the branch on a ru account: I can't run it as is. #824 is based on develop, and my account still can't pass login verification there (#791 is open), so gflow stops before the composer. If there is a way to try it with the #793-style fallback on top — or once #791 lands — I'm happy to run the t2i / t2v e2e on ru and report back.
Meanwhile I've been using the agent-only composer daily through small page-side JS snippets (no gflow), since 2026-09-14. Account: Google AI Pro, UI locale ru, ~60 Veo 3.1 Lite clips (1–3 image ingredients on most of them), a few Nano Banana 2 images, several projects. Below is what might be useful for #824 and its review. It's one account, so treat it as data points, not a spec.
Directly relevant to the review / open questions
English request text works on a ru account. Every one of my ~60 clips was requested in English on the Russian UI, and the agent accepted them. My wording was different from compose_video_directive, though: "Generate exactly one video clip using the default video settings. Do not generate images first and do not ask follow-up questions." followed by the description. I never tried "in a 16:9 aspect ratio" in the prose. I avoided it on purpose: my notes say an agent can read "16:9" as a count. That's a hunch, not a measurement on this composer.
"Confirm before generating" radios, DOM order on ru:input[type=radio] value 1 = «Всегда» (Always) first, value 2 = «Никогда» (Never) second — matches _CONFIRM_INDEX = {"always": 0, "never": 1} (review item 3), on one more account and locale.
The gate is not guaranteed in either mode. With «Никогда» no gate appears at all — the submit itself spends credits. With «Всегда» I once got an image generated without any gate. The "at most one confirmation" logic probably has to treat "zero gates" as a normal path.
Agent settings are per project, not per account. A new project came with «Всегда» and Omni 1.1 Flash, while my older project had «Никогда» and Veo 3.1 - Lite. Snapshot and restore should probably be keyed to the project (relevant to review item 1).
Requested count is not always honoured. With image default x2, the agent returned 1 image once. That's the under-count mirror of review item 2.
Outcomes the driver may need to recognise
Generation error tile:flow-error-tile («Ошибка Не удалось сгенерировать аудио…» — failed to generate audio) appears instead of a video tile. No pending tile is left and no new uuid comes, so a "pending == 0 and a new uuid" loop would wait until timeout. The count of error tiles grows by one. But old error tiles also mount lazily after a page load, so I only trust growth once nothing is pending.
Content refusal without any tile: the agent just replies («Похоже, этот контент нарушает наши правила» — this content seems to violate our rules). No pending tile, no error tile, no media. Seen repeatedly for scenes with children in a swimming pool, even with a long-sleeved rash guard. For video I stop when there is no pending tile, ≥20 s have passed since submit, and the last reply matches such a pattern — similar to IDLE_S for images.
Upload rejected: some image uploads fail with only a toast «Не удалось загрузить .» (could not upload), no reason given. In my case it was photos of a real child; a photo of an adult in the same format uploaded fine. Relevant once references are ported. Worth a typed, non-retryable error.
Result detection — pitfalls I hit
Lazy virtual grid (.scroll-viewport). Newest tiles don't render while the grid is scrolled down, and older tiles mount after the baseline was taken. "Not in the baseline" once made me re-download an old clip. What has held since: the grid is scrolled to top, the first tile is unknown, and no flow-pending-tile is left. That is the same hole as the surviving _tile_key(head) != baseline_head mutation.
Hidden tab. With document.visibilityState === 'hidden' (minimised window, locked screen), the ingredients popover stopped applying selections, lazy tiles lost their posters and page JS stalled. A visibility check before submit could turn that into a clear error instead of a timeout.
Collapsed agent panel. After saving Agent settings the panel sometimes collapsed to a short composer with no flow-agent-panel. It came back via the expand button (aria «Развернуть» on ru — I only have the label, not a structural anchor).
Ingredients in the agent-only composer (for when i2v / r2v are ported)
The flow that works for me:
«Добавить ингредиенты в окно запроса» (add ingredients) opens flow-add-menu-popover-content;
project assets are listed as [role=option] in flow-add-menu-asset-list;
clicking a recent asset attaches it straight away as flow-image-ingredient-chip in the prompt box;
an item from the «Все» (all) section is only selected and needs the «Добавить в запрос» (add to prompt) button;
the chip's img src carries the uuid.
I count chips after every attach, because a stray click can leave an extra one. Popover thumbnails load lazily, so matching by asset name was more reliable than by uuid. Uploads: «Загрузить» creates <input type=file multiple> and calls .click() on it. The first upload in a project shows flow-upload-consent-dialog.
«Начать новый сеанс» (new session) empties the chat (flow-chat-empty-state) and clears attached chips. I start every clip with it so earlier turns don't leak into the next request.
Timings on AI Pro
Timings:
Veo 3.1 Lite: the agent says "queued due to high demand", and the clip is ready in about 60–140 s.
Nano Banana 2: ~35–50 s.
Output via the tile menu, «720p Исходный размер» (original): h264 1280×720 24 fps + AAC, 8.0 s. The file is named after the agent's title.
Happy to run a specific probe or capture something on this account if it helps.
Fixed by #989 (v0.86.0): gflow now drives the agent-only composer for image t2i and video t2v. Reading the credit gate before approving it is tracked in #988. i2i, i2v and r2v on that composer exit 36 as "not ported yet".
Activity
ffroliva commentedon Sep 13, 2026
Acknowledging this properly — it sat a day without a comment, which it didn't deserve. The report is unusually complete: the manual DOM description is what makes it actionable.
This is a third cohort, and it is not the one we already handle. We have two migrated-host arms on record (#749): a classic composer, and an agent composer reached by
button.agent-mode-chip[aria-pressed='true']. When that chip is pressed,.settings-trigger-buttongets a barehiddenattribute — exactly the DOM you captured. So #751's recovery was built for a state that looks identical to yours from the outside. It un-presses the chip. You have no chip to un-press.That is the important part of your report: yours isn't a stuck mode we can recover from, it's a composer that has no classic arm at all. Your observation that model / aspect / count live in Agent settings as defaults rather than per-request controls is the same finding from the other side — there is nowhere for
--aspect 16:9to go on that page.Two things follow.
The generic exit 23 is our bug, and it's the cheap half.
ensure_editorwaits 30 s for a control that is structurally absent and reports selector drift. It should detect the agent-only composer before submit and fail with a typed error that names the cohort. That's next on our list and doesn't need your account.A driver for the agent-only composer is the real feature and is a larger piece of work. We're not going to promise a date for it, but it's tracked here.
On your incident bundle — the all-zero
ui.jsonand white screenshot are a separate bug of ours, not a property of your page: the driver parked the page onabout:blankin afinallybefore the incident was captured, so we screenshotted the blank page. Fixed in #794, shipped in v0.73.2. That won't help you directly while #791 keeps you on a fork of 0.73.1; if you want a real bundle before 0.74.0, cherry-picking #794 onto your branch is a small, self-contained commit.And to state the obvious constraint: you are blocked by #791, which is why you're running someone else's fork at all. That's the one we're fixing first. We're deliberately not cutting 0.74.0 until #791 and #795 are in it, because a release before then reaches neither you nor @ai4U23.
fix(799): close the council's findings, and measure the live controls
fix(799): narrow the retryable contract instead of widening six const…
fix(799): name the agent-only composer instead of calling it selector…
WAOmaster commentedon Sep 15, 2026
A driver for the agent-only composer is up for review in #824.
It was built and verified on an account in this cohort (Google AI Pro,
enlocale, noagent-mode-chip):gflow image t2i— 3:4 × 2 images, and the MCPgflow_generate_imagetwingflow video t2v— a 4 s 9:16 clip, downloaded as MP4How it works: aspect / count / model are set in Agent settings for the run and restored afterwards; the request goes to the agent in plain language; completion is read from the page. "Confirm before generating" follows a new
GFLOW_CLI_AGENT_CONFIRM=account|always|never(default leaves your account's setting alone).Not covered yet on this composer (exit 36 before anything is clicked): image-to-image, image-to-video, reference-to-video, character references, Agent instructions, and more than one video per request.
@Cstanish127 — one thing we could not measure: the request text is English, and your account is
ru. If you can try the branch, whether the agent accepts it there would be very useful to know.Cstanish127 commentedon Sep 15, 2026
Thanks @ffroliva for the thorough reply, and @WAOmaster for #824 — very welcome.
On trying the branch on a
ruaccount: I can't run it as is. #824 is based ondevelop, and my account still can't pass login verification there (#791 is open), so gflow stops before the composer. If there is a way to try it with the #793-style fallback on top — or once #791 lands — I'm happy to run the t2i / t2v e2e onruand report back.Meanwhile I've been using the agent-only composer daily through small page-side JS snippets (no gflow), since 2026-09-14. Account: Google AI Pro, UI locale
ru, ~60 Veo 3.1 Lite clips (1–3 image ingredients on most of them), a few Nano Banana 2 images, several projects. Below is what might be useful for #824 and its review. It's one account, so treat it as data points, not a spec.Directly relevant to the review / open questions
English request text works on a
ruaccount. Every one of my ~60 clips was requested in English on the Russian UI, and the agent accepted them. My wording was different fromcompose_video_directive, though: "Generate exactly one video clip using the default video settings. Do not generate images first and do not ask follow-up questions." followed by the description. I never tried "in a 16:9 aspect ratio" in the prose. I avoided it on purpose: my notes say an agent can read "16:9" as a count. That's a hunch, not a measurement on this composer."Confirm before generating" radios, DOM order on
ru:input[type=radio]value1= «Всегда» (Always) first, value2= «Никогда» (Never) second — matches_CONFIRM_INDEX = {"always": 0, "never": 1}(review item 3), on one more account and locale.The gate is not guaranteed in either mode. With «Никогда» no gate appears at all — the submit itself spends credits. With «Всегда» I once got an image generated without any gate. The "at most one confirmation" logic probably has to treat "zero gates" as a normal path.
Agent settings are per project, not per account. A new project came with «Всегда» and Omni 1.1 Flash, while my older project had «Никогда» and Veo 3.1 - Lite. Snapshot and restore should probably be keyed to the project (relevant to review item 1).
Requested count is not always honoured. With image default x2, the agent returned 1 image once. That's the under-count mirror of review item 2.
Outcomes the driver may need to recognise
Generation error tile:
flow-error-tile(«Ошибка Не удалось сгенерировать аудио…» — failed to generate audio) appears instead of a video tile. No pending tile is left and no new uuid comes, so a "pending == 0 and a new uuid" loop would wait until timeout. The count of error tiles grows by one. But old error tiles also mount lazily after a page load, so I only trust growth once nothing is pending.Content refusal without any tile: the agent just replies («Похоже, этот контент нарушает наши правила» — this content seems to violate our rules). No pending tile, no error tile, no media. Seen repeatedly for scenes with children in a swimming pool, even with a long-sleeved rash guard. For video I stop when there is no pending tile, ≥20 s have passed since submit, and the last reply matches such a pattern — similar to
IDLE_Sfor images.Upload rejected: some image uploads fail with only a toast «Не удалось загрузить .» (could not upload), no reason given. In my case it was photos of a real child; a photo of an adult in the same format uploaded fine. Relevant once references are ported. Worth a typed, non-retryable error.
Result detection — pitfalls I hit
Lazy virtual grid (
.scroll-viewport). Newest tiles don't render while the grid is scrolled down, and older tiles mount after the baseline was taken. "Not in the baseline" once made me re-download an old clip. What has held since: the grid is scrolled to top, the first tile is unknown, and noflow-pending-tileis left. That is the same hole as the surviving_tile_key(head) != baseline_headmutation.Tiles without any media src. After an extension reconnect, 38
flow-video-tileelements had no img/video src at all. The finished clip was only visible asflow-a2ui-video-option img.video-thumbnailin the chat, whichoptionsin feat(migrated): drive the agent-only composer for text-to-image and text-to-video (#799) #824 already reads. Good call.Hidden tab. With
document.visibilityState === 'hidden'(minimised window, locked screen), the ingredients popover stopped applying selections, lazy tiles lost their posters and page JS stalled. A visibility check before submit could turn that into a clear error instead of a timeout.Collapsed agent panel. After saving Agent settings the panel sometimes collapsed to a short composer with no
flow-agent-panel. It came back via the expand button (aria «Развернуть» onru— I only have the label, not a structural anchor).Ingredients in the agent-only composer (for when i2v / r2v are ported)
The flow that works for me:
flow-add-menu-popover-content;[role=option]inflow-add-menu-asset-list;flow-image-ingredient-chipin the prompt box;imgsrc carries the uuid.I count chips after every attach, because a stray click can leave an extra one. Popover thumbnails load lazily, so matching by asset name was more reliable than by uuid. Uploads: «Загрузить» creates
<input type=file multiple>and calls.click()on it. The first upload in a project showsflow-upload-consent-dialog.«Начать новый сеанс» (new session) empties the chat (
flow-chat-empty-state) and clears attached chips. I start every clip with it so earlier turns don't leak into the next request.Timings on AI Pro
Happy to run a specific probe or capture something on this account if it helps.
spike(799): drive the agent-only composer end to end — image and video
feat(config): GFLOW_CLI_AGENT_CONFIRM for the agent-only composer's c…
refactor(migrated): ensure_editor reports the composer kind; agent-on…
feat(migrated): drive the agent-only composer for t2i and t2v (ffroli…
fix(migrated): refuse up front only what neither composer takes (ffro…
fix(migrated): wait for aria-checked after an Agent-settings radio cl…
fix(migrated): agent-only video readiness from the pending tile, not …
docs+test(799): agent-only t2i/t2v documented, BDD-bound e2e for CLI,…
docs(799): agent-facing skill and USAGE exit-25 row describe the driv…
5 remaining items
feat(config): GFLOW_CLI_AGENT_CONFIRM for the agent-only composer's c…
refactor(migrated): ensure_editor reports the composer kind; agent-on…
feat(migrated): drive the agent-only composer for t2i and t2v (ffroli…
fix(migrated): refuse up front only what neither composer takes (ffro…
fix(migrated): wait for aria-checked after an Agent-settings radio cl…
fix(migrated): agent-only video readiness from the pending tile, not …
docs+test(799): agent-only t2i/t2v documented, BDD-bound e2e for CLI,…
docs(799): agent-facing skill and USAGE exit-25 row describe the driv…
fix(migrated): discard the Agent-settings draft when applying default…
docs(799): plan — branch review and PR approval recorded
chore(plugin): regenerate the shipped gflow-cli skill after the ffrol…
Merge upstream PR ffroliva#824: agent-only composer driver (ffroliva#799
Merge pull request #989 from ffroliva/feature/799-agent-only-composer
ffroliva commentedon Oct 24, 2026
Fixed by #989 (v0.86.0): gflow now drives the agent-only composer for
image t2iandvideo t2v. Reading the credit gate before approving it is tracked in #988. i2i, i2v and r2v on that composer exit 36 as "not ported yet".