gflow-cli 0.32.1__tar.gz → 0.34.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (531) hide show
  1. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/.env.template +27 -3
  2. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/AGENTS.md +1 -0
  3. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/CHANGELOG.md +31 -1
  4. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/CONTRIBUTING.md +13 -0
  5. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/KNOWN_ISSUES.md +3 -0
  6. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/PKG-INFO +1 -1
  7. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/CONFIGURATION.md +27 -6
  8. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/DEBUGGING.md +32 -0
  9. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/INDEX.md +1 -1
  10. gflow_cli-0.34.0/docs/LIVE_VERIFICATION_v0.33.0.md +53 -0
  11. gflow_cli-0.34.0/docs/LIVE_VERIFICATION_v0.34.0.md +49 -0
  12. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/USAGE.md +13 -1
  13. gflow_cli-0.34.0/docs/superpowers/spikes/2026-07-12-ui-cohort-backend-config.md +87 -0
  14. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/pyproject.toml +1 -1
  15. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/skills/pr-council-review/SKILL.md +15 -3
  16. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/__init__.py +1 -1
  17. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/api/image.py +4 -0
  18. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/api/transports/drivers/factory.py +38 -9
  19. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/api/transports/ui_automation.py +24 -52
  20. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/api/transports/ui_automation_video.py +870 -52
  21. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/api/video.py +11 -0
  22. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/cli_image.py +77 -4
  23. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/cli_video.py +70 -0
  24. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/config.py +150 -5
  25. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/data/queries.py +37 -0
  26. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/errors.py +42 -0
  27. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/image_batch.py +57 -8
  28. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/mcp/tools.py +15 -1
  29. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/worker/daemon.py +2 -1
  30. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/transports/drivers/test_factory.py +4 -36
  31. gflow_cli-0.34.0/tests/api/transports/drivers/test_ui_mode.py +276 -0
  32. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/transports/test_ui_automation.py +41 -46
  33. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/transports/test_ui_automation_batch.py +5 -4
  34. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/transports/test_ui_automation_video.py +1165 -8
  35. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/cli/test_cli_video.py +124 -0
  36. gflow_cli-0.34.0/tests/image_batch/test_jitter_config.py +253 -0
  37. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/mcp/test_cli_parity.py +6 -0
  38. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/test_data_queries.py +18 -0
  39. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/uv.lock +1 -1
  40. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/.claude/README.md +0 -0
  41. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/.claude/commands/gflow/active.md +0 -0
  42. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/.claude/commands/gflow/branch-review.md +0 -0
  43. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/.claude/commands/gflow/changelog.md +0 -0
  44. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/.claude/commands/gflow/check.md +0 -0
  45. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/.claude/commands/gflow/doc-review.md +0 -0
  46. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/.claude/commands/gflow/issue-assessment.md +0 -0
  47. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/.claude/commands/gflow/issue-resolve.md +0 -0
  48. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/.claude/commands/gflow/known-issues.md +0 -0
  49. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/.claude/commands/gflow/next.md +0 -0
  50. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/.claude/commands/gflow/plan.md +0 -0
  51. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/.claude/commands/gflow/pr-council-review.md +0 -0
  52. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/.claude/commands/gflow/predict.md +0 -0
  53. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/.claude/commands/gflow/release.md +0 -0
  54. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/.claude/commands/gflow/scenario.md +0 -0
  55. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/.claude/commands/gflow/sonar.md +0 -0
  56. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/.claude/commands/gflow/status.md +0 -0
  57. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/.gitattributes +0 -0
  58. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/.github/CODEOWNERS +0 -0
  59. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  60. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/.github/copilot-instructions.md +0 -0
  61. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/.github/dependabot.yml +0 -0
  62. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/.github/workflows/ci.yml +0 -0
  63. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/.github/workflows/external-pr-triage.yml +0 -0
  64. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/.github/workflows/governance-advisory.yml +0 -0
  65. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/.github/workflows/governance-benchmark.yml +0 -0
  66. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/.github/workflows/main-base-guard.yml +0 -0
  67. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/.github/workflows/release.yml +0 -0
  68. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/.gitignore +0 -0
  69. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/.gitleaks.toml +0 -0
  70. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/.pre-commit-config.yaml +0 -0
  71. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/.secrets.baseline +0 -0
  72. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/CLAUDE.md +0 -0
  73. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/CONFIGURATION.md +0 -0
  74. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/DISCLAIMER.md +0 -0
  75. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/GEMINI.md +0 -0
  76. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/LICENSE +0 -0
  77. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/PLAN.md +0 -0
  78. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/README.md +0 -0
  79. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/RELEASE.md +0 -0
  80. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/ROADMAP.md +0 -0
  81. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/conftest.py +0 -0
  82. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docker-compose.yml +0 -0
  83. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/AGENT_GUIDE.md +0 -0
  84. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/AGENT_UI_E2E.md +0 -0
  85. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/AGENT_UI_RECON.md +0 -0
  86. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/ARCHITECTURE.md +0 -0
  87. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/AUTHENTICATION.md +0 -0
  88. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/CHARACTER.md +0 -0
  89. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/CHARACTER_RECON.md +0 -0
  90. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/DATA_LAYER.md +0 -0
  91. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/DEMOS.md +0 -0
  92. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/DEVELOPMENT.md +0 -0
  93. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/E2E_TESTING.md +0 -0
  94. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/EXTERNAL_STORAGE.md +0 -0
  95. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/GITHUB.md +0 -0
  96. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
  97. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
  98. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/INSTRUCTIONS.md +0 -0
  99. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
  100. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
  101. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
  102. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
  103. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
  104. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
  105. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
  106. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
  107. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
  108. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
  109. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
  110. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
  111. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/LIVE_VERIFICATION_v0.21.0.md +0 -0
  112. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/LIVE_VERIFICATION_v0.22.0.md +0 -0
  113. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/LIVE_VERIFICATION_v0.23.0.md +0 -0
  114. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/LIVE_VERIFICATION_v0.24.0.md +0 -0
  115. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/LIVE_VERIFICATION_v0.25.0.md +0 -0
  116. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/LIVE_VERIFICATION_v0.26.0.md +0 -0
  117. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/LIVE_VERIFICATION_v0.27.0.md +0 -0
  118. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/LIVE_VERIFICATION_v0.27.1.md +0 -0
  119. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/LIVE_VERIFICATION_v0.28.0.md +0 -0
  120. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/LIVE_VERIFICATION_v0.29.0.md +0 -0
  121. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/LIVE_VERIFICATION_v0.30.0.md +0 -0
  122. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/LIVE_VERIFICATION_v0.31.0.md +0 -0
  123. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/LIVE_VERIFICATION_v0.32.0.md +0 -0
  124. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/LIVE_VERIFICATION_v0.32.1.md +0 -0
  125. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
  126. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
  127. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
  128. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
  129. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
  130. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/MCP.md +0 -0
  131. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/MOVIE.md +0 -0
  132. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/PROJECT_STATUS.md +0 -0
  133. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/PROMPT_EXPANSION.md +0 -0
  134. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/SECURITY.md +0 -0
  135. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/TOOLS.md +0 -0
  136. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/USER_GUIDE.md +0 -0
  137. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/assets/demo-split-pf.gif +0 -0
  138. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/assets/example-run.gif +0 -0
  139. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/assets/examples.webp +0 -0
  140. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/medium_tutorial.md +0 -0
  141. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/schemas/movie-handoff.schema.json +0 -0
  142. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/sonar-cleanup-tracker.md +0 -0
  143. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
  144. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +0 -0
  145. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +0 -0
  146. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +0 -0
  147. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +0 -0
  148. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +0 -0
  149. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +0 -0
  150. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +0 -0
  151. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +0 -0
  152. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +0 -0
  153. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/superpowers/plans/2026-07-09-camoufox-adoption/PLAN.md +0 -0
  154. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/superpowers/research/2026-06-27-tool-abstraction-evaluation.md +0 -0
  155. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/superpowers/specs/2026-06-29-issue-assessment-workflow-design.md +0 -0
  156. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/docs/superpowers/spikes/2026-07-09-camoufox-waf-403.md +0 -0
  157. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/examples/README.md +0 -0
  158. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/examples/batch_from_config.py +0 -0
  159. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/examples/multi_prompt_t2i.py +0 -0
  160. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/examples/sample_config.json +0 -0
  161. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/examples/sample_prompts.txt +0 -0
  162. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/examples/single_image_t2i.py +0 -0
  163. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/examples/workflow_chain.py +0 -0
  164. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/llms.txt +0 -0
  165. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/samples/README.md +0 -0
  166. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/samples/captured/01_upload_image.json +0 -0
  167. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
  168. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
  169. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/samples/captured/04_archive_workflow.json +0 -0
  170. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/samples/captured/05_createProject.json +0 -0
  171. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/samples/captured/06_batchGenerateImages.json +0 -0
  172. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
  173. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
  174. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
  175. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
  176. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
  177. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/samples/captured/12_create_scene.json +0 -0
  178. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
  179. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/samples/captured/14_get_scene_workflows.json +0 -0
  180. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
  181. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/ci/check_doc_links.py +0 -0
  182. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/ci/check_materiality.py +0 -0
  183. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/ci/check_repo_hygiene.py +0 -0
  184. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/debug_editor.py +0 -0
  185. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/debug_gen_settings.py +0 -0
  186. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/debug_settings.py +0 -0
  187. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/_recording_client.py +0 -0
  188. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/_spike_common.py +0 -0
  189. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/active_plan.py +0 -0
  190. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/analyze_agent_ui_capture.py +0 -0
  191. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
  192. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
  193. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
  194. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
  195. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
  196. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/capture_locale_invariants.py +0 -0
  197. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
  198. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/character_create_spike.py +0 -0
  199. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/character_create_spike_v2.py +0 -0
  200. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/dump_character_selectors.js +0 -0
  201. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/make_project.py +0 -0
  202. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/materiality_backtest.py +0 -0
  203. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/monitor_pr_38.py +0 -0
  204. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/patch_character.py +0 -0
  205. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/skillopt/README.md +0 -0
  206. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/skillopt/harness.py +0 -0
  207. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/skillopt/tasks.json +0 -0
  208. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/spike_char_editor_dom.py +0 -0
  209. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/spike_char_gen_capture.py +0 -0
  210. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
  211. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
  212. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
  213. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
  214. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
  215. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
  216. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
  217. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
  218. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
  219. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/spike_movie_picker_select.py +0 -0
  220. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/spike_movie_voice_list.py +0 -0
  221. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/spike_patch_entity.py +0 -0
  222. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/dev/spike_patchright.py +0 -0
  223. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/diag/README.md +0 -0
  224. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/diag/capture_flow_traffic.py +0 -0
  225. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/diag/memory_profile.py +0 -0
  226. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/diag/recaptcha_mint.py +0 -0
  227. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
  228. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/e2e/capture_agent_toggle.py +0 -0
  229. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/record_demo.ps1 +0 -0
  230. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/smoke_image.py +0 -0
  231. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/smoke_real_chrome_image.py +0 -0
  232. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/smoke_video_editor.py +0 -0
  233. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/smoke_worker_style.py +0 -0
  234. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/spike_waf_camoufox.py +0 -0
  235. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/scripts/verify_chrome_auth_viability.py +0 -0
  236. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/skills/README.md +0 -0
  237. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/skills/gflow-cli/SKILL.md +0 -0
  238. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/skills/issue-assessment/SKILL.md +0 -0
  239. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/skills/issue-resolve/SKILL.md +0 -0
  240. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/skills/plan/SKILL.md +0 -0
  241. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/skills/predict/SKILL.md +0 -0
  242. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/skills/scenario/SKILL.md +0 -0
  243. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/skills/status/SKILL.md +0 -0
  244. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/sonar-project.properties +0 -0
  245. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/__main__.py +0 -0
  246. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/_cli_helpers.py +0 -0
  247. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/api/__init__.py +0 -0
  248. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/api/_engine.py +0 -0
  249. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/api/_retry.py +0 -0
  250. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
  251. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/api/character.py +0 -0
  252. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/api/client.py +0 -0
  253. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/api/dto.py +0 -0
  254. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/api/image_upscale.py +0 -0
  255. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/api/recaptcha.py +0 -0
  256. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/api/routes.py +0 -0
  257. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/api/scene.py +0 -0
  258. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/api/transports/__init__.py +0 -0
  259. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/api/transports/_common.py +0 -0
  260. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
  261. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/api/transports/base.py +0 -0
  262. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
  263. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/api/transports/drivers/agentic.py +0 -0
  264. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/api/transports/drivers/base.py +0 -0
  265. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/api/transports/drivers/classic.py +0 -0
  266. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
  267. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
  268. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
  269. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
  270. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/auth/__init__.py +0 -0
  271. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/auth/base.py +0 -0
  272. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/auth/cookies.py +0 -0
  273. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/auth/factory.py +0 -0
  274. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
  275. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/auth/real_chrome.py +0 -0
  276. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/auth/strategies.py +0 -0
  277. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/auth/verification.py +0 -0
  278. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/browser_manager.py +0 -0
  279. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/chain.py +0 -0
  280. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/chain_manifest.py +0 -0
  281. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/cli.py +0 -0
  282. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/cli_character.py +0 -0
  283. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/cli_data.py +0 -0
  284. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/cli_instructions.py +0 -0
  285. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/cli_models.py +0 -0
  286. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/cli_movie.py +0 -0
  287. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/cli_run.py +0 -0
  288. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/cli_scene.py +0 -0
  289. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/cli_tools.py +0 -0
  290. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/composition.py +0 -0
  291. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/data/__init__.py +0 -0
  292. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/data/chain_repo.py +0 -0
  293. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
  294. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
  295. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
  296. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
  297. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
  298. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
  299. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/data/migrations/0007_queue.sql +0 -0
  300. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/data/migrations/0008_add_operation_expanded_prompt.sql +0 -0
  301. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
  302. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/data/models.py +0 -0
  303. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/data/recorder.py +0 -0
  304. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/data/redaction.py +0 -0
  305. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/data/repository.py +0 -0
  306. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/data/store.py +0 -0
  307. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/exceptions.py +0 -0
  308. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/json_output.py +0 -0
  309. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/manifest.py +0 -0
  310. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/mcp/__init__.py +0 -0
  311. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/mcp/prompts.py +0 -0
  312. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/mcp/resources.py +0 -0
  313. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/mcp/server.py +0 -0
  314. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/media.py +0 -0
  315. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/movie_manifest.py +0 -0
  316. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/observability.py +0 -0
  317. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/paths.py +0 -0
  318. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/profile_store.py +0 -0
  319. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/services/__init__.py +0 -0
  320. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/services/character_create.py +0 -0
  321. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/storage.py +0 -0
  322. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/tools/__init__.py +0 -0
  323. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/tools/banned.py +0 -0
  324. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/tools/builtin/__init__.py +0 -0
  325. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/tools/builtin/creative-director.toml +0 -0
  326. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/tools/expander.py +0 -0
  327. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/tools/invocation.py +0 -0
  328. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/tools/loader.py +0 -0
  329. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/tools/registry.py +0 -0
  330. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/tools/runtime.py +0 -0
  331. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/tools/spec.py +0 -0
  332. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/ui/app.py +0 -0
  333. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/ui/server.py +0 -0
  334. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/src/gflow_cli/worker/queue.py +0 -0
  335. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tasks/lessons.md +0 -0
  336. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/test_assets/sample_batch.json +0 -0
  337. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/test_assets/sample_batch.tsv +0 -0
  338. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/test_assets/sample_batch_invalid.tsv +0 -0
  339. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/__init__.py +0 -0
  340. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/__init__.py +0 -0
  341. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/fixtures/character_gen_response.json +0 -0
  342. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/fixtures/patch_entity_response.json +0 -0
  343. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/test_aisandbox_auth_error.py +0 -0
  344. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
  345. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/test_bearer_redaction.py +0 -0
  346. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/test_character.py +0 -0
  347. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/test_client.py +0 -0
  348. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/test_client_character.py +0 -0
  349. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/test_client_delete_characters.py +0 -0
  350. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/test_client_generate_character.py +0 -0
  351. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/test_client_image.py +0 -0
  352. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/test_client_launch_kwargs.py +0 -0
  353. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/test_client_patch_entity.py +0 -0
  354. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/test_client_scene.py +0 -0
  355. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/test_client_upscale.py +0 -0
  356. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/test_concurrency.py +0 -0
  357. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/test_dto.py +0 -0
  358. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/test_engine.py +0 -0
  359. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/test_image.py +0 -0
  360. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/test_image_dto.py +0 -0
  361. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/test_image_upscale.py +0 -0
  362. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/test_post_json_aisandbox_auth.py +0 -0
  363. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/test_recaptcha.py +0 -0
  364. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/test_retry.py +0 -0
  365. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/test_routes.py +0 -0
  366. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/test_routes_character.py +0 -0
  367. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/test_routes_scene.py +0 -0
  368. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/test_sapisidhash_helper.py +0 -0
  369. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/test_scene_models.py +0 -0
  370. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/test_video.py +0 -0
  371. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/test_video_request.py +0 -0
  372. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/transports/__init__.py +0 -0
  373. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/transports/conftest.py +0 -0
  374. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/transports/drivers/__init__.py +0 -0
  375. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/transports/drivers/test_agentic.py +0 -0
  376. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/transports/drivers/test_classic.py +0 -0
  377. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/transports/test_base.py +0 -0
  378. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/transports/test_bearer.py +0 -0
  379. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/transports/test_common.py +0 -0
  380. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
  381. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/transports/test_factory.py +0 -0
  382. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/transports/test_fingerprint.py +0 -0
  383. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/transports/test_sapisidhash.py +0 -0
  384. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/transports/test_selector_symmetry.py +0 -0
  385. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/transports/test_transport_timeout.py +0 -0
  386. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
  387. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/api/transports/test_ui_character_editor.py +0 -0
  388. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/auth/strategies/test_factory.py +0 -0
  389. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/auth/strategies/test_strategies.py +0 -0
  390. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/auth/test_cookies.py +0 -0
  391. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/auth/test_verification.py +0 -0
  392. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/cli/__init__.py +0 -0
  393. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/cli/test_cli_auth_list.py +0 -0
  394. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/cli/test_cli_character.py +0 -0
  395. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/cli/test_cli_character_create.py +0 -0
  396. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/cli/test_cli_data.py +0 -0
  397. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/cli/test_cli_image.py +0 -0
  398. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
  399. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/cli/test_cli_image_selector_drift.py +0 -0
  400. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/cli/test_cli_image_upscale.py +0 -0
  401. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/cli/test_cli_instructions.py +0 -0
  402. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/cli/test_cli_models.py +0 -0
  403. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/cli/test_cli_movie.py +0 -0
  404. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/cli/test_cli_run.py +0 -0
  405. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/cli/test_cli_scene.py +0 -0
  406. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/cli/test_cli_tools.py +0 -0
  407. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/cli/test_cli_video_chain.py +0 -0
  408. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/cli/test_error_handling.py +0 -0
  409. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/cli/test_helpers.py +0 -0
  410. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/cli/test_movie_manifest.py +0 -0
  411. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/cli/test_movie_manifest_style_variants.py +0 -0
  412. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/cli/test_settings_validation.py +0 -0
  413. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
  414. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/composition/test_character.py +0 -0
  415. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/composition/test_compose_prompt.py +0 -0
  416. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/composition/test_handoff.py +0 -0
  417. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/composition/test_style_variants.py +0 -0
  418. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/composition/test_style_variants_e2e.py +0 -0
  419. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/conftest.py +0 -0
  420. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/data/__init__.py +0 -0
  421. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/data/test_chain_repo.py +0 -0
  422. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/data/test_find_incomplete_character.py +0 -0
  423. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/data/test_models.py +0 -0
  424. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/data/test_packaging.py +0 -0
  425. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/data/test_recorder.py +0 -0
  426. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/data/test_recorder_character.py +0 -0
  427. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/data/test_redaction.py +0 -0
  428. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/data/test_repository.py +0 -0
  429. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/data/test_scene_persistence.py +0 -0
  430. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/data/test_settings_and_errors.py +0 -0
  431. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/data/test_store_migrations.py +0 -0
  432. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/dev/test_recording_client.py +0 -0
  433. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/e2e/__init__.py +0 -0
  434. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/e2e/conftest.py +0 -0
  435. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
  436. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
  437. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/e2e/test_chain_e2e.py +0 -0
  438. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/e2e/test_character_create_e2e.py +0 -0
  439. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/e2e/test_daemon_e2e.py +0 -0
  440. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/e2e/test_data_layer_e2e.py +0 -0
  441. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/e2e/test_i2v_flags_e2e.py +0 -0
  442. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/e2e/test_image_batch_e2e.py +0 -0
  443. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
  444. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/e2e/test_json_output_e2e.py +0 -0
  445. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/e2e/test_live_agentic_instructions.py +0 -0
  446. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
  447. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/e2e/test_scene_compose_live.py +0 -0
  448. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/e2e/test_tools_e2e.py +0 -0
  449. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/e2e/test_transports_e2e.py +0 -0
  450. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
  451. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
  452. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/features/__init__.py +0 -0
  453. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/features/auth.feature +0 -0
  454. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/features/auth_login.feature +0 -0
  455. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/features/character_create.feature +0 -0
  456. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/features/character_read.feature +0 -0
  457. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/features/conftest.py +0 -0
  458. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/features/image.feature +0 -0
  459. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/features/image_upscale.feature +0 -0
  460. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/features/instructions.feature +0 -0
  461. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/features/locale_picker_include.feature +0 -0
  462. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/features/test_auth_login_steps.py +0 -0
  463. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/features/test_auth_steps.py +0 -0
  464. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/features/test_character_create_steps.py +0 -0
  465. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/features/test_character_read_steps.py +0 -0
  466. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/features/test_image_steps.py +0 -0
  467. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/features/test_image_upscale_steps.py +0 -0
  468. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/features/test_instructions_steps.py +0 -0
  469. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/features/test_locale_picker_include_steps.py +0 -0
  470. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/features/test_step_collision_guard.py +0 -0
  471. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/features/test_video_agent_ui_steps.py +0 -0
  472. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/features/test_video_chain_steps.py +0 -0
  473. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/features/video_agent_ui.feature +0 -0
  474. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/features/video_chain.feature +0 -0
  475. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/fixtures/__init__.py +0 -0
  476. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/fixtures/seeded_catalog.py +0 -0
  477. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/image_batch/__init__.py +0 -0
  478. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/image_batch/test_image_manifest.py +0 -0
  479. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/image_batch/test_observability_events.py +0 -0
  480. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/integration/__init__.py +0 -0
  481. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/integration/conftest.py +0 -0
  482. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/integration/constants.py +0 -0
  483. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/integration/test_storage_gcs.py +0 -0
  484. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/integration/test_storage_s3.py +0 -0
  485. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/mcp/__init__.py +0 -0
  486. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/mcp/conftest.py +0 -0
  487. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/mcp/test_server.py +0 -0
  488. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/mcp/test_stdio_transport.py +0 -0
  489. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/mcp/test_tools_helpers.py +0 -0
  490. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/mcp/test_tools_instructions.py +0 -0
  491. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/mcp/test_tools_wired.py +0 -0
  492. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
  493. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
  494. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/scripts/test_check_materiality.py +0 -0
  495. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/scripts/test_check_repo_hygiene.py +0 -0
  496. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/scripts/test_materiality_backtest.py +0 -0
  497. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/services/__init__.py +0 -0
  498. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/services/test_character_create_redaction.py +0 -0
  499. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/services/test_character_create_saga.py +0 -0
  500. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
  501. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/smoke/__init__.py +0 -0
  502. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/smoke/test_profile_account_smoke.py +0 -0
  503. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/smoke/test_real_flow.py +0 -0
  504. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/test_auth.py +0 -0
  505. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/test_browser_manager.py +0 -0
  506. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/test_chain.py +0 -0
  507. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/test_chain_manifest.py +0 -0
  508. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/test_cli_data.py +0 -0
  509. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/test_config.py +0 -0
  510. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/test_conftest_isolation.py +0 -0
  511. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/test_documentation_gate.py +0 -0
  512. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/test_errors.py +0 -0
  513. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/test_errors_403.py +0 -0
  514. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/test_json_output.py +0 -0
  515. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/test_manifest.py +0 -0
  516. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/test_marker_registry.py +0 -0
  517. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/test_media.py +0 -0
  518. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/test_observability.py +0 -0
  519. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/test_paths.py +0 -0
  520. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/test_profile_store.py +0 -0
  521. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/test_smoke.py +0 -0
  522. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/tools/__init__.py +0 -0
  523. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/tools/test_banned.py +0 -0
  524. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/tools/test_expander.py +0 -0
  525. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/tools/test_invocation.py +0 -0
  526. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/tools/test_loader.py +0 -0
  527. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/tools/test_registry.py +0 -0
  528. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/tools/test_runtime.py +0 -0
  529. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/tools/test_spec.py +0 -0
  530. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/ui/test_app.py +0 -0
  531. {gflow_cli-0.32.1 → gflow_cli-0.34.0}/tests/worker/test_daemon.py +0 -0
@@ -26,6 +26,13 @@
26
26
  # Useful for agent pipelines — set low to surface hung logins as exit 12 fast.
27
27
  # GFLOW_CLI_AUTH_LOGIN_TIMEOUT=600
28
28
 
29
+ # Anti-bot pause between prompt submissions in multi-prompt image runs
30
+ # (image batch, t2i --prompts-file/--stdin, gflow run). 'MIN-MAX' seconds, a
31
+ # single number for 0-N, or 0 to disable. Default 0.5-1.5 (small on purpose);
32
+ # widen (e.g. 10-30) if runs hit WAF 403s. The --jitter flag beats this.
33
+ # See docs/CONFIGURATION.md § GFLOW_CLI_JITTER_RANGE.
34
+ # GFLOW_CLI_JITTER_RANGE=0.5-1.5
35
+
29
36
  # -----------------------------------------------------------------------------
30
37
  # Output paths
31
38
  # -----------------------------------------------------------------------------
@@ -116,11 +123,20 @@
116
123
  # `patchright install chromium`. Unset to revert to the default playwright engine.
117
124
  # GFLOW_CLI_BROWSER_ENGINE=playwright
118
125
 
119
- # Try to force the Classic Flow UI mode for image generation by clicking the Agent toggle pill
120
- # if the page mounts in Agentic mode. This ensures deterministic aspect ratio controls.
121
- # If the page cannot be switched back to Classic, falls back to Agentic mode.
126
+ # Which Flow UI arm a command needs: auto (bind whatever renders) | classic
127
+ # (require the hard aspect controls) | agentic (require the chat surface; needed
128
+ # for -i instructions). gflow switches to the required arm, verifies via re-probe,
129
+ # and aborts with exit 28 (retryable — the cohort flaps per load) if it can't be
130
+ # reached. -i instructions force agentic automatically. See docs/CONFIGURATION.md.
131
+ # GFLOW_CLI_UI_MODE=auto
132
+
133
+ # DEPRECATED — use GFLOW_CLI_UI_MODE=classic. true maps to ui_mode=classic, but the
134
+ # old silent agentic fallback is gone: a classic-required run now aborts (exit 28).
122
135
  # GFLOW_CLI_PREFER_CLASSIC=false
123
136
 
137
+ # DEPRECATED — use GFLOW_CLI_UI_MODE=agentic. true maps to ui_mode=agentic.
138
+ # GFLOW_CLI_FORCE_AGENT_UI=false
139
+
124
140
 
125
141
  # BCP-47 locale tag passed to Playwright's launch `locale=` parameter
126
142
  # (controls Accept-Language only — Chrome's UI language is forced to
@@ -131,6 +147,14 @@
131
147
  # language end-to-end (see KNOWN_ISSUES § issue #24).
132
148
  # GFLOW_CLI_LOCALE=en-US
133
149
 
150
+ # Display name of the --project project, used by `gflow video i2v` to select
151
+ # the target project in the media picker's project menu when attaching a
152
+ # media-UUID frame (#287 — the menu lists projects by NAME; unnamed projects
153
+ # show only creation timestamps). Same as the `--project-name` flag, which
154
+ # takes precedence when both are set. Escape hatch when automatic name
155
+ # derivation (tab title / page hints) fails.
156
+ # GFLOW_CLI_PROJECT_NAME=
157
+
134
158
  # -----------------------------------------------------------------------------
135
159
  # Headless Daemon (gflow serve)
136
160
  # -----------------------------------------------------------------------------
@@ -59,6 +59,7 @@ Or invoke the wrapper: `/gflow:check`.
59
59
  - Structured logging only (`structlog`) — **never** raw `print()` or `import logging` in `src/`.
60
60
  - Errors as RFC 9457 Problem Details with stable per-class exit codes (3–27, e.g. 16 is the `DataStoreError` family, 19 `SceneConcatError`, 20 `FrameExtractionError`, 21 `ChainPartialError`, 22 `UpscaleUnavailableError`, 25 `FlowAgentUiError`). See `src/gflow_cli/errors.py::EXIT_CODE_MAP` for the complete mapping.
61
61
  - 100-char line length, `ruff` configured. Imports sorted by `ruff` (isort rules).
62
+ - **YAGNI / least-code**: prefer the smallest change that works. No speculative abstractions (interface/factory with one implementation), no config or flags nobody sets, no dead constants/helpers, no reinventing the stdlib. Review carries this as its own lens — the **D14 over-engineering** dimension of [`pr-council-review`](skills/pr-council-review/SKILL.md) (baseline, always runs). Its rubric is portable; the `ponytail` plugin (see CONTRIBUTING) is an optional accelerant, not a dependency.
62
63
  - **MCP & CLI Schema Symmetry**: Any updates or additions to user-facing CLI command parameters (e.g., `gflow image t2i`, `gflow video`) must be mirrored in the corresponding MCP tool definitions. Never add option/argument fields to Click commands without updating the MCP server implementation. This symmetry is enforced programmatically in CI via `tests/mcp/test_cli_parity.py` (every CLI leaf command needs a mapped MCP tool or an explicit, reasoned exemption) plus the schema checks in `tests/mcp/test_server.py`.
63
64
 
64
65
  ## PR instructions
@@ -7,6 +7,34 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.34.0] — 2026-07-12
11
+
12
+ ### Added
13
+
14
+ - **`--ui-mode` / `GFLOW_CLI_UI_MODE` — the CLI can drive the Flow UI arm the command needs, both directions (#299).** Flow serves a **classic** composer or an **agentic** chat cohort, server-assigned and flapping per page load. Before generating, gflow now determines the **required** arm, switches to it as a prerequisite (classic↔agentic DOM toggle), **verifies** via a DOM re-probe, and — if the arm is unreachable — aborts *before* submitting with the new `UiModeUnavailableError` (**exit 28**, retryable), no credits spent. Values: `auto` (default; bind whatever renders), `classic` (require the hard aspect controls), `agentic` (require the chat surface). The required arm is also **inferred**: agent instructions (`-i`) are agentic-only, so they force agentic — closing the #267 gap where `-i` on a classic roll was *silently dropped* (now it either binds agentic or fails fast). Exposed as the **`--ui-mode` flag** on `gflow image t2i` / `i2i` (single-prompt; batch uses the env var) and the **`ui_mode` param** on the `gflow_generate_image` MCP tool; `--ui-mode classic` + `-i` is a fail-fast usage error. Grounded in the #299 spike (`docs/superpowers/spikes/2026-07-12-ui-cohort-backend-config.md`). Applies to every image generation via the shared driver seam. Honest ceiling: a server-side experiment can pin the arm, in which case the switch can't win — the abort still saves the credits.
15
+
16
+ ### Changed
17
+
18
+ - **`GFLOW_CLI_PREFER_CLASSIC` and `GFLOW_CLI_FORCE_AGENT_UI` are deprecated (#299)** in favor of `GFLOW_CLI_UI_MODE=classic` / `=agentic` (both still work, mapping to the new modes with a `DeprecationWarning`). **Behavior change:** the old `prefer_classic` silent fallback to agentic when the classic toggle was unavailable is gone — a classic-required run now aborts with exit 28 instead. Pipelines that relied on "always yields a file" from `PREFER_CLASSIC=1` must handle exit 28 (retry / switch profile / `GFLOW_CLI_UI_MODE=agentic`).
19
+
20
+ ## [0.33.0] — 2026-07-12
21
+
22
+ ### Added
23
+
24
+ - **Configurable anti-bot jitter (#241).** The pause between multi-prompt image submissions is now tunable via `--jitter MIN-MAX` on `gflow image t2i` / `gflow image batch` or the `GFLOW_CLI_JITTER_RANGE` setting (env var or `.env`; flag beats env; a single number `N` means uniform 0–N like `video chain --jitter`; `0` disables; bounds must be finite and ≤ 3600 s). The previously **unpaced** paths — `t2i --prompts-file` / `--stdin` / multi-positional and `gflow run` image batches — now pace by default too; field data showed unpaced bursts tripping Flow's WAF (403 `PUBLIC_ERROR_UNUSUAL_ACTIVITY`). WAF cadence behavior and cooldown guidance documented in [DEBUGGING § WAF cadence](docs/DEBUGGING.md#waf-cadence).
25
+ - **`--project-name TEXT` on `gflow video i2v` (env: `GFLOW_CLI_PROJECT_NAME`).** The media picker's project menu lists projects by display NAME only — no ids anywhere in its markup, and unnamed projects show nothing but creation timestamps (live round-4 dump: 80 recency-ordered `menuitem`s). When gflow attaches an in-project asset by media UUID it must first select the right project in that menu, so it needs the project's display name. Automatic derivation is best-effort but live-validated (round 5 confirmed the editor tab title carries the name: `Google Flow - <project name>`); `--project-name` is the explicit, highest-precedence override for when derivation fails on other cohorts/locales — a permanent escape hatch, not a workaround. Threads `GenerateVideoRequest.project_name` through to the picker project-menu match; documented in `.env.template`. CLI-only for now: the MCP `gflow_generate_video` tool has no media-UUID frame inputs yet, so the override has no consumer there (command-level parity unaffected; the field rides along when ref-id support lands) (#287).
26
+
27
+ ### Changed
28
+
29
+ - **Default image-batch jitter lowered from 3–7 s to 0.5–1.5 s (#241).** The default is deliberately minimal — enough to break a perfectly uniform burst signature without wasting wall-clock. Widen (`--jitter 10-30` / `GFLOW_CLI_JITTER_RANGE=10-30`) when runs start hitting WAF 403s, then dial back once the score decays.
30
+
31
+ ### Fixed
32
+
33
+ - **`gflow video i2v <media-uuid>` now reaches assets deep in a crowded project's virtualised media grid (#287 — primary fix, part 1: scroll on the RIGHT node, progress-bounded).** The live repro: `TransportTimeoutError` ("Start frame asset ... could not be located in the media picker") on a ~100+-asset project for an asset that WAS in the project and in the local catalog, while the same command worked from a small scratch project. `_select_existing_asset`'s scroll fallback had a fixed budget (12 scrolls x 500 px), capping the reachable depth of the react-virtuoso grid regardless of grid size — and the round-6 audit exposed a second layer: the scroll was a blind hover+wheel over the dialog, but react-virtuoso scrolls its OWN container, so a wheel over the wrong node is a silent no-op that looks exactly like "end of grid". The scroll (shared with `_find_picker_entity_tile` via `_scroll_picker_grid_until_rendered`) now drives the dialog's ACTUAL scrollable element via JS (`[data-virtuoso-scroller]` preferred, then the first overflow container; hover+wheel kept as fallback when the probe fails), and is bounded by evidence of progress: it keeps scrolling while the set of rendered tile identifiers still changes between scrolls — depth proportional to grid size — stops after 3 consecutive no-progress scrolls, retains the legacy 12-scroll budget when the DOM probe yields no evidence, and caps at a 200-scroll hard ceiling. Every scroll probe event reports WHICH node moved (tag + class) and its scrollTop before/after, so a wrong-node no-op (frozen scrollTop) is visible in telemetry. The not-found contract is unchanged: same `TransportTimeoutError` naming the slot and UUID (#287).
34
+ - **CLI-resolved PROMPT search hints surface UUID frame refs via Flow's media search (#287 — primary fix, part 2).** Live rounds proved Flow's picker search does NOT index media UUIDs (both the full-UUID and UUID-stem tiers found nothing), but each picker tile's `alt` text carries the asset's generation PROMPT — which the search does index. New `get_asset_prompt(db_path, media_id)` catalog query (latest output-operation prompt by `flow_media_id`); `gflow video i2v` resolves each UUID frame ref's recorded prompt and passes its first 6 words as `GenerateVideoRequest.search_hints` (best-effort — no catalog, no hints; layering respected: the CLI resolves because it owns catalog access, the transport only consumes). `_select_existing_asset` types each hint into the picker search box after the UUID tiers and still matches tiles by UUID-in-`src` among the results, so an imprecise hint can only surface extra tiles, never select a wrong one; a hint hit skips the scroll fallback entirely. The pre-existing tiers (display name, media UUID, UUID stem) are kept as cheap first attempts (#287).
35
+ - **Hardening: the media picker's library view is verified/aligned to the target project before any UUID asset lookup (#287 — demoted from root cause after round 5).** Round-2's DOM dump appeared to show the picker's library open on a DIFFERENT project ("gflow-cli t2i", 16 tiles, target id nowhere in the dialog), and rounds 2-5 built project-alignment machinery on that reading. The round-5 title telemetry then inverted it: the raw tab title on `/project/f6caf027` was "Google Flow - gflow-cli t2i" — the trigger's "gflow-cli t2i" WAS the target project's actual display name, so the picker had been on the correct project all along and the round-2 evidence was a mirage. The machinery stays as hardening (the picker's library IS per-project with its own selector, so it CAN open on the wrong project — now that state is detected and corrected, and the round-5/6 name derivation gives the match a working source): `_sync_picker_project` runs each time the frame-slot / Add-Media dialog opens: it derives the target project id from the editor URL, resolves the project's display NAME (the menu renders names, not ids; live round-3 run confirmed the previous href/class-only page probes find nothing) — precedence: the `--project-name` / `GFLOW_CLI_PROJECT_NAME` override, then the editor tab title (`document.title` — the editor was navigated to `/project/<id>` before the picker opened; "Flow" AND "Google Flow" branding is stripped tolerantly across separator variants — the live-observed pattern is `Google Flow - <project name>` — branding-only titles are rejected so 'flow' can never contains-match a project like 'gflow-cli i2i', and the raw title is logged on every resolution so the real live pattern stays learnable), then an element whose `href` references the project id, then a project-title-classed element (the local catalog's `projects.title` was considered but the transport layer has no catalog access, and the live page also covers renames and non-gflow projects) — probes the trigger cascade with the live-observed Radix `ProjectDropdownSubTrigger` class first (the generic `aria-haspopup='menu'` fallback tier explicitly excludes the sibling `SortDropdownSubTrigger` — "Recentes" on the observed pt-BR profile — and no tier matches on locale-dependent labels), no-ops when the trigger already shows the target project (by id, or by resolved name — exact OR contains, since the trigger text carries icon-ligature noise; round 5 wasted ~30 menu probes hunting for a project it was already in because the probe demanded exact equality) or when no selector exists (older cohort), and otherwise opens the Radix submenu (click, then hover, then focus+ArrowRight — SubTriggers may ignore plain click — each step verified against the portal-rendered `[role='menu'][data-state='open']`), polls up to ~3s for the portal to POPULATE (live round 3: the open-state flips before the project list renders — matching an empty portal was a guaranteed miss), and clicks the innermost candidate matching the target — anchors whose `href` carries the project id first (round 3 also showed the portal holds ZERO classic menu-item ARIA roles, so the sweep covers generic clickables: `a`, `button`, `li`, `div[role]`, plus the ARIA roles), then the id anywhere in markup, then the normalized name (exact match before contains, so timestamp-labeled scratch entries like "Jul 11, 11:00 PM" can't collide). When the in-view match misses, the open portal itself is scrolled with the same progress-bounded pattern (scroll one step, re-match, stall-terminate when the rendered item set stops changing, hard ceiling) — the recency-ordered menu holds EVERY project and the target's entry can sit below the visible fold. A miss closes the menu (Escape) and proceeds, leaving the asset lookup as the authority.
36
+ - **Every picker-lookup decision point now emits structured telemetry, and each failure mode leaves a bounded DOM dump (#287 diagnosis).** The first live verification failed with zero events from the new code paths, making the failing layer indistinguishable (search tiers vs progress probe vs tile matcher vs wrong library project) — this telemetry is what confirmed the root cause in round 2. New `ui_automation_video.*` events: `picker_project_selector_absent` / `picker_project_already_active` / `picker_project_menu_opened` (opened + method: click/hover/keyboard) / `picker_project_menu_populated` (element count after the population poll) / `picker_project_switched` (matched_by: href/id/name) / `picker_project_switch_miss` (menu_opened, menu_elements, candidate count, dump path) / `picker_project_sync_skipped` / `picker_project_name_override` / `picker_project_name_resolved` / `picker_project_name_unresolved` (both name events carry the raw tab title) / `picker_project_menu_scroll_probe` (per menu scroll: rendered item count + new-item delta) / `picker_project_menu_scroll_done` (reason: found / stall / no_menu / ceiling) (project alignment), `picker_search_tier` (term, found, rendered-tile count) and `picker_search_unavailable`, `picker_scroll_probe` (per scroll: rendered-tile count + new-tile delta, plus WHICH node was scrolled — tag + class — and its scrollTop before/after, so a wrong-node no-op scroll with a frozen scrollTop is visible) and `picker_scroll_done` (termination reason: found / stall / legacy_budget / ceiling, total attempts), and `existing_asset_not_found` (media id, project id, screenshot + dump paths). On a final not-found, `_capture_picker_dom_dump` writes `debug_picker_dom_<uuid8>.json` to the out-dir — tile count, the first 3 tiles' outerHTML truncated to 500 chars (enough to see which attribute carries the media identity in a given cohort), the dialog's aria/role/data attributes, the project-selector candidates' outerHTML, and whether the target project id appears in the dialog at all — plus a `debug_picker_miss_<uuid8>.png` screenshot. On a project-switch miss, the OPEN portal's raw innerHTML (bounded to 4000 chars) plus its child-element count and tag histogram are written to `debug_picker_project_menu_<uuid8>.json` and summarized on the event — round 2's closed-trigger dump and round 3's role-filtered item list both left the menu structure invisible; raw markup can't be blinded by role assumptions. All dumps follow the 0.32.1 None-on-capture-failure contract (never report a file that was not written) (#287).
37
+
10
38
  ## [0.32.1] — 2026-07-11
11
39
 
12
40
  ### Fixed
@@ -1933,7 +1961,9 @@ shell-script template that branches on these codes.
1933
1961
 
1934
1962
  First skeleton. Not functional end-to-end yet.
1935
1963
 
1936
- [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.32.1...HEAD
1964
+ [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.34.0...HEAD
1965
+ [0.34.0]: https://github.com/ffroliva/gflow-cli/compare/v0.33.0...v0.34.0
1966
+ [0.33.0]: https://github.com/ffroliva/gflow-cli/compare/v0.32.1...v0.33.0
1937
1967
  [0.32.1]: https://github.com/ffroliva/gflow-cli/compare/v0.32.0...v0.32.1
1938
1968
  [0.32.0]: https://github.com/ffroliva/gflow-cli/compare/v0.31.0...v0.32.0
1939
1969
  [0.31.0]: https://github.com/ffroliva/gflow-cli/compare/v0.30.0...v0.31.0
@@ -102,6 +102,19 @@ pip install pre-commit && pre-commit install
102
102
 
103
103
  The `.pre-commit-config.yaml` already ships ruff and the hygiene gate.
104
104
 
105
+ ### Review lenses (over-engineering matters)
106
+
107
+ `gflow-cli` values **YAGNI / least-code** (see [AGENTS.md § Code style](AGENTS.md)):
108
+ the smallest change that works, no speculative abstractions, no dead code. This is a
109
+ first-class review dimension — **D14 over-engineering** in
110
+ [`pr-council-review`](skills/pr-council-review/SKILL.md), which always runs and carries
111
+ its own portable rubric.
112
+
113
+ Optionally, the `ponytail` Claude Code plugin (from the plugin marketplace) encodes
114
+ exactly this review taste — `/ponytail-review` audits a diff for over-engineering. It's a
115
+ **recommended, not required** accelerant: the D14 rubric applies with or without it, so no
116
+ contributor is blocked for lacking the plugin.
117
+
105
118
  ### SonarCloud quality gate
106
119
 
107
120
  On top of the six gates, CI runs a **SonarCloud** analysis whose quality gate must be
@@ -450,6 +450,9 @@ batch — so it is not a global incompatibility but a per-profile WAF state.
450
450
  the score).
451
451
  3. **Avoid same-day repeated batch runs** on a profile after a 403 — each
452
452
  rejected request can raise the score further.
453
+ 4. **Widen the submission jitter** when composing multiple runs — `--jitter 10-30`
454
+ or `GFLOW_CLI_JITTER_RANGE` (#241); cadence guidance in
455
+ [DEBUGGING § WAF cadence](docs/DEBUGGING.md#waf-cadence).
453
456
 
454
457
  **Tracked separately from** the architectural ["first-attempt listener-miss
455
458
  flake"](https://github.com/ffroliva/gflow-cli/pull/40) — that one was caused
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gflow-cli
3
- Version: 0.32.1
3
+ Version: 0.34.0
4
4
  Summary: Unofficial CLI for Google Flow — drive Veo image-to-video generations from the terminal.
5
5
  Project-URL: Homepage, https://github.com/ffroliva/gflow-cli
6
6
  Project-URL: Issues, https://github.com/ffroliva/gflow-cli/issues
@@ -153,6 +153,14 @@ GFLOW_CLI_AUTH_LOGIN_TIMEOUT=120 gflow auth login # abort after 2 minutes
153
153
  **Default:** `600`
154
154
  **Note:** This is a single-request ceiling; the *batch* timeout you experience is sum of all per-clip waits.
155
155
 
156
+ ### `GFLOW_CLI_JITTER_RANGE`
157
+
158
+ **What:** Anti-bot pause between prompt submissions in multi-prompt image runs (`gflow image batch`, `gflow image t2i --prompts-file` / `--stdin` / multiple positional prompts, and `gflow run` image batches). Spaces out the *submission clicks* only — generations still run in parallel inside Flow.
159
+ **Values:** `MIN-MAX` seconds (e.g. `10-30`), a single number `N` (uniform `0`–`N`, mirrors `video chain --jitter`), or `0` to disable.
160
+ **Default:** `0.5-1.5` — deliberately small so runs don't waste wall-clock. **Widen (e.g. `10-30`) when runs start hitting WAF 403s**, then dial back once the score decays.
161
+ **CLI override:** `--jitter` on `image t2i` and `image batch` (flag beats env).
162
+ **Why:** Flow's WAF reacts to cumulative submission cadence — see [DEBUGGING § WAF cadence](DEBUGGING.md#waf-cadence).
163
+
156
164
  ### `GFLOW_CLI_LOG_LEVEL`
157
165
 
158
166
  **What:** Logging verbosity.
@@ -223,13 +231,26 @@ GFLOW_CLI_HISTORY_PROMPTS=redacted gflow image t2i "confidential brief"
223
231
  **Reverting:** unset the variable (or set `playwright`) — the default path is byte-identical to a build without this feature, with no profile migration.
224
232
  **Security note:** the `patchright` extra ships a *patched Chromium driver* that handles your live Google session cookies; it is exact-pinned and treated as a security-review-required dependency. See [SECURITY.md § Dependencies](SECURITY.md).
225
233
 
226
- ### `GFLOW_CLI_PREFER_CLASSIC`
234
+ ### `GFLOW_CLI_UI_MODE`
227
235
 
228
- **What:** Try to force the Classic Flow UI mode for image generation by clicking the Agent toggle pill if the page mounts in Agentic mode.
229
- **Values:** `true` | `false`
230
- **Default:** `false`
231
- **Why use it:** The Agentic UI cohort (conversational chat) treats requested aspect ratios as a soft prompt hint, which can result in inconsistent aspect ratios (e.g. producing landscape when portrait 9:16 was requested). Exposing this setting allows callers to opt into switching the UI back to Classic mode where aspect ratios are enforced deterministically (via hard Flow crop controls).
232
- **Fallback:** If the page cannot be switched back to Classic (e.g., in a forced A/B cohort where the toggle is not available), the driver gracefully falls back to Agentic mode rather than blocking execution.
236
+ **What:** Which Flow UI arm to use for generation. Flow serves a **classic** composer (hard crop/aspect controls) or an **agentic** chat cohort, server-assigned and flapping per page load ([#299](https://github.com/ffroliva/gflow-cli/issues/299)).
237
+ **Values:**
238
+ - `auto` (default) — bind whatever the composer renders.
239
+ - `classic` — require the classic composer (hard aspect controls). gflow switches to it, re-probes to verify, and if the arm is still agentic **aborts before submitting** with `UiModeUnavailableError` (**exit 28**) — no credits spent.
240
+ - `agentic` — require the agentic chat surface (needed for `-i` agent instructions). gflow switches to it, verifies, and aborts (exit 28) if it can't be reached.
241
+ **Default:** `auto`
242
+ **How it works:** before each generation, gflow determines the required arm, clicks the classic↔agentic toggle as a **prerequisite**, **verifies** with a DOM re-probe, then binds — or fails fast. The required arm is also **inferred**: `-i` instructions are agentic-only, so they force `agentic` automatically (and `--ui-mode classic` + `-i` is a hard conflict, not a silent drop).
243
+ **Why `classic`:** the agentic cohort treats aspect ratio as a soft prompt hint (portrait 9:16 can come back landscape). `classic` enforces it or fails fast instead of silently degrading.
244
+ **Retry note:** the cohort flaps per load, so an exit-28 abort is **retryable** — a re-run often lands the wanted arm. A server experiment can pin the arm, in which case it's unreachable from the client (the abort still saves the credits).
245
+ **Supersedes:** `GFLOW_CLI_PREFER_CLASSIC` and `GFLOW_CLI_FORCE_AGENT_UI` (below).
246
+
247
+ ### `GFLOW_CLI_PREFER_CLASSIC` *(deprecated — use `GFLOW_CLI_UI_MODE=classic`)*
248
+
249
+ **Deprecated** in favor of [`GFLOW_CLI_UI_MODE`](#gflow_cli_ui_mode). `true` now maps to `ui_mode=classic` (emits a `DeprecationWarning`). **Behavior change:** the old silent fallback to agentic when the toggle was unavailable is gone — a classic-required run now **aborts with exit 28** instead of producing an agentic-cohort result. `GFLOW_CLI_UI_MODE` (and `--ui-mode`) take precedence when both are set.
250
+
251
+ ### `GFLOW_CLI_FORCE_AGENT_UI` *(deprecated — use `GFLOW_CLI_UI_MODE=agentic`)*
252
+
253
+ **Deprecated** in favor of [`GFLOW_CLI_UI_MODE`](#gflow_cli_ui_mode). `true` maps to `ui_mode=agentic` (emits a `DeprecationWarning`). `-i` instructions already force agentic automatically, so this is rarely needed explicitly.
233
254
 
234
255
  ### `GFLOW_CLI_LOCALE`
235
256
 
@@ -173,6 +173,38 @@ $env:PYTHONUTF8 = "1"
173
173
 
174
174
  Bash users on Git Bash / WSL inherit a UTF-8 locale and don't need this.
175
175
 
176
+ ## WAF cadence
177
+
178
+ Flow's WAF reacts to **cumulative submission cadence**, not individual
179
+ requests. Field data (issue [#241](https://github.com/ffroliva/gflow-cli/issues/241),
180
+ 2026-07-05, real account):
181
+
182
+ - 3-prompt multi-prompt runs spread 30–60 min apart all passed.
183
+ - A burst of ~14 image submissions in ~10 min ended in a **403**
184
+ (`Flow returned 403; blocked by WAF or fingerprint check`,
185
+ `PUBLIC_ERROR_UNUSUAL_ACTIVITY` — see
186
+ [KNOWN_ISSUES § batchGenerateImages HTTP 403](../KNOWN_ISSUES.md)).
187
+ - After ~30 min of cooldown, individually-paced calls (45–120 s apart) on the
188
+ same profile and project passed 4/4.
189
+
190
+ Practical guidance:
191
+
192
+ - **Pace multi-prompt runs — escalate only when needed.** All multi-prompt
193
+ image paths (`image batch`, `image t2i --prompts-file` / `--stdin` /
194
+ multiple prompts, `gflow run` image batches) apply a small random
195
+ 0.5–1.5 s pause between submissions by default — enough to break a
196
+ perfectly uniform burst signature without wasting wall-clock. If runs
197
+ start returning 403s, widen with `--jitter 10-30` or
198
+ `GFLOW_CLI_JITTER_RANGE` ([CONFIGURATION § GFLOW_CLI_JITTER_RANGE](CONFIGURATION.md#gflow_cli_jitter_range)),
199
+ then dial back once the score decays. `--jitter 0` disables pacing.
200
+ - **Cool down after a 403.** Wait 30–60 min, then probe with a single small
201
+ generation before batching again.
202
+ - **Reuse a project.** Repeated project churn (`project.createProject` calls
203
+ between generations) adds to the bot-like signature. For repeated
204
+ single-prompt runs (`t2i`, `i2i`), pass `--project` to reuse a standing
205
+ project. Multi-prompt runs already create only **one** shared project per
206
+ run (never one per prompt).
207
+
176
208
  ## Common failure modes
177
209
 
178
210
  See [`KNOWN_ISSUES.md`](../KNOWN_ISSUES.md) for the canonical list and
@@ -122,7 +122,7 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
122
122
  **"A gflow command hangs / fails — where do I start?"** → [DEBUGGING § Quick reference](DEBUGGING.md#quick-reference)
123
123
  **"Flow's UI broke a selector — how do I diagnose it?"** → [DEBUGGING § Inspecting Flow's live UI](DEBUGGING.md#inspecting-flows-live-ui)
124
124
  **"What does each `ui_automation.*` log event mean?"** → [DEBUGGING § Listener & HTTP-layer debugging](DEBUGGING.md#listener--http-layer-debugging)
125
- **"What was actually live-verified for the latest release?"** → latest: [LIVE_VERIFICATION_v0.32.1](LIVE_VERIFICATION_v0.32.1.md) (**#293 teardown fix live-verified credit-free** — error-path aborts leave ZERO chrome.exe holding the profile [3× leak reproduced pre-fix same day]; force-close fallback + ProfileLockedError translation unit-pinned; #283 wave logic fixes mock-verified to exact call counts). Prior: [v0.32.0](LIVE_VERIFICATION_v0.32.0.md) (**#287 UUID i2v frames proven live e2e** — an in-project asset selected by media UUID in the frame-slot dialog [frame_ref_attached, startImage bound on the wire, ZERO upload events] produced a real 720×1280 interpolation, resolving the #237 negative prior; foreign UUID → exit 9 pre-generation with screenshot; **#288 duration fail-fast proven live** — exit 23 pre-submit saved a 10-credit generation, and the debug screenshot confirmed the duration control is ABSENT from the cohort's settings popover [locale hypothesis refuted]; upload-400 exit-27 repro deferred-with-reason — the original rejected JPEG no longer exists). Prior: [v0.31.0](LIVE_VERIFICATION_v0.31.0.md) (**#281 wrong-media defenses live-verified in BOTH directions, credit-free** — correct attribution downloads with real wire metadata [seed, 768×1376]; the incident-class lazy-render ambiguity reproduced live and hard-stopped with `MediaAttributionError` exit 26 naming every candidate UUID, no file written; **#282 two-UUID-ref i2i proven e2e** — both freshly generated portrait UUIDs picker-selected into one scene with both canonical identities visually transferred). Prior: [v0.30.0](LIVE_VERIFICATION_v0.30.0.md) (**agentic-cohort image path + both fixes live-verified credit-free** — native 768×1376 stills, i2i-chain + canonical-ref identity hold; the character-create `DataIntegrityError` and the `prefer_classic` WARNING were observed live then fixed [recorder idempotent + INFO log]; MCP video-param feature deferred-with-reason on Veo credits, per the stills-only goal). Prior: [v0.29.0](LIVE_VERIFICATION_v0.29.0.md) (**persistent `gflow instructions` CRUD proven live e2e GREEN, credit-free** — 11-command sequence on a fresh project: add incl. `--ref <image-UUID>` attach, list/enable/disable, master toggle both ways, TOML `apply` destructive full-sync with `enabled=false` honored, `rm` with server card-id preserved across mutations; movie brief-sync code-path-verified via the same primitives, deferred-with-reason on credits; MCP `gflow_instructions_*` tools are thin adapters over the live-verified primitives). Prior: [v0.28.0](LIVE_VERIFICATION_v0.28.0.md) (**agent instructions `-i` now steer agentic generation — crayon e2e GREEN**: a style-neutral prompt + an enabled "crayon" card produced an unmistakable crayon drawing through the real transport; root causes were conversational phrasing + the `project_brief.enabled` master switch). Prior: [v0.27.1](LIVE_VERIFICATION_v0.27.1.md) (**v0.27.0 release follow-up fixes and documentation sync**). Prior: [v0.27.0](LIVE_VERIFICATION_v0.27.0.md) (**`[style]` block with named variants + prompt-aware resume — credit-free CLI verification**: real `movie run --dry-run` 3-way ledger proving resolved-style display, `skip (done)` on matching `style_hash`, and `re-run (style changed)` after a style edit; composition is local, wire path untouched, so no Veo credits spent — first credited styled run will confirm visually). Prior: [v0.26.0](LIVE_VERIFICATION_v0.26.0.md) (**image i2i by generated-image UUID proven live e2e GREEN** — the existing asset is *selected in place* by its media UUID, no duplicate upload, producing an i2i output that references it; plus generated-image `display_name` capture, credited @C1ph3r404). Prior: [v0.25.0](LIVE_VERIFICATION_v0.25.0.md) (**#237 remote-UUID i2v proven live e2e GREEN** — a real 8s 720×1280 interpolation from a generated image's UUID, after the picker-search attach was reworked to local upload; #240 home-`.env` matrix live; plus two silent-failure guards root-caused live: video-as-image download rejection and rejected-upload fail-loud). Prior: [v0.24.0](LIVE_VERIFICATION_v0.24.0.md) (--project parity across CLI + MCP — automated coverage; live gen auth-gated). Prior: [v0.23.0](LIVE_VERIFICATION_v0.23.0.md) (MCP generation wiring proven live end-to-end — tool→worker→real Flow REST→structured-error translation; final image-write blocked by an expired session, environmental. #222 macOS fix reporter-verified e2e on Apple Silicon). Prior: [v0.22.0](LIVE_VERIFICATION_v0.22.0.md) (Tools framework — automated/CI coverage complete; credit/key-gated live feature run is a pending owner gate, see the doc) · [v0.21.0](LIVE_VERIFICATION_v0.21.0.md) (MCP server over stdio + HTTP/SSE — credit-free protocol handshake; 4 tools / 2 prompts / 3 resources confirmed on stdout) · [v0.20.1](LIVE_VERIFICATION_v0.20.1.md) · [v0.20.0](LIVE_VERIFICATION_v0.20.0.md) · [v0.19.0](LIVE_VERIFICATION_v0.19.0.md) · [v0.18.0](LIVE_VERIFICATION_v0.18.0.md) · [v0.17.0](LIVE_VERIFICATION_v0.17.0.md) · [v0.16.0](LIVE_VERIFICATION_v0.16.0.md) · [v0.13.0](LIVE_VERIFICATION_v0.13.0.md) · [v0.12.0](LIVE_VERIFICATION_v0.12.0.md) · [v0.11.0](LIVE_VERIFICATION_v0.11.0.md) · [v0.10.0](LIVE_VERIFICATION_v0.10.0.md) · [v0.9.1](LIVE_VERIFICATION_v0.9.1.md) · [v0.9.0](LIVE_VERIFICATION_v0.9.0.md) · [v0.8.1](LIVE_VERIFICATION_v0.8.1.md) · [v0.7.0](LIVE_VERIFICATION_v0.7.0.md)
125
+ **"What was actually live-verified for the latest release?"** → latest: [LIVE_VERIFICATION_v0.34.0](LIVE_VERIFICATION_v0.34.0.md) (**#299 `--ui-mode` gate proven live, ZERO credits** — drove `get_ui_driver` directly over 4 real editor loads, never generated: bidirectional switch works [classic→agentic via `_force_agent_mode`, agentic→classic via `_exit_agent_mode`, each DOM-reverified], `agentic`-when-already-agentic is idempotent, and a timed-out toggle → **exit-28 fail-fast before submission**; deprecation behavior-change [`prefer_classic`→exit 28] confirmed). Prior: [v0.33.0](LIVE_VERIFICATION_v0.33.0.md) (**#287-follow-up picker fix proven live on the original repro** — the v0.32.1-failing `i2v <uuid> --project <crowded>` command now exits 0 with a real 3.0 MB `ftyp` mp4, `frame_ref_attached` + `video_saved`, zero uploads; **#241 jitter live-verified on both paths** — flag `--jitter 4-6` → `batch_jitter_sleep seconds=4.98`, and the new 0.5–1.5 s default → `seconds=1.47`, each firing exactly once between two t2i submissions; environment note: the denon82 cohort is now natively agentic and round-2 generations hit the pre-existing #281 `MediaAttributionError`, not a regression). Prior: [v0.32.1](LIVE_VERIFICATION_v0.32.1.md) (**#293 teardown fix live-verified credit-free** — error-path aborts leave ZERO chrome.exe holding the profile [3× leak reproduced pre-fix same day]; force-close fallback + ProfileLockedError translation unit-pinned; #283 wave logic fixes mock-verified to exact call counts). Prior: [v0.32.0](LIVE_VERIFICATION_v0.32.0.md) (**#287 UUID i2v frames proven live e2e** — an in-project asset selected by media UUID in the frame-slot dialog [frame_ref_attached, startImage bound on the wire, ZERO upload events] produced a real 720×1280 interpolation, resolving the #237 negative prior; foreign UUID → exit 9 pre-generation with screenshot; **#288 duration fail-fast proven live** — exit 23 pre-submit saved a 10-credit generation, and the debug screenshot confirmed the duration control is ABSENT from the cohort's settings popover [locale hypothesis refuted]; upload-400 exit-27 repro deferred-with-reason — the original rejected JPEG no longer exists). Prior: [v0.31.0](LIVE_VERIFICATION_v0.31.0.md) (**#281 wrong-media defenses live-verified in BOTH directions, credit-free** — correct attribution downloads with real wire metadata [seed, 768×1376]; the incident-class lazy-render ambiguity reproduced live and hard-stopped with `MediaAttributionError` exit 26 naming every candidate UUID, no file written; **#282 two-UUID-ref i2i proven e2e** — both freshly generated portrait UUIDs picker-selected into one scene with both canonical identities visually transferred). Prior: [v0.30.0](LIVE_VERIFICATION_v0.30.0.md) (**agentic-cohort image path + both fixes live-verified credit-free** — native 768×1376 stills, i2i-chain + canonical-ref identity hold; the character-create `DataIntegrityError` and the `prefer_classic` WARNING were observed live then fixed [recorder idempotent + INFO log]; MCP video-param feature deferred-with-reason on Veo credits, per the stills-only goal). Prior: [v0.29.0](LIVE_VERIFICATION_v0.29.0.md) (**persistent `gflow instructions` CRUD proven live e2e GREEN, credit-free** — 11-command sequence on a fresh project: add incl. `--ref <image-UUID>` attach, list/enable/disable, master toggle both ways, TOML `apply` destructive full-sync with `enabled=false` honored, `rm` with server card-id preserved across mutations; movie brief-sync code-path-verified via the same primitives, deferred-with-reason on credits; MCP `gflow_instructions_*` tools are thin adapters over the live-verified primitives). Prior: [v0.28.0](LIVE_VERIFICATION_v0.28.0.md) (**agent instructions `-i` now steer agentic generation — crayon e2e GREEN**: a style-neutral prompt + an enabled "crayon" card produced an unmistakable crayon drawing through the real transport; root causes were conversational phrasing + the `project_brief.enabled` master switch). Prior: [v0.27.1](LIVE_VERIFICATION_v0.27.1.md) (**v0.27.0 release follow-up fixes and documentation sync**). Prior: [v0.27.0](LIVE_VERIFICATION_v0.27.0.md) (**`[style]` block with named variants + prompt-aware resume — credit-free CLI verification**: real `movie run --dry-run` 3-way ledger proving resolved-style display, `skip (done)` on matching `style_hash`, and `re-run (style changed)` after a style edit; composition is local, wire path untouched, so no Veo credits spent — first credited styled run will confirm visually). Prior: [v0.26.0](LIVE_VERIFICATION_v0.26.0.md) (**image i2i by generated-image UUID proven live e2e GREEN** — the existing asset is *selected in place* by its media UUID, no duplicate upload, producing an i2i output that references it; plus generated-image `display_name` capture, credited @C1ph3r404). Prior: [v0.25.0](LIVE_VERIFICATION_v0.25.0.md) (**#237 remote-UUID i2v proven live e2e GREEN** — a real 8s 720×1280 interpolation from a generated image's UUID, after the picker-search attach was reworked to local upload; #240 home-`.env` matrix live; plus two silent-failure guards root-caused live: video-as-image download rejection and rejected-upload fail-loud). Prior: [v0.24.0](LIVE_VERIFICATION_v0.24.0.md) (--project parity across CLI + MCP — automated coverage; live gen auth-gated). Prior: [v0.23.0](LIVE_VERIFICATION_v0.23.0.md) (MCP generation wiring proven live end-to-end — tool→worker→real Flow REST→structured-error translation; final image-write blocked by an expired session, environmental. #222 macOS fix reporter-verified e2e on Apple Silicon). Prior: [v0.22.0](LIVE_VERIFICATION_v0.22.0.md) (Tools framework — automated/CI coverage complete; credit/key-gated live feature run is a pending owner gate, see the doc) · [v0.21.0](LIVE_VERIFICATION_v0.21.0.md) (MCP server over stdio + HTTP/SSE — credit-free protocol handshake; 4 tools / 2 prompts / 3 resources confirmed on stdout) · [v0.20.1](LIVE_VERIFICATION_v0.20.1.md) · [v0.20.0](LIVE_VERIFICATION_v0.20.0.md) · [v0.19.0](LIVE_VERIFICATION_v0.19.0.md) · [v0.18.0](LIVE_VERIFICATION_v0.18.0.md) · [v0.17.0](LIVE_VERIFICATION_v0.17.0.md) · [v0.16.0](LIVE_VERIFICATION_v0.16.0.md) · [v0.13.0](LIVE_VERIFICATION_v0.13.0.md) · [v0.12.0](LIVE_VERIFICATION_v0.12.0.md) · [v0.11.0](LIVE_VERIFICATION_v0.11.0.md) · [v0.10.0](LIVE_VERIFICATION_v0.10.0.md) · [v0.9.1](LIVE_VERIFICATION_v0.9.1.md) · [v0.9.0](LIVE_VERIFICATION_v0.9.0.md) · [v0.8.1](LIVE_VERIFICATION_v0.8.1.md) · [v0.7.0](LIVE_VERIFICATION_v0.7.0.md)
126
126
  **"Where is the reverse-engineered wire protocol for a feature?"** → the `*_RECON.md` design docs: [CHARACTER_RECON](CHARACTER_RECON.md) (Flow character entity protocol), [IMAGE_UPSCALE_RECON](IMAGE_UPSCALE_RECON.md) (`/v1/flow/upsampleImage` wire). Naming convention: one `<FEATURE>_RECON.md` per reverse-engineered surface, kept as the durable spec after the feature ships.
127
127
  **"What was live-verified for the data layer (PR #58)?"** → [LIVE_VERIFICATION_data_layer](LIVE_VERIFICATION_data_layer.md) — 1 Imagen + 1 Veo credit on denon82, 6-layer ledger (file + magic + Pillow + DB rows + CLI round-trip + structlog)
128
128
  **"What was live-verified for the video-download feature (#29)?"** → [LIVE_VERIFICATION_video_download](LIVE_VERIFICATION_video_download.md)
@@ -0,0 +1,53 @@
1
+ # Live verification — v0.33.0 (2026-07-12)
2
+
3
+ Both user-facing changes exercised against live Flow on the merged `develop`
4
+ tip (`669884c`), profile `denon82`, before tagging. Evidence follows the
5
+ 5-layer ledger (file count · magic bytes · dimensions/shape · structlog
6
+ invariants · user-confirmable artifact).
7
+
8
+ ## 1. #287 follow-up (PR #296) — picker reaches assets deep in a crowded project
9
+
10
+ **Command (the original repro, verbatim surface):**
11
+
12
+ ```
13
+ gflow video i2v 2f72aa2a-5081-4df8-a3b1-64b6a859274c "slow dolly-in, soft light shifting across the scene" \
14
+ --project f6caf027-ad68-49e3-aac9-ee32f1582bf3 --profile denon82 --out-dir <scratch>/330-e2e-i2v
15
+ ```
16
+
17
+ - **Exit code:** `0` (v0.32.1 failed this exact command with `TransportTimeoutError`, exit 9).
18
+ - **File count:** 1 mp4 produced.
19
+ - **Magic bytes:** `ftyp` at offset 4 — real ISO-BMFF video.
20
+ - **Size:** 3.0 MB.
21
+ - **Structlog invariants:** `picker_project_name_resolved` → `picker_project_already_active`
22
+ (alignment machinery confirms the picker was on the target project; no switch needed)
23
+ → `frame_ref_attached` → `video_saved`. Zero upload events — the in-project asset
24
+ was referenced, not re-uploaded.
25
+ - **Artifact:** `497d687d-86cc-4bcc-aeab-878a1d1c4fae.mp4` (scratch dir; user-inspectable).
26
+
27
+ ## 2. #241 (PR #297) — anti-bot jitter: configurable, small default, t2i path paced
28
+
29
+ **Round 1 (pre-merge, flag path):** `gflow image t2i "<p1>" "<p2>" --jitter 4-6` →
30
+ `batch_jitter_sleep {"seconds": 4.98, "index": 1}` — exactly one pause, between the
31
+ two submissions (never before the first), within the requested 4–6 s. Prompt 1
32
+ saved a real jpg.
33
+
34
+ **Round 2 (post-merge, default path):** same 2-prompt t2i with NO `--jitter` flag →
35
+ `batch_jitter_sleep {"seconds": 1.47, "index": 1}` — within the new 0.5–1.5 s
36
+ default, fired once. This is the release-defining behavior: the previously
37
+ unpaced t2i multi-prompt path now paces, at the minimal default.
38
+
39
+ **Environment finding (pre-existing, NOT a regression):** both round-2 generations
40
+ failed post-submission with the #281 `MediaAttributionError` (exit 26), and
41
+ `prefer_classic.cohort_natively_agentic` fired — the `denon82` cohort now mounts
42
+ Flow's agentic UI unconditionally and `GFLOW_CLI_PREFER_CLASSIC=1` cannot exit it.
43
+ The identical failure mode exists on released v0.32.1 (same cohort); the jitter
44
+ feature under verification is upstream of generation and verified by the sleep
45
+ event + the round-1 saved jpg. Tracked in KNOWN_ISSUES (agentic attribution) —
46
+ candidate for the next issue wave.
47
+
48
+ ## Not verified this cycle
49
+
50
+ - `GFLOW_CLI_JITTER_RANGE` via a real `.env` file on a live run (covered by unit
51
+ tests through pydantic-settings; env-var form is equivalent at the Settings layer).
52
+ - `gflow run --config` image-batch pacing (same `run_sequential_batch` code path
53
+ as t2i, verified live above; `gflow run` adds only config parsing on top).
@@ -0,0 +1,49 @@
1
+ # Live verification — v0.34.0 (2026-07-12)
2
+
3
+ The release's one user-facing feature — the `--ui-mode` / `GFLOW_CLI_UI_MODE`
4
+ ensure-required-mode gate (#299) — exercised against live Flow on the merged
5
+ `develop` tip, profile `denon82`. **Zero credits:** the production
6
+ `get_ui_driver(page, ui_mode=…)` gate was driven directly over 4 real editor
7
+ loads; generation was **never** called.
8
+
9
+ Ledger adapted for a control-plane feature (no generated artifact): exit-code /
10
+ raise outcome · structlog switch invariants · observed DOM arm transition
11
+ (before → after) · a re-runnable probe. `scratchpad/ui_mode_gate_e2e.py`.
12
+
13
+ ## What was confirmed (all four gate behaviors)
14
+
15
+ | Requested | Live mount | Switch attempt (structlog) | Outcome |
16
+ |---|---|---|---|
17
+ | `auto` | agentic | (none) | binds `agentic` (whatever renders) |
18
+ | `agentic` | classic | `ui_driver.ui_mode.attempt_force_agent` → `ui_automation.agent_mode_forced activated=True` | arm before=classic → **after=agentic**, binds `agentic` |
19
+ | `classic` | agentic | `ui_driver.ui_mode.attempt_exit_agent` → `ui_automation_video.exited_agent_mode` | arm before=agentic → **after=classic**, binds `classic` |
20
+ | `agentic` | agentic | `ui_automation.agent_mode_already_active` | idempotent no-op, binds `agentic` |
21
+ | `classic` | agentic (toggle click **timed out**: `agent_toggle_probe_failed`) | switch did not take | **`UiModeUnavailableError` — exit 28 fail-fast** (`requested=classic`), before any submission |
22
+
23
+ - **Bidirectional switch proven live** — classic→agentic (`_force_agent_mode`)
24
+ and agentic→classic (`_exit_agent_mode`), each verified by a DOM re-probe.
25
+ - **Fail-fast proven live** — when the toggle genuinely could not reach the
26
+ required arm, the gate raised exit 28 *before* submitting, spending no credits
27
+ (the money-shot: the honest terminal state fires on a real unreachable arm).
28
+ - **Inference / flag / MCP surfaces** — covered by 1529 automated tests
29
+ (flag→request threading, both CLI guards, worker payload→request); the CLI
30
+ guards (`--ui-mode classic` + `-i`, `--ui-mode` single-prompt-only) were also
31
+ smoke-verified at exit 2.
32
+
33
+ `denon82` rolled agentic on most loads (the current natively-agentic cohort
34
+ behavior), which conveniently exercised both switch directions in one run.
35
+
36
+ ## Behavior-change note (carried from the CHANGELOG)
37
+
38
+ `GFLOW_CLI_PREFER_CLASSIC` is deprecated → maps to `--ui-mode classic`, and the
39
+ old silent agentic fallback is gone: a classic-required run now aborts with exit
40
+ 28 instead of producing an agentic-cohort result. Verified above (the timed-out
41
+ case is exactly that abort).
42
+
43
+ ## Not verified this cycle
44
+
45
+ - The exit-28 abort's *auto-reload-retry* is intentionally **not implemented**
46
+ (deferred; see the design note) — today the retry is the user re-running the
47
+ command. Nothing to verify.
48
+ - Item 3a/3b (agentic driver parity) and item 2 (enforce-via-mutation) are not in
49
+ this release.
@@ -163,6 +163,11 @@ Options:
163
163
  --continue-on-error /
164
164
  --fail-fast Continue after per-prompt failures or stop at the
165
165
  first failed prompt. [default: continue-on-error]
166
+ --jitter SPEC Anti-bot pause between multi-prompt submissions:
167
+ 'MIN-MAX' seconds, a single number for 0-N, or 0
168
+ to disable. Widen (e.g. 10-30) if runs hit WAF
169
+ 403s. [default: 0.5-1.5; GFLOW_CLI_JITTER_RANGE
170
+ overrides the default]
166
171
  --model [nano2|nano-pro|image4]
167
172
  Image model alias. [default: nano2]
168
173
  --aspect [9:16|16:9|1:1|4:3|3:4]
@@ -179,6 +184,11 @@ Options:
179
184
  -t, --tool NAME[:k=v] Apply a prompt tool before generating, e.g.
180
185
  `creative-director:style=cinema`. Repeatable; applied
181
186
  per prompt on multi-prompt/batch. See "Prompt tools".
187
+ --ui-mode [auto|classic|agentic]
188
+ Require a Flow UI arm: classic (hard aspect
189
+ controls) / agentic (chat surface; forced by -i) /
190
+ auto (default). Aborts exit 28 if unreachable.
191
+ Single-prompt only; batch uses GFLOW_CLI_UI_MODE.
182
192
  --profile NAME Profile name (overrides default).
183
193
  ```
184
194
 
@@ -394,11 +404,12 @@ Example: [`test_assets/sample_batch.json`](../test_assets/sample_batch.json).
394
404
 
395
405
  ### Session behaviour
396
406
 
397
- All prompts in a batch share one Flow project. The editor is opened once; each prompt is submitted in turn with a random 3–7 second pause between submissions. This jitter is a **submission-cadence anti-bot-detection measure** — it spaces out the submission clicks, not the generation wait. All generations run in parallel inside Flow; only the click timing is jittered. The command returns once every submitted generation has resolved (success or failure), not after the last click.
407
+ All prompts in a batch share one Flow project. The editor is opened once; each prompt is submitted in turn with a small random pause between submissions (default 0.5–1.5 seconds; tune with `--jitter` or `GFLOW_CLI_JITTER_RANGE`). This jitter is a **submission-cadence anti-bot-detection measure** — it spaces out the submission clicks, not the generation wait. All generations run in parallel inside Flow; only the click timing is jittered. The command returns once every submitted generation has resolved (success or failure), not after the last click. See [DEBUGGING § WAF cadence](DEBUGGING.md#waf-cadence) for when to widen the range.
398
408
 
399
409
  ### Flags
400
410
 
401
411
  - `--continue-on-error` / `--fail-fast` — keep going past row failures or stop at the first one (default: `--fail-fast`). On fail-fast, already-completed images are downloaded before the error is surfaced.
412
+ - `--jitter SPEC` — anti-bot pause between submissions: `MIN-MAX` seconds (e.g. `10-30`), a single number for `0`–`N`, or `0` to disable. Default `0.5-1.5`; widen if runs hit WAF 403s. `GFLOW_CLI_JITTER_RANGE` overrides the default, the flag beats both.
402
413
 
403
414
  ### Limits
404
415
 
@@ -1243,6 +1254,7 @@ shell scripts can branch on the failure mode without parsing stderr.
1243
1254
  | `25` | `FlowAgentUiError` | The profile is on Flow's Agentic UI cohort and the classic media panel is unrecoverable for this operation | Use a Classic-cohort profile; see KNOWN_ISSUES on the agentic cohort |
1244
1255
  | `26` | `MediaAttributionError` | Generated media could not be reliably attributed to this request (issue #281) | Re-run; a dedicated project with fewer pre-existing assets avoids the ambiguity |
1245
1256
  | `27` | `MediaUploadRejectedError` | Flow's upload endpoint refused the input file (`uploadImage` 4xx, issue #287) | Re-encode the image (`ffmpeg -q:v 2 -map_metadata -1`), or reference the asset by its media UUID |
1257
+ | `28` | `UiModeUnavailableError` | The Flow UI arm this command required (`GFLOW_CLI_UI_MODE`, or inferred — `-i` forces agentic) couldn't be reached after a switch attempt; aborted before submitting — no credits spent (issue #299) | Retry (the cohort flaps per load); try another `--profile`; or relax `GFLOW_CLI_UI_MODE` |
1246
1258
  | `130`| SIGINT | User-interrupted (Ctrl-C) | — |
1247
1259
 
1248
1260
  **Exit code 16 — data store / migration error.** Fires when:
@@ -0,0 +1,87 @@
1
+ # Spike evidence — UI-cohort backend config surface (issue #299 gate)
2
+
3
+ **Date:** 2026-07-12 · **Verdict: GO (partial) — the UI arm IS a readable, persisted
4
+ backend setting; enforcement is a captured mutation away.** This overturns the
5
+ `AGENT_UI_RECON.md` § Gating conclusion that "there is no client-readable cohort
6
+ signal."
7
+
8
+ ## Method
9
+
10
+ Automatable half of the #299 spike (H1/H3), zero credits — navigation only, no
11
+ Generate click. `scratchpad/ui_cohort_spike.py`: launched a headless persistent
12
+ Chrome context on `profile_denon82`, cold-loaded the editor
13
+ (`/project/f6caf027…`) **3×**, and per load captured (a) the UI arm via the
14
+ production `detect_ui_mode` probe, (b) the client gating surface (`__NEXT_DATA__`
15
+ pageProps, localStorage, sessionStorage, cookie names), and (c) every network
16
+ response, with bounded JSON bodies for config/preference/RPC-looking URLs.
17
+
18
+ The recon (2026-06-14) inspected localStorage / cookies / `__NEXT_DATA__` pageProp
19
+ **keys** and correctly found no arm flag there. It did **not** read the **tRPC
20
+ query response bodies** — which is where the arm actually lives.
21
+
22
+ ## Result
23
+
24
+ - **Arm this session:** `classic` on all 3 headless loads — yet today's earlier
25
+ CLI e2e (also headless, same profile) hit `agentic`. So the cohort **flaps**;
26
+ denon82 is **not** permanently agentic.
27
+ - **`GET /api/trpc/videoFx.getUserSettings`** →
28
+ `{"isAgentModeToggled": false, "isChatPanelOpen": false, "tilesDisplayMode":
29
+ "grid", "completedOnboardingIds":["AGENT","MODEL"], …}` — a **per-user persisted
30
+ setting**. `isAgentModeToggled:false` is consistent with the 3 classic loads.
31
+ - **`GET /api/trpc/videoFx.getFlowAppConfig`** → `"agentModeDefaultState":
32
+ "agent_off"`, plus `"activeExperimentIds":[106077941, 105798603, …]` and a raft
33
+ of `isXEnabled` feature flags — the app-level default + server experiment list.
34
+ - **`GET /api/trpc/general.fetchUserPreferences`** → history/product-improvement
35
+ only (no arm).
36
+ - Endpoints seen on cold load are **all GET** (plus a `general.submitBatchLog`
37
+ telemetry POST). No mode-mutation fired — it only fires on the Agent-pill click.
38
+
39
+ ## Interpretation
40
+
41
+ The effective arm is best modelled as:
42
+
43
+ ```
44
+ effective_arm = experiment_override(activeExperimentIds) # server, may force agentic
45
+ ?? user_setting(isAgentModeToggled) # persisted, client-readable
46
+ ?? app_default(agentModeDefaultState) # "agent_off" today
47
+ ```
48
+
49
+ - **H1 — CONFIRMED.** The intended arm is **readable pre-generation** from
50
+ `getUserSettings.isAgentModeToggled` + `getFlowAppConfig.agentModeDefaultState`
51
+ / `activeExperimentIds`, via an authenticated in-page `fetch` on the editor we
52
+ already load. DOM `detect_ui_mode` stays the ground-truth post-render check;
53
+ the tRPC read gives a *pre-render prediction* + a diagnosable "why".
54
+ - **H2 — STRONGLY INDICATED, not yet captured.** `isAgentModeToggled` is a
55
+ persisted tRPC-backed setting, so the Agent pill flips it through a mutation
56
+ (expected `videoFx.setUserSettings` / `updateUserSettings` shape). It does not
57
+ fire on load, so its exact name/payload needs one pill-click capture.
58
+ - **H3 — residual.** If an entry in `activeExperimentIds` force-assigns agentic,
59
+ setting `isAgentModeToggled:false` will not override it. Reading still lets us
60
+ **fail fast** before spending; enforcement is then partial, not guaranteed.
61
+
62
+ ## Decision
63
+
64
+ **GO into `/gflow:predict`** with this evidence. Recommended scope, in reliability
65
+ order:
66
+
67
+ 1. **Read-and-fail-fast (no mutation needed, ships on H1 alone):** the `--ui-mode`
68
+ policy (#299 item 1) gains a pre-submission tRPC read of `isAgentModeToggled` /
69
+ `agentModeDefaultState`; a strict `classic` request aborts cleanly (typed
70
+ error, zero credits) when the predicted/probed arm is agentic. Deterministic,
71
+ low-risk.
72
+ 2. **Enforce (needs the H2 capture):** replace the best-effort pill-click in
73
+ `get_ui_driver(prefer_classic=True)` with the captured `setUserSettings`
74
+ mutation to persist `isAgentModeToggled:false`, then re-probe. Predict-gated
75
+ (transport change).
76
+ 3. **Driver parity (H3 fallback, from #299 item 2):** wire-response attribution +
77
+ content-type retry — the fix when an experiment pins agentic and enforcement
78
+ can't win.
79
+
80
+ ## Follow-up needed (manual, blocked on a human at the keyboard)
81
+
82
+ `gflow-agent-browser-spike/scripts/capture-agent-ui.ps1` already automates the
83
+ capture around a pill click + one generation. Run it on a **pill-rendering
84
+ cohort** (try `promo-denon82` / `test_acc`; toggle the Agent pill) to record the
85
+ mutation endpoint + payload (H2) and, ideally, an `agentic` load to confirm the
86
+ arm correlates with `isAgentModeToggled:true`. That closes H2/H3 before predict
87
+ finalizes item 2.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "gflow-cli"
3
- version = "0.32.1"
3
+ version = "0.34.0"
4
4
  description = "Unofficial CLI for Google Flow — drive Veo image-to-video generations from the terminal."
5
5
  readme = "README.md"
6
6
  license = { file = "LICENSE" }
@@ -6,7 +6,7 @@ description: Multi-dimensional LLM council review of an open PR (default) or a l
6
6
 
7
7
  # `pr-council-review` — PR Council Review skill
8
8
 
9
- Council-driven PR review. Dispatches **5 baseline + N adaptive** parallel reviewers, each scoped to one dimension, each invoking the relevant Claude Code specialized skill (e.g. `security-review`, `code-review`, `verify`), then synthesizes a single consensus verdict.
9
+ Council-driven PR review. Dispatches **6 baseline + N adaptive** parallel reviewers, each scoped to one dimension, each invoking the relevant Claude Code specialized skill (e.g. `security-review`, `code-review`, `verify`), then synthesizes a single consensus verdict.
10
10
 
11
11
  This skill is the canonical body. The Claude Code slash command at `.claude/commands/gflow/pr-council-review.md` is a thin wrapper that invokes this skill. Non-Claude tools (Gemini CLI / Codex / Cursor / Aider) can consume this SKILL.md directly via their own skill loaders.
12
12
 
@@ -117,8 +117,9 @@ Pull in parallel via `ctx_batch_execute`:
117
117
  | **D11 — Release-gate compliance** | adaptive | `pyproject.toml`, `src/gflow_cli/__init__.py`, `.github/workflows/`, `release/*` branch |
118
118
  | **D12 — BDD step-stub signatures** | adaptive | any path under `tests/features/` |
119
119
  | **D13 — Dev / release scripts** | adaptive | any path under `scripts/` |
120
+ | **D14 — Over-engineering / YAGNI** | ✅ baseline (NEW v3) | always |
120
121
 
121
- **Baseline floor is non-negotiable.** D1–D5 ALWAYS run. **Docs-only PRs** (100% paths under `*.md`, `docs/**`, `CHANGELOG.md`, `README.md`, `LICENSE`, `AUTHORS`) → D4 reframes from "test code coverage" to "docs-verification"; D5 still runs unchanged.
122
+ **Baseline floor is non-negotiable.** D1–D5 and D14 ALWAYS run. **Docs-only PRs** (100% paths under `*.md`, `docs/**`, `CHANGELOG.md`, `README.md`, `LICENSE`, `AUTHORS`) → D4 reframes from "test code coverage" to "docs-verification"; D5 still runs unchanged.
122
123
 
123
124
  ---
124
125
 
@@ -145,6 +146,9 @@ Each agent is a `general-purpose` agent (only subagent type that supports arbitr
145
146
  | D11 Release-gate | (none — direct config inspection) | |
146
147
  | D12 BDD | (none — direct stub-signature inspection) | |
147
148
  | D13 Scripts | (none — direct script inspection) | |
149
+ | D14 Over-engineering | `ponytail:ponytail-review` *(soft dep — invoke if installed; else apply the inline YAGNI rubric in § Per-dimension specifics)* | "Should this code exist at all?" — the lens D1–D2 don't cover |
150
+
151
+ **On the D14 soft dependency:** `ponytail:ponytail-review` is a user-local plugin, not shipped with this repo, so it is **optional** (same pattern as the `agy` extra reviewer in `issue-resolve`). The over-engineering **lens is owned by this skill** (the rubric below); the plugin only accelerates it. An agent without the plugin applies the rubric directly and still produces a D14 verdict — never skip D14 because the plugin is absent.
148
152
 
149
153
  ### Per-agent prompt skeleton (mandatory v2 changes in bold)
150
154
 
@@ -213,6 +217,7 @@ If you are NOT sure a finding is real because it depends on file content, VERIFY
213
217
  | D11 | `[[release-back-merge-gap-recovery]]`, `[[wheel-build-sanity-gate]]`, `[[pypi-rejected-filename-reusable]]`, `[[draft-pr-merge-trap]]` |
214
218
  | D12 | `[[bdd-stubs-mirror-runtime-signatures]]` |
215
219
  | D13 | `[[wheel-build-sanity-gate]]` |
220
+ | D14 | (none mandatory; apply the YAGNI rubric below) |
216
221
 
217
222
  ### Per-dimension specifics
218
223
 
@@ -238,6 +243,13 @@ If you are NOT sure a finding is real because it depends on file content, VERIFY
238
243
  - **D11 Release-gate:** version match `pyproject.toml` ↔ `src/gflow_cli/__init__.py` (RED if drift). `[Unreleased]` emptied + new version added. Wheel build clean. Back-merge gap addressed.
239
244
  - **D12 BDD:** new `_run_*` kwarg → mirror in `tests/features/_fake_*` stubs (silent TypeError trap).
240
245
  - **D13 Scripts:** Windows-clean (memory `[[windows-dev-quirks]]`); release scripts include wheel-build sanity gate.
246
+ - **D14 Over-engineering / YAGNI:** *should this code exist at all?* — the lens D1 (correctness) and D2 (quality) don't ask. If `ponytail:ponytail-review` is installed, invoke it; otherwise apply this rubric directly to the **added** lines:
247
+ - **Dead / orphaned:** a constant, helper, field, or branch with no live caller after the change (e.g. a module constant only its own definition + a docstring reference now use). Cut it.
248
+ - **Speculative flexibility:** an interface/factory/abstraction with one implementation, a config knob or flag nobody sets, a parameter only ever passed one value, a layer with one caller. Inline until a second caller exists.
249
+ - **Reinvented stdlib / platform:** a hand-rolled parser/validator/date-format the standard library or the platform already ships. Name the built-in.
250
+ - **One-caller indirection:** a wrapper function whose only value is a test seam, when the callee could be patched directly (match how sibling code does it).
251
+ - **Scaffolding "for later":** boilerplate, placeholder modules, or generality added for a use case not in this PR.
252
+ - Output the concrete cut per finding (`file:Lline: delete/inline/shrink — what replaces it`) and, when meaningful, `net: -N lines possible`. A single smoke test / `assert`-based self-check is the minimum, never flag it as bloat. RED only for genuinely dead/unreachable code; over-generality is Nice-to-have unless it's load-bearing.
241
253
 
242
254
  ---
243
255
 
@@ -303,7 +315,7 @@ Always end with an `AskUserQuestion`.
303
315
 
304
316
  > **Provenance:** v1 protocol validated on PR #93 (locale selectors, 2026-05-26). v2 evolved 2026-05-27 after running on PR #95 surfaced two real defects: (a) sub-agents read stale working-tree files producing 5+ false positives (memory `[[pr-council-review-stale-tree-reads]]`), (b) baseline missed memory-hygiene as a dimension. Both fixed in v2.
305
317
 
306
- - Council baseline = 5 dimensions (D1–D5). Adaptive ceiling = D6–D13. Going beyond ~13 adds noise faster than signal — split into two reviews instead.
318
+ - Council baseline = 6 dimensions (D1–D5 + D14 over-engineering). Adaptive ceiling = D6–D13. Going beyond ~14 adds noise faster than signal — split into two reviews instead.
307
319
  - Sub-agents are `general-purpose` agents that invoke specialized skills (`security-review`, `code-review`, `verify`, `review`) inside their prompt for dimension-specific capability.
308
320
  - The command is **stateless** and **read-only** — concurrent invocations on different PRs don't share data. No `gh pr merge`, no `git push`, no `gh pr close`.
309
321
  - **Idempotence:** same PR SHA → comparable verdicts on different days. Drift usually means memory grew new precedents or the mandatory-slug table needs an update.