gflow-cli 0.16.0__tar.gz → 0.18.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 (424) hide show
  1. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.claude/commands/gflow/check.md +7 -0
  2. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.claude/commands/gflow/release.md +19 -0
  3. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.gitignore +3 -0
  4. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/AGENTS.md +1 -1
  5. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/CHANGELOG.md +36 -1
  6. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/CLAUDE.md +1 -0
  7. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/KNOWN_ISSUES.md +44 -2
  8. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/PKG-INFO +2 -1
  9. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/RELEASE.md +25 -10
  10. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/AUTHENTICATION.md +21 -0
  11. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/INDEX.md +3 -1
  12. gflow_cli-0.18.0/docs/LIVE_VERIFICATION_v0.16.0.md +77 -0
  13. gflow_cli-0.18.0/docs/LIVE_VERIFICATION_v0.17.0.md +94 -0
  14. gflow_cli-0.18.0/docs/LIVE_VERIFICATION_v0.18.0.md +72 -0
  15. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/PROJECT_STATUS.md +7 -2
  16. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/USAGE.md +6 -0
  17. gflow_cli-0.18.0/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +186 -0
  18. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/pyproject.toml +2 -1
  19. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/ci/check_repo_hygiene.py +52 -1
  20. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/active_plan.py +7 -0
  21. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/spike_issue170_picker_locale_recon.py +2 -2
  22. gflow_cli-0.18.0/scripts/dev/spike_issue174_library_ui_recon.py +445 -0
  23. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/skills/scenario/SKILL.md +7 -0
  24. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/__init__.py +1 -1
  25. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/transports/ui_automation.py +18 -5
  26. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/transports/ui_automation_video.py +48 -8
  27. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/auth/__init__.py +8 -9
  28. gflow_cli-0.18.0/src/gflow_cli/auth/cookies.py +159 -0
  29. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/auth/real_chrome.py +24 -3
  30. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/auth/verification.py +108 -8
  31. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/cli_image.py +4 -0
  32. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/errors.py +31 -0
  33. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/exceptions.py +1 -0
  34. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/paths.py +11 -0
  35. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/transports/test_ui_automation.py +13 -0
  36. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/transports/test_ui_automation_image_mode.py +24 -2
  37. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/transports/test_ui_automation_video.py +31 -3
  38. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/auth/strategies/test_strategies.py +44 -3
  39. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/auth/test_verification.py +276 -0
  40. gflow_cli-0.18.0/tests/cli/test_cli_image_selector_drift.py +74 -0
  41. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/e2e/conftest.py +10 -4
  42. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/e2e/test_auth_verification_e2e.py +33 -8
  43. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/locale_picker_include.feature +1 -1
  44. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/test_locale_picker_include_steps.py +11 -4
  45. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/scripts/test_check_repo_hygiene.py +45 -0
  46. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_errors.py +37 -0
  47. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/uv.lock +129 -1
  48. gflow_cli-0.16.0/.continue-here.md +0 -118
  49. gflow_cli-0.16.0/PR162_MOVIE_CHARACTER_REVIEW.md +0 -137
  50. gflow_cli-0.16.0/docs/superpowers/2026-05-17-issue-15-handover.md +0 -59
  51. gflow_cli-0.16.0/docs/superpowers/character-scenario.md +0 -140
  52. gflow_cli-0.16.0/docs/superpowers/plans/2026-06-01-governance-enforcement-advisory/PLAN.md +0 -271
  53. gflow_cli-0.16.0/docs/superpowers/plans/2026-06-04-character-create-recording.md +0 -428
  54. gflow_cli-0.16.0/docs/superpowers/plans/2026-06-06-movie-p0-asyncio-hotfix.md +0 -223
  55. gflow_cli-0.16.0/docs/superpowers/plans/2026-06-06-movie-p1-composition-manifest.md +0 -1208
  56. gflow_cli-0.16.0/docs/superpowers/plans/2026-06-06-movie-p2-native-identity-voice.md +0 -612
  57. gflow_cli-0.16.0/docs/superpowers/plans/2026-06-11-image-upscale/PLAN.md +0 -206
  58. gflow_cli-0.16.0/docs/superpowers/plans/2026-06-11-image-upscale/SCENARIO.md +0 -79
  59. gflow_cli-0.16.0/docs/superpowers/plans/2026-06-11-issue-170-locale-selectors/PLAN.md +0 -218
  60. gflow_cli-0.16.0/docs/superpowers/plans/2026-06-11-issue-170-locale-selectors/SCENARIO.md +0 -101
  61. gflow_cli-0.16.0/docs/superpowers/specs/2026-06-06-movie-consistency-design.md +0 -310
  62. gflow_cli-0.16.0/docs/superpowers/verifications/2026-05-11-phase-4-stage-g.md +0 -123
  63. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.claude/README.md +0 -0
  64. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.claude/commands/gflow/active.md +0 -0
  65. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.claude/commands/gflow/branch-review.md +0 -0
  66. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.claude/commands/gflow/changelog.md +0 -0
  67. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.claude/commands/gflow/doc-review.md +0 -0
  68. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.claude/commands/gflow/known-issues.md +0 -0
  69. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.claude/commands/gflow/next.md +0 -0
  70. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.claude/commands/gflow/plan.md +0 -0
  71. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.claude/commands/gflow/pr-council-review.md +0 -0
  72. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.claude/commands/gflow/predict.md +0 -0
  73. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.claude/commands/gflow/scenario.md +0 -0
  74. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.claude/commands/gflow/status.md +0 -0
  75. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.env.template +0 -0
  76. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.gitattributes +0 -0
  77. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.github/CODEOWNERS +0 -0
  78. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  79. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.github/copilot-instructions.md +0 -0
  80. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.github/dependabot.yml +0 -0
  81. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.github/workflows/ci.yml +0 -0
  82. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.github/workflows/external-pr-triage.yml +0 -0
  83. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.github/workflows/governance-advisory.yml +0 -0
  84. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.github/workflows/governance-benchmark.yml +0 -0
  85. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.github/workflows/release.yml +0 -0
  86. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.gitleaks.toml +0 -0
  87. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.pre-commit-config.yaml +0 -0
  88. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.secrets.baseline +0 -0
  89. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/CONFIGURATION.md +0 -0
  90. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/CONTRIBUTING.md +0 -0
  91. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/DISCLAIMER.md +0 -0
  92. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/GEMINI.md +0 -0
  93. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/LICENSE +0 -0
  94. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/PLAN.md +0 -0
  95. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/README.md +0 -0
  96. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/ROADMAP.md +0 -0
  97. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/conftest.py +0 -0
  98. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docker-compose.yml +0 -0
  99. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/AGENT_GUIDE.md +0 -0
  100. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/ARCHITECTURE.md +0 -0
  101. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/CHARACTER.md +0 -0
  102. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/CHARACTER_RECON.md +0 -0
  103. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/CONFIGURATION.md +0 -0
  104. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/DATA_LAYER.md +0 -0
  105. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/DEBUGGING.md +0 -0
  106. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/DEMOS.md +0 -0
  107. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/DEVELOPMENT.md +0 -0
  108. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/E2E_TESTING.md +0 -0
  109. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/EXTERNAL_STORAGE.md +0 -0
  110. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/GITHUB.md +0 -0
  111. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
  112. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
  113. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
  114. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
  115. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
  116. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
  117. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
  118. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
  119. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
  120. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
  121. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
  122. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
  123. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
  124. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/MOVIE.md +0 -0
  125. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/SECURITY.md +0 -0
  126. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/USER_GUIDE.md +0 -0
  127. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/assets/demo-split-pf.gif +0 -0
  128. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/assets/example-run.gif +0 -0
  129. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/schemas/movie-handoff.schema.json +0 -0
  130. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/examples/README.md +0 -0
  131. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/examples/batch_from_config.py +0 -0
  132. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/examples/multi_prompt_t2i.py +0 -0
  133. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/examples/sample_config.json +0 -0
  134. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/examples/sample_prompts.txt +0 -0
  135. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/examples/single_image_t2i.py +0 -0
  136. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/examples/workflow_chain.py +0 -0
  137. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/llms.txt +0 -0
  138. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/samples/README.md +0 -0
  139. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/samples/captured/01_upload_image.json +0 -0
  140. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
  141. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
  142. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/samples/captured/04_archive_workflow.json +0 -0
  143. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/samples/captured/05_createProject.json +0 -0
  144. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/samples/captured/06_batchGenerateImages.json +0 -0
  145. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
  146. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
  147. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
  148. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
  149. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
  150. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/samples/captured/12_create_scene.json +0 -0
  151. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
  152. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/samples/captured/14_get_scene_workflows.json +0 -0
  153. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
  154. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/ci/check_doc_links.py +0 -0
  155. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/ci/check_materiality.py +0 -0
  156. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/debug_editor.py +0 -0
  157. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/debug_gen_settings.py +0 -0
  158. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/debug_settings.py +0 -0
  159. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/_recording_client.py +0 -0
  160. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/_spike_common.py +0 -0
  161. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
  162. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
  163. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
  164. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
  165. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
  166. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/capture_locale_invariants.py +0 -0
  167. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
  168. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/character_create_spike.py +0 -0
  169. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/character_create_spike_v2.py +0 -0
  170. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/dump_character_selectors.js +0 -0
  171. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/make_project.py +0 -0
  172. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/materiality_backtest.py +0 -0
  173. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/monitor_pr_38.py +0 -0
  174. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/patch_character.py +0 -0
  175. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/record_flow_capture.py +0 -0
  176. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/skillopt/README.md +0 -0
  177. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/skillopt/harness.py +0 -0
  178. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/skillopt/tasks.json +0 -0
  179. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/spike_char_editor_dom.py +0 -0
  180. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/spike_char_gen_capture.py +0 -0
  181. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
  182. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
  183. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
  184. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
  185. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
  186. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
  187. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
  188. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/spike_movie_picker_select.py +0 -0
  189. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/spike_movie_voice_list.py +0 -0
  190. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/spike_patch_entity.py +0 -0
  191. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/diag/README.md +0 -0
  192. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/diag/capture_flow_traffic.py +0 -0
  193. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/diag/memory_profile.py +0 -0
  194. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/diag/recaptcha_mint.py +0 -0
  195. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/record_demo.ps1 +0 -0
  196. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/smoke_image.py +0 -0
  197. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/smoke_real_chrome_image.py +0 -0
  198. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/smoke_video_editor.py +0 -0
  199. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/smoke_worker_style.py +0 -0
  200. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/verify_chrome_auth_viability.py +0 -0
  201. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/skills/README.md +0 -0
  202. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/skills/gflow-cli/SKILL.md +0 -0
  203. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/skills/plan/SKILL.md +0 -0
  204. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/skills/pr-council-review/SKILL.md +0 -0
  205. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/skills/predict/SKILL.md +0 -0
  206. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/skills/status/SKILL.md +0 -0
  207. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/sonar-project.properties +0 -0
  208. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/__main__.py +0 -0
  209. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/_cli_helpers.py +0 -0
  210. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/__init__.py +0 -0
  211. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/_retry.py +0 -0
  212. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
  213. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/character.py +0 -0
  214. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/client.py +0 -0
  215. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/dto.py +0 -0
  216. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/image.py +0 -0
  217. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/image_upscale.py +0 -0
  218. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/recaptcha.py +0 -0
  219. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/routes.py +0 -0
  220. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/scene.py +0 -0
  221. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/transports/__init__.py +0 -0
  222. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/transports/_common.py +0 -0
  223. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
  224. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/transports/base.py +0 -0
  225. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
  226. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
  227. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
  228. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
  229. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/video.py +0 -0
  230. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/auth/base.py +0 -0
  231. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/auth/factory.py +0 -0
  232. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
  233. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/auth/strategies.py +0 -0
  234. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/browser_manager.py +0 -0
  235. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/chain.py +0 -0
  236. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/chain_manifest.py +0 -0
  237. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/cli.py +0 -0
  238. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/cli_character.py +0 -0
  239. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/cli_data.py +0 -0
  240. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/cli_models.py +0 -0
  241. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/cli_movie.py +0 -0
  242. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/cli_run.py +0 -0
  243. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/cli_scene.py +0 -0
  244. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/cli_video.py +0 -0
  245. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/composition.py +0 -0
  246. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/config.py +0 -0
  247. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/data/__init__.py +0 -0
  248. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/data/chain_repo.py +0 -0
  249. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
  250. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
  251. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
  252. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
  253. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
  254. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
  255. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
  256. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/data/models.py +0 -0
  257. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/data/queries.py +0 -0
  258. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/data/recorder.py +0 -0
  259. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/data/redaction.py +0 -0
  260. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/data/repository.py +0 -0
  261. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/data/store.py +0 -0
  262. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/image_batch.py +0 -0
  263. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/json_output.py +0 -0
  264. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/manifest.py +0 -0
  265. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/media.py +0 -0
  266. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/movie_manifest.py +0 -0
  267. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/observability.py +0 -0
  268. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/profile_store.py +0 -0
  269. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/services/__init__.py +0 -0
  270. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/services/character_create.py +0 -0
  271. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/storage.py +0 -0
  272. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tasks/lessons.md +0 -0
  273. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/test_assets/sample_batch.json +0 -0
  274. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/test_assets/sample_batch.tsv +0 -0
  275. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/test_assets/sample_batch_invalid.tsv +0 -0
  276. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/__init__.py +0 -0
  277. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/__init__.py +0 -0
  278. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/fixtures/character_gen_response.json +0 -0
  279. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/fixtures/patch_entity_response.json +0 -0
  280. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_aisandbox_auth_error.py +0 -0
  281. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
  282. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_bearer_redaction.py +0 -0
  283. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_character.py +0 -0
  284. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_client.py +0 -0
  285. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_client_character.py +0 -0
  286. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_client_delete_characters.py +0 -0
  287. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_client_generate_character.py +0 -0
  288. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_client_image.py +0 -0
  289. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_client_launch_kwargs.py +0 -0
  290. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_client_patch_entity.py +0 -0
  291. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_client_scene.py +0 -0
  292. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_client_upscale.py +0 -0
  293. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_concurrency.py +0 -0
  294. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_dto.py +0 -0
  295. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_image.py +0 -0
  296. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_image_dto.py +0 -0
  297. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_image_upscale.py +0 -0
  298. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_post_json_aisandbox_auth.py +0 -0
  299. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_recaptcha.py +0 -0
  300. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_retry.py +0 -0
  301. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_routes.py +0 -0
  302. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_routes_character.py +0 -0
  303. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_routes_scene.py +0 -0
  304. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_sapisidhash_helper.py +0 -0
  305. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_scene_models.py +0 -0
  306. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_video.py +0 -0
  307. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_video_request.py +0 -0
  308. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/transports/__init__.py +0 -0
  309. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/transports/test_base.py +0 -0
  310. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/transports/test_bearer.py +0 -0
  311. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/transports/test_common.py +0 -0
  312. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
  313. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/transports/test_factory.py +0 -0
  314. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/transports/test_fingerprint.py +0 -0
  315. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/transports/test_sapisidhash.py +0 -0
  316. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/transports/test_transport_timeout.py +0 -0
  317. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/transports/test_ui_automation_batch.py +0 -0
  318. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/transports/test_ui_character_editor.py +0 -0
  319. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/auth/strategies/test_factory.py +0 -0
  320. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/__init__.py +0 -0
  321. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/test_cli_auth_list.py +0 -0
  322. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/test_cli_character.py +0 -0
  323. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/test_cli_character_create.py +0 -0
  324. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/test_cli_data.py +0 -0
  325. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/test_cli_image.py +0 -0
  326. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
  327. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/test_cli_image_upscale.py +0 -0
  328. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/test_cli_models.py +0 -0
  329. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/test_cli_movie.py +0 -0
  330. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/test_cli_run.py +0 -0
  331. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/test_cli_scene.py +0 -0
  332. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/test_cli_video.py +0 -0
  333. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/test_cli_video_chain.py +0 -0
  334. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/test_error_handling.py +0 -0
  335. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/test_helpers.py +0 -0
  336. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/test_movie_manifest.py +0 -0
  337. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
  338. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/composition/test_character.py +0 -0
  339. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/composition/test_compose_prompt.py +0 -0
  340. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/composition/test_handoff.py +0 -0
  341. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/conftest.py +0 -0
  342. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/data/__init__.py +0 -0
  343. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/data/test_chain_repo.py +0 -0
  344. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/data/test_find_incomplete_character.py +0 -0
  345. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/data/test_models.py +0 -0
  346. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/data/test_packaging.py +0 -0
  347. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/data/test_recorder.py +0 -0
  348. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/data/test_recorder_character.py +0 -0
  349. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/data/test_redaction.py +0 -0
  350. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/data/test_repository.py +0 -0
  351. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/data/test_scene_persistence.py +0 -0
  352. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/data/test_settings_and_errors.py +0 -0
  353. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/data/test_store_migrations.py +0 -0
  354. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/dev/test_record_flow_capture.py +0 -0
  355. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/dev/test_recording_client.py +0 -0
  356. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/e2e/__init__.py +0 -0
  357. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
  358. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/e2e/test_chain_e2e.py +0 -0
  359. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/e2e/test_character_create_e2e.py +0 -0
  360. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/e2e/test_data_layer_e2e.py +0 -0
  361. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/e2e/test_i2v_flags_e2e.py +0 -0
  362. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/e2e/test_image_batch_e2e.py +0 -0
  363. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
  364. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/e2e/test_json_output_e2e.py +0 -0
  365. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
  366. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/e2e/test_scene_compose_live.py +0 -0
  367. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/e2e/test_transports_e2e.py +0 -0
  368. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
  369. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
  370. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/__init__.py +0 -0
  371. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/auth.feature +0 -0
  372. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/auth_login.feature +0 -0
  373. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/character_create.feature +0 -0
  374. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/character_read.feature +0 -0
  375. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/conftest.py +0 -0
  376. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/image.feature +0 -0
  377. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/image_upscale.feature +0 -0
  378. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/test_auth_login_steps.py +0 -0
  379. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/test_auth_steps.py +0 -0
  380. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/test_character_create_steps.py +0 -0
  381. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/test_character_read_steps.py +0 -0
  382. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/test_image_steps.py +0 -0
  383. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/test_image_upscale_steps.py +0 -0
  384. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/test_step_collision_guard.py +0 -0
  385. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/test_video_chain_steps.py +0 -0
  386. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/video_chain.feature +0 -0
  387. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/fixtures/__init__.py +0 -0
  388. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/fixtures/seeded_catalog.py +0 -0
  389. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/image_batch/__init__.py +0 -0
  390. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/image_batch/test_image_manifest.py +0 -0
  391. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/image_batch/test_observability_events.py +0 -0
  392. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/integration/__init__.py +0 -0
  393. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/integration/conftest.py +0 -0
  394. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/integration/constants.py +0 -0
  395. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/integration/test_storage_gcs.py +0 -0
  396. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/integration/test_storage_s3.py +0 -0
  397. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
  398. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/scripts/test_check_materiality.py +0 -0
  399. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/scripts/test_materiality_backtest.py +0 -0
  400. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/services/__init__.py +0 -0
  401. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/services/test_character_create_redaction.py +0 -0
  402. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/services/test_character_create_saga.py +0 -0
  403. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
  404. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/smoke/__init__.py +0 -0
  405. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/smoke/test_profile_account_smoke.py +0 -0
  406. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/smoke/test_real_flow.py +0 -0
  407. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_auth.py +0 -0
  408. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_browser_manager.py +0 -0
  409. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_chain.py +0 -0
  410. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_chain_manifest.py +0 -0
  411. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_cli_data.py +0 -0
  412. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_config.py +0 -0
  413. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_conftest_isolation.py +0 -0
  414. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_data_queries.py +0 -0
  415. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_documentation_gate.py +0 -0
  416. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_errors_403.py +0 -0
  417. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_json_output.py +0 -0
  418. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_manifest.py +0 -0
  419. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_marker_registry.py +0 -0
  420. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_media.py +0 -0
  421. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_observability.py +0 -0
  422. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_paths.py +0 -0
  423. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_profile_store.py +0 -0
  424. {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_smoke.py +0 -0
@@ -50,3 +50,10 @@ If the coverage run crashes the current MCP/sandbox session with `Connection clo
50
50
  same marker-filtered suite in smaller chunks without coverage and rely on CI for the coverage XML.
51
51
  Project pytest defaults already exclude `e2e` and `live`; those markers are explicit,
52
52
  credit-spending gates and must be requested with a separate `-m e2e` / `-m live` command.
53
+
54
+ **Windows agent sessions:** `uv run pytest` is unreliable — invoke
55
+ `.venv/Scripts/python.exe -m pytest` directly, and prefix Python invocations with
56
+ `PYTHONUTF8=1` when output contains non-ASCII. The unscoped full-coverage sweep
57
+ (step 4) can OOM locally (exit 137 / SIGKILL): run the suites scoped to the dirs you
58
+ touched and trust CI for the full coverage gate — **a green full-suite CI run on the
59
+ same tree (e.g. the just-merged PR) satisfies step 4 for release purposes.**
@@ -70,6 +70,19 @@ memory) or the release branch will hit conflicts on `pyproject.toml` / `__init__
70
70
 
71
71
  Run `/gflow:check` — all gates must pass. Abort if any fail.
72
72
 
73
+ **4b. Live-verify the release's user-facing features (REQUIRED gate).**
74
+
75
+ For every new/changed user-facing feature in this release, exercise it against
76
+ live Flow (credit-free wherever possible — image gen, entity attach, upscale, and
77
+ scene/timeline ops cost no Veo credits) and write the evidence to
78
+ `docs/LIVE_VERIFICATION_v<NEW_VERSION>.md` using the 5-layer ledger (file count +
79
+ magic bytes + dimensions/shape + structlog invariants + a user-confirmable
80
+ artifact). Add it to the "what was live-verified" entry in `docs/INDEX.md`. This
81
+ doc shipped for every release v0.7.0→v0.13.0, then lapsed for v0.14.0–v0.15.1 —
82
+ which is why it is now an explicit gate. If a feature genuinely cannot be verified
83
+ this cycle, record that and the reason in the doc; never silently omit it. Stage
84
+ the doc into the release-prep commit (step 11).
85
+
73
86
  **5. Create a release branch off `develop`.**
74
87
 
75
88
  ```bash
@@ -116,6 +129,12 @@ rg -n "__version__|<OLD_VERSION>|version assertion" tests src pyproject.toml
116
129
 
117
130
  Run `/gflow:doc-review` — audit all version refs, INDEX completeness, evidence files, skill files, CHANGELOG footer, and memory files. Fix every **FAIL** before continuing. Fold all discovered fixes into the release prep commit.
118
131
 
132
+ Also **consolidate shipped planning artifacts** here: extract any durable patterns
133
+ into auto-memory, then remove the now-shipped `docs/superpowers/` plan / spec /
134
+ verification files (keep only in-flight work). `check_repo_hygiene.py` enforces the
135
+ root-doc allowlist, so a stray review doc or session marker left at the repo root
136
+ will fail the gate.
137
+
119
138
  **11. Commit the release prep.**
120
139
 
121
140
  ```bash
@@ -66,6 +66,9 @@ test_assets/debug_*/
66
66
  # Phase-2 live-spike capture outputs — NEVER commit (may contain real API payloads)
67
67
  scripts/dev/_spike_out/
68
68
 
69
+ # Agent session marker — machine/session-local handoff state, regenerated per run
70
+ .continue-here.md
71
+
69
72
  # Live Flow traffic captures — NEVER commit (contain real Bearer tokens / API keys).
70
73
  # Diagnostic scripts MUST default-write here, NOT to samples/captured/.
71
74
  # Sanitised reference samples (no secrets) can still live under samples/captured/.
@@ -56,7 +56,7 @@ Or invoke the wrapper: `/gflow:check`.
56
56
 
57
57
  - Type hints everywhere; `pyright` strict on `src/gflow_cli`.
58
58
  - Structured logging only (`structlog`) — **never** raw `print()` or `import logging` in `src/`.
59
- - Errors as RFC 9457 Problem Details with stable per-class exit codes (3–21, e.g. 16 is the `DataStoreError` family, 19 `SceneConcatError`, 20 `FrameExtractionError`, 21 `ChainPartialError`). See `src/gflow_cli/errors.py::EXIT_CODE_MAP` for the complete mapping.
59
+ - Errors as RFC 9457 Problem Details with stable per-class exit codes (3–22, e.g. 16 is the `DataStoreError` family, 19 `SceneConcatError`, 20 `FrameExtractionError`, 21 `ChainPartialError`, 22 `UpscaleUnavailableError`). See `src/gflow_cli/errors.py::EXIT_CODE_MAP` for the complete mapping.
60
60
  - 100-char line length, `ruff` configured. Imports sorted by `ruff` (isort rules).
61
61
 
62
62
  ## PR instructions
@@ -7,6 +7,39 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.18.0] — 2026-06-12
11
+
12
+ ### Added
13
+
14
+ - `UiSelectorDriftError` (exit code 23): UI-automation selector-probe failures — e.g. the
15
+ mode-switch `crop_*` trigger missing from the Flow editor (issue #183) — now raise a typed
16
+ error carrying the probe name, the debug-screenshot path, and a remediation hint, instead
17
+ of an opaque "Unexpected error" (exit 1) whose message was hashed away in logs. Converted
18
+ probes: mode-switch trigger, Image/Video mode tabs, and video sub-mode tabs, in both the
19
+ image and video transports.
20
+
21
+ ### Fixed
22
+
23
+ - `gflow image` commands (`t2i` / `i2i` / `upscale` / `upload`) now plumb their output
24
+ directory into the API client, so debug screenshots are actually captured on
25
+ UI-automation failures. Previously the transport's screenshot directory was never set on
26
+ the image path and drift errors reported `Screenshot: None` even with `--verbose`.
27
+
28
+ ## [0.17.0] — 2026-06-12
29
+
30
+ ### Added
31
+
32
+ - Added `verify_flow_profile` in `gflow_cli.auth.verification` using `browser_cookie3` and `httpx` to verify sessions directly from the Chrome cookie store (fast path), with a marker-gated Playwright fallback for encrypted/locked stores. `RealChromeStrategy` now writes the Chrome marker before verification (the fallback reads it) and, on failure, rolls back only a speculative write — a marker that legitimately pre-existed (a previously-verified chrome profile) survives a transient probe failure, and an interrupted verification never leaves an unverified profile claiming the chrome strategy. Cookie extraction is centralised in the new `gflow_cli.auth.cookies` module.
33
+
34
+ ### Fixed
35
+
36
+ - `gflow_cli.auth.cookies._get_chrome_cookies3` now catches `RuntimeError` (Windows DPAPI failure — `RuntimeError('Failed to decrypt the cipher text with DPAPI')`) in addition to `browser_cookie3.BrowserCookieError`, and re-raises both as `PermissionError` so the Playwright fallback is triggered instead of propagating an unhandled exception.
37
+ - `verify_flow_profile` now retries transient HTTP failures (429/503/504) and network errors up to `_MAX_ATTEMPTS` times with exponential backoff, matching the retry behaviour of the existing Playwright-based `verify_flow_session`.
38
+
39
+ ### Changed
40
+
41
+ - Entity-attach `WireFormatError` failures (exit 7) now carry a remediation hint pointing at Flow's new full-page media-library UI rollout ([#174](https://github.com/ffroliva/gflow-cli/issues/174)) — affected accounts can stage entities via the include action but the submit never carries `referenceEntities`; the error now explains how to tell which UI an account has and where to follow the fix, instead of the generic file-a-bug hint. Both backstops also emit an `entity_attach_context` discovery field (`video`/`image`) for drift telemetry. New KNOWN_ISSUES entry documents the rollout
42
+
10
43
  ## [0.16.0] — 2026-06-12
11
44
 
12
45
  ### Fixed
@@ -1494,7 +1527,9 @@ shell-script template that branches on these codes.
1494
1527
 
1495
1528
  First skeleton. Not functional end-to-end yet.
1496
1529
 
1497
- [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.16.0...HEAD
1530
+ [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.18.0...HEAD
1531
+ [0.18.0]: https://github.com/ffroliva/gflow-cli/compare/v0.17.0...v0.18.0
1532
+ [0.17.0]: https://github.com/ffroliva/gflow-cli/compare/v0.16.0...v0.17.0
1498
1533
  [0.16.0]: https://github.com/ffroliva/gflow-cli/compare/v0.15.1...v0.16.0
1499
1534
  [0.15.1]: https://github.com/ffroliva/gflow-cli/compare/v0.15.0...v0.15.1
1500
1535
  [0.15.0]: https://github.com/ffroliva/gflow-cli/compare/v0.14.0...v0.15.0
@@ -22,6 +22,7 @@
22
22
  - Slash commands live under `.claude/commands/gflow/` (all prefixed `/gflow:`).
23
23
  - Skills under `skills/` are auto-discoverable; `gflow-cli` ships its own at [`skills/gflow-cli/SKILL.md`](skills/gflow-cli/SKILL.md).
24
24
  - Auto-memory at `~/.claude/projects/C--development-github-gflow-cli/memory/MEMORY.md` carries cross-session feedback and project state.
25
+ - **Worktrees:** the native `EnterWorktree` tool branches from `origin/main` (the default branch). Feature work integrates via `develop` — after entering a fresh worktree, immediately `git switch -c <type>/<name> origin/develop` and delete the auto-created `worktree-*` branch. On Windows, worktree removal can fail on a file lock (the worktree's `.venv`); `git worktree prune` + manual delete later is fine.
25
26
 
26
27
  ## MCP GitHub tool — PR body rule (non-negotiable)
27
28
 
@@ -14,6 +14,39 @@ Living list of behaviour that's broken, surprising, or limited by design — alo
14
14
 
15
15
  ## Open
16
16
 
17
+ ### Flow's new full-page media-library UI breaks entity attach (A/B rollout)
18
+
19
+ - **Status:** **Open** — Flow-side staged rollout; tracked in
20
+ [#174](https://github.com/ffroliva/gflow-cli/issues/174)
21
+ - **Severity:** High · **Affects:** `gflow image t2i --reference-entity` and
22
+ movie R2V entity attach on accounts that received the new UI, any locale
23
+
24
+ Flow is A/B-rolling a new full-page media-library UI: clicking **Add Media**
25
+ in the composer **navigates to a library page** (sidebar: All media /
26
+ Characters / Scenes / Tools, with a floating quick-create composer) instead of
27
+ opening the resource-picker dialog. On affected accounts the right-click
28
+ include action still lands (a chip appears), **but the staged entity never
29
+ reaches the submit** — the request carries no `referenceEntities`, so the
30
+ submit backstops raise `WireFormatError` (**exit 7**) instead of silently
31
+ returning a text-only generation as success.
32
+
33
+ **How to tell which UI your account has:** in the Flow web editor, click
34
+ **Add Media** — a small dialog means the old (working) UI; a navigation to a
35
+ full-page library means the affected new UI.
36
+
37
+ **Note:** the experiment appears to flap — the affected account observed on
38
+ 2026-06-12 00:13 was back on the old dialog UI by 12:48 the same day (variant
39
+ probe, issue #174). If you hit exit 7 on entity attach, re-running later the
40
+ same day may simply work again.
41
+
42
+ **Workaround:** none yet on affected accounts — the attach gesture for the new
43
+ UI is being reverse-engineered (recon plan in
44
+ [docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md](docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md)).
45
+ If you have a second profile/account still on the old UI, entity attach works
46
+ there. Follow [#174](https://github.com/ffroliva/gflow-cli/issues/174) for
47
+ status; please report whether your account shows the dialog or the full-page
48
+ library (plus your locale) on that issue.
49
+
17
50
  ### 4K image upscale requires a Flow Ultra subscription
18
51
 
19
52
  - **Status:** **Open** (by design — a Flow platform limit, not a gflow bug)
@@ -595,6 +628,15 @@ success. The expected authenticated response shape is pinned by the
595
628
  change surfaces there as a failing test. Start any investigation of a sudden
596
629
  `gflow auth login` verification failure at that fixture and `verification.py`.
597
630
 
631
+ Since PR #168 the production entry point is `verify_flow_profile`, which reads
632
+ the session cookie **directly from Chrome's SQLite store** via `browser_cookie3`
633
+ (a no-browser fast path) and only falls back to launching Playwright when that
634
+ decryption fails. This adds two more local surfaces to check when verification
635
+ fails unexpectedly: a Windows **DPAPI decrypt failure** (cross-user / cross-machine
636
+ key — surfaces as a `RuntimeError` that `auth/cookies.py` normalizes to
637
+ `PermissionError` to trigger the Playwright fallback) and a **locked cookie DB**
638
+ (Chrome still running holds an exclusive SQLite lock). Both degrade fail-closed.
639
+
598
640
  ---
599
641
 
600
642
  ## Resolved
@@ -620,8 +662,8 @@ Profiles created before this fix continue to work and display `unknown` in the
620
662
  account column. Re-running `gflow auth login` against an existing profile backfills
621
663
  the `.gflow_account` file.
622
664
 
623
- See [AUTHENTICATION.md § Profile naming](AUTHENTICATION.md#profile-naming) for the
624
- new naming convention and [AUTHENTICATION.md § gflow auth list](AUTHENTICATION.md#gflow-auth-list)
665
+ See [AUTHENTICATION.md § Profile naming](docs/AUTHENTICATION.md#profile-naming) for the
666
+ new naming convention and [AUTHENTICATION.md § gflow auth list](docs/AUTHENTICATION.md#gflow-auth-list)
625
667
  for the updated `--json` schema.
626
668
 
627
669
  ---
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gflow-cli
3
- Version: 0.16.0
3
+ Version: 0.18.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
@@ -37,6 +37,7 @@ Classifier: Programming Language :: Python :: 3.12
37
37
  Classifier: Programming Language :: Python :: 3.13
38
38
  Classifier: Topic :: Multimedia :: Video
39
39
  Requires-Python: >=3.11
40
+ Requires-Dist: browser-cookie3>=0.20.1
40
41
  Requires-Dist: click>=8.1.0
41
42
  Requires-Dist: httpx>=0.27.0
42
43
  Requires-Dist: platformdirs>=4.0.0
@@ -68,28 +68,43 @@ python -m pip install --pre gflow-cli
68
68
  uv run pyright src
69
69
  uv run python -m pytest -q --cov=gflow_cli
70
70
  ```
71
- 4. Update the version in:
71
+ 4. **Live-verify the release's user-facing features and record the evidence.**
72
+ **Required gate — do not skip.** Exercise each new/changed user-facing feature
73
+ against live Flow (credit-free wherever possible — image gen, entity attach,
74
+ upscale, and scene/timeline ops cost no Veo credits) and write the result to
75
+ `docs/LIVE_VERIFICATION_vX.Y.Z.md` using the 5-layer ledger (file count + magic
76
+ bytes + dimensions/shape + structlog invariants + user-confirmable artifact).
77
+ Then add it to the "what was live-verified" entry in `docs/INDEX.md`. Every
78
+ release v0.7.0→v0.13.0 had this doc; it lapsed for v0.14.0–v0.15.1 — that gap is
79
+ the reason this is now an explicit step. If a feature genuinely cannot be live-
80
+ verified this cycle, say so in the doc with the reason; never silently omit it.
81
+ 5. **Consolidate shipped planning artifacts.** Extract any durable patterns into
82
+ auto-memory, then remove the now-shipped `docs/superpowers/` plan / spec /
83
+ verification files (keep only in-flight work). Stale review docs and session
84
+ markers do not belong in the repo root. (Enforced by `check_repo_hygiene.py` —
85
+ see the root-doc allowlist.)
86
+ 6. Update the version in:
72
87
  - `pyproject.toml`
73
88
  - `src/gflow_cli/__init__.py`
74
89
  - any tests that assert the package version
75
- 5. Move user-visible changes from `CHANGELOG.md` `[Unreleased]` into a dated
90
+ 7. Move user-visible changes from `CHANGELOG.md` `[Unreleased]` into a dated
76
91
  release section.
77
- 6. Commit the release prep:
92
+ 8. Commit the release prep:
78
93
  ```bash
79
- git add pyproject.toml src/gflow_cli/__init__.py CHANGELOG.md tests
94
+ git add pyproject.toml src/gflow_cli/__init__.py CHANGELOG.md tests docs
80
95
  git commit -m "chore(release): vX.Y.Z"
81
96
  ```
82
- 7. Tag and push. **Must be a signed annotated tag** (`-s`) — `.github/workflows/release.yml` rejects unsigned or lightweight tags. Requires a GPG or SSH signing key registered with your GitHub account.
97
+ 9. Tag and push. **Must be a signed annotated tag** (`-s`) — `.github/workflows/release.yml` rejects unsigned or lightweight tags. Requires a GPG or SSH signing key registered with your GitHub account.
83
98
  ```bash
84
99
  git tag -s vX.Y.Z -m "vX.Y.Z"
85
100
  git push origin main
86
101
  git push origin vX.Y.Z
87
102
  ```
88
- 8. Watch the release workflow:
89
- <https://github.com/ffroliva/gflow-cli/actions/workflows/release.yml>
90
- 9. Confirm the new version appears on:
91
- - <https://pypi.org/project/gflow-cli/>
92
- - <https://github.com/ffroliva/gflow-cli/releases>
103
+ 10. Watch the release workflow:
104
+ <https://github.com/ffroliva/gflow-cli/actions/workflows/release.yml>
105
+ 11. Confirm the new version appears on:
106
+ - <https://pypi.org/project/gflow-cli/>
107
+ - <https://github.com/ffroliva/gflow-cli/releases>
93
108
 
94
109
  ## Known Historical Quirk
95
110
 
@@ -364,6 +364,27 @@ Run: gflow auth login --profile default
364
364
 
365
365
  Re-running `auth login` refreshes the cookies in place — no other state is lost.
366
366
 
367
+ ## Session verification (cookie-store fast path)
368
+
369
+ Since v0.17.0, profile verification (run by `gflow auth login --browser chrome` after
370
+ capture) is handled by `gflow_cli.auth.verification.verify_flow_profile`, which probes
371
+ Flow's `/fx/api/auth/session` endpoint **directly from the Chrome cookie store** via
372
+ `browser_cookie3` + `httpx` — no browser launch needed (contributed in PR #168 by
373
+ @3mora2). Two hardening behaviors:
374
+
375
+ - **Encrypted/locked store fallback** — if the cookie store can't be read (e.g.
376
+ Windows DPAPI decryption fails, or the store is locked by a running Chrome), the
377
+ verifier falls back to a marker-gated Playwright probe. The chrome marker is written
378
+ before verification so the fallback can find the profile; on failure only a
379
+ *speculative* marker write is rolled back — a previously-verified profile survives a
380
+ transient probe failure.
381
+ - **Transient-error retry** — HTTP 429/503/504 and network errors retry with
382
+ exponential backoff before the verifier gives up.
383
+
384
+ The outcome is the same `AUTHENTICATED` / no-session decision documented under
385
+ [`gflow auth status`](#gflow-auth-status); only the transport is faster. Cookie
386
+ extraction lives in `gflow_cli.auth.cookies`.
387
+
367
388
  ## Threat model & limits
368
389
 
369
390
  | Threat | Mitigation |
@@ -85,6 +85,7 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
85
85
  **"How do I run with multiple Google accounts?"** → [AUTHENTICATION § Multiple accounts](AUTHENTICATION.md#multiple-accounts)
86
86
  **"How do I know which Google account a profile is signed into?"** → [AUTHENTICATION § gflow auth list](AUTHENTICATION.md#gflow-auth-list)
87
87
  **"Why is my profile named 'default' and how do I rename it?"** → [AUTHENTICATION § Profile naming](AUTHENTICATION.md#profile-naming)
88
+ **"How does login verification work without launching a browser?"** → [AUTHENTICATION § Session verification](AUTHENTICATION.md#session-verification-cookie-store-fast-path) (cookie-store fast path, v0.17.0)
88
89
  **"How does the layered structure work?"** → [ARCHITECTURE § Layers](ARCHITECTURE.md#layers)
89
90
  **"What env var should I set for X?"** → [CONFIGURATION § Reference](CONFIGURATION.md#reference)
90
91
  **"What does gflow remember after a generation finishes?"** → [DATA_LAYER § What is recorded](DATA_LAYER.md#what-is-recorded)
@@ -110,7 +111,8 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
110
111
  **"A gflow command hangs / fails — where do I start?"** → [DEBUGGING § Quick reference](DEBUGGING.md#quick-reference)
111
112
  **"Flow's UI broke a selector — how do I diagnose it?"** → [DEBUGGING § Inspecting Flow's live UI](DEBUGGING.md#inspecting-flows-live-ui)
112
113
  **"What does each `ui_automation.*` log event mean?"** → [DEBUGGING § Listener & HTTP-layer debugging](DEBUGGING.md#listener--http-layer-debugging)
113
- **"What was actually live-verified for the latest release?"** → v0.15.0 / v0.14.x: no dedicated live-verification doc (CI + the v0.13.0 baseline). Latest doc: [LIVE_VERIFICATION_v0.13.0](LIVE_VERIFICATION_v0.13.0.md) · prior: [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)
114
+ **"What was actually live-verified for the latest release?"** → latest: [LIVE_VERIFICATION_v0.18.0](LIVE_VERIFICATION_v0.18.0.md) (#183 exit-23 selector-drift error: live drift simulation + happy path, credit-free). v0.14.0 / v0.15.0 / v0.15.1 shipped without a dedicated doc (CI + the v0.13.0 baseline). Prior: [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)
115
+ **"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.
114
116
  **"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)
115
117
  **"What was live-verified for the video-download feature (#29)?"** → [LIVE_VERIFICATION_video_download](LIVE_VERIFICATION_video_download.md)
116
118
  **"What is the jitter matrix evidence for `gflow image batch`?"** → [`LIVE_VERIFICATION_image_batch.md`](LIVE_VERIFICATION_image_batch.md) — jitter matrix evidence for `gflow image batch` (always-same-project mode)
@@ -0,0 +1,77 @@
1
+ # Live verification — v0.16.0
2
+
3
+ > Evidence record for the v0.16.0 release. v0.16.0 ships two features: locale-free
4
+ > resource-picker include selectors (issue #170, PR #173) and `gflow image upscale`
5
+ > (issue #171, PR #172). Backfilled 2026-06-12 to close the live-verification
6
+ > documentation gap that opened after v0.13.0 (see docs/INDEX.md).
7
+
8
+ ## Summary
9
+
10
+ - **Verified by:** ffroliva (Claude Code)
11
+ - **Dates:** #171 upscale — 2026-06-11 (feature branch); #170 selectors — 2026-06-12 (released PyPI artifact)
12
+ - **gflow-cli version:** 0.16.0
13
+ - **Status:** 🟢 Green — both features live-verified credit-free; no Veo credits spent
14
+
15
+ All verification below is **credit-free**: image generation, character-entity attach,
16
+ and image upscale are non-Veo operations (see the credits-are-videos-only note in
17
+ `KNOWN_ISSUES.md`). No video generation was exercised for this release.
18
+
19
+ ## 1. Quality gates
20
+
21
+ - [x] **Lint/format** — `ruff check` + `ruff format --check` clean (`src` + `tests`).
22
+ - [x] **Type check** — `pyright src`: 0 errors.
23
+ - [x] **Unit + BDD tests** — full suite green in CI across Python 3.11 / 3.12 / 3.13 (PR #173, PR #172).
24
+ - [x] **Repo hygiene + doc links** — `check_repo_hygiene.py` + `check_doc_links.py` green.
25
+
26
+ ## 2. Issue #170 — locale-free picker include selectors (PR #173)
27
+
28
+ The pt-BR-hardcoded resource-picker include selectors broke entity attach on every
29
+ non-Portuguese account. PR #173 replaced them with sequentially-probed tier cascades
30
+ (locale-invariant ligature anchor first, then localized-text fallback) and added an
31
+ image-side submit backstop that fails loudly (`WireFormatError`, exit 7) if a staged
32
+ entity never reaches the wire.
33
+
34
+ ### E2E evidence (live Flow, credit-free)
35
+
36
+ | Layer | Criterion | Outcome |
37
+ |---|---|---|
38
+ | Selector tier | `include_selector_tier=icon` logged (locale-free anchor matched) | **PASS** |
39
+ | Attach event | `ui_automation.character_entity_attached` fired | **PASS** |
40
+ | Submit backstop | `ui_automation.image_entities_attached` — entity rode the wire | **PASS** |
41
+ | Output artifact | t2i produced a JPEG, **768×1376**, character identity visibly preserved | **PASS** |
42
+ | Version | all events emitted at `cli_version 0.16.0` | **PASS** |
43
+
44
+ - **Pre-merge:** live credit-free `gflow image t2i --reference-entity` on **promo-denon82**
45
+ (pt-BR profile). Recon harness: `scripts/dev/spike_issue170_picker_locale_recon.py`.
46
+ - **Released-artifact re-verification (2026-06-12):** installed `gflow-cli==0.16.0` from
47
+ PyPI (global `uv tool`) and re-ran the same flow on promo-denon82 — all four layers
48
+ above green at `cli_version 0.16.0`. **5-layer ledger PASS.**
49
+ - The backstop earned its keep immediately: it converted Flow's new full-page library-UI
50
+ A/B (issue #174) from a silent text-only "success" into a typed exit-7 failure on its
51
+ first live encounter.
52
+
53
+ ## 3. Issue #171 — `gflow image upscale` (PR #172)
54
+
55
+ `gflow image upscale <mediaId> --scale 2k|4k` upscales a platform-generated image via
56
+ Flow's `POST /v1/flow/upsampleImage` (reCAPTCHA-gated, inline base64 response). 4K is
57
+ Ultra-gated and fails fast with `UpscaleUnavailableError` (exit 22) on lower tiers.
58
+
59
+ ### E2E evidence (live Flow, credit-free)
60
+
61
+ | Layer | Criterion | Outcome |
62
+ |---|---|---|
63
+ | Wire | `POST /v1/flow/upsampleImage` accepted (full 5-field `clientContext`, action `IMAGE_GENERATION`) | **PASS** |
64
+ | File written | local JPEG written, **3,799,245 bytes** | **PASS** |
65
+ | Magic bytes | header `FF D8 FF` (valid JPEG) | **PASS** |
66
+ | Byte fidelity | written bytes matched the decoded wire payload | **PASS** |
67
+ | Tier gate | 4K returns exit 22 (`UpscaleUnavailableError`) on non-Ultra, not a generic 403 | **PASS** |
68
+
69
+ - Verified 2026-06-11 on the `feature/image-upscale` branch (= the code released as
70
+ v0.16.0): `gflow image upscale <mediaId> --scale 2k --project <pid>` end-to-end.
71
+ - Wire protocol documented in [`docs/IMAGE_UPSCALE_RECON.md`](IMAGE_UPSCALE_RECON.md).
72
+
73
+ ## 4. Documentation
74
+
75
+ - `CHANGELOG.md` — v0.16.0 entry covers both features.
76
+ - `KNOWN_ISSUES.md` — 4K-Ultra limit documented; library-UI A/B (#174) tracked.
77
+ - `docs/IMAGE_UPSCALE_RECON.md` — reverse-engineered upscale wire.
@@ -0,0 +1,94 @@
1
+ # Live verification — v0.17.0
2
+
3
+ > Evidence record for the v0.17.0 release. v0.17.0 ships one feature — cookie-store
4
+ > Flow-session verification (`verify_flow_profile`, PR #168, contributed by @3mora2)
5
+ > plus two hardening fixes to it — and one behavior change: the issue-#174
6
+ > entity-attach exit-7 remediation hint + `entity_attach_context` telemetry (PR #177).
7
+
8
+ ## Summary
9
+
10
+ - **Verified by:** ffroliva (Claude Code)
11
+ - **Date:** 2026-06-12 (fresh run on the release tree, `develop @ 5444de8`)
12
+ - **gflow-cli version:** 0.17.0 (pre-tag verification)
13
+ - **Status:** 🟢 Green — cookie verification live-verified credit-free; the #174 hint
14
+ is intentionally not live-triggerable this cycle (reason recorded below)
15
+
16
+ All verification below is **credit-free**: session verification probes
17
+ `/fx/api/auth/session` and spends no Veo credits; no generation was exercised.
18
+
19
+ ## 1. Pre-tag gates
20
+
21
+ - [x] **Repo hygiene + doc links** — `check_repo_hygiene.py` + `check_doc_links.py` green.
22
+ - [x] **Lint/format** — `ruff check --fix` + `ruff format`: 219 files, nothing to fix.
23
+ - [x] **Type check** — `pyright src`: 0 errors.
24
+ - [x] **Unit + BDD tests** — full suite green in CI on the exact release tree
25
+ (`develop @ 5444de8`, CI run 2026-06-12 13:58 UTC, success).
26
+ - [x] **`/gflow:doc-review`** — mechanical pass + 3-auditor council. *Council verdict:
27
+ GREEN / YELLOW / GREEN. 5 findings; 0 Tier 1 (release-blocking); 4 fixed in the
28
+ release-prep commit (KNOWN_ISSUES → AUTHENTICATION link path, AGENTS.md exit-code
29
+ range 3–22, new AUTHENTICATION § Session verification section, INDEX routing row);
30
+ 1 Tier 3 deferred (dedicated `verify_flow_profile` API reference doc). Council
31
+ reports at `tmp/council/0{1,2,3}-*.md` (local-only).*
32
+
33
+ ## 2. PR #168 — cookie-store session verification (`verify_flow_profile`)
34
+
35
+ `gflow_cli.auth.verification.verify_flow_profile` verifies a Flow session directly
36
+ from the Chrome cookie store via `browser_cookie3` + `httpx` (fast path), falling
37
+ back to a marker-gated Playwright probe when the store is encrypted/locked. The two
38
+ Fixed entries harden the same path: Windows DPAPI `RuntimeError` now triggers the
39
+ fallback instead of propagating, and transient HTTP failures (429/503/504) retry
40
+ with backoff.
41
+
42
+ ### E2E evidence (live Google endpoint, credit-free)
43
+
44
+ Fresh run on the release tree, 2026-06-12 15:5x (UTC+1), profile **denon82**:
45
+
46
+ ```
47
+ $env:GFLOW_CLI_E2E_PROFILE='denon82'
48
+ .venv\Scripts\python.exe -m pytest tests/e2e/test_auth_verification_e2e.py -m e2e_auth -v
49
+ ```
50
+
51
+ | Case | Criterion | Outcome |
52
+ |---|---|---|
53
+ | `test_e2e_verify_flow_profile_authenticated` | Logged-in profile → `AUTHENTICATED` with a non-empty `user_email`, **and** the same profile passes `FlowApiClient.health_check()` | **PASS** |
54
+ | `test_e2e_verify_flow_profile_no_session` | Sessionless store → typed non-authenticated outcome (no false positive, no crash) | **PASS** |
55
+ | `test_e2e_verify_flow_profile_falls_back_to_playwright` | Cookie-store read failure → Playwright fallback engages and verifies | **PASS** |
56
+
57
+ ```
58
+ 3 passed in 17.20s
59
+ ```
60
+
61
+ The same three cases were also verified green live on denon82 during the PR #168
62
+ review council (pre-merge, same day) — this run re-confirms on the post-merge
63
+ release tree.
64
+
65
+ ## 3. PR #177 — issue #174 entity-attach exit-7 hint + telemetry
66
+
67
+ Entity-attach `WireFormatError` failures (exit 7) now carry `ENTITY_ATTACH_DRIFT_HINT`
68
+ (dialog-vs-navigate self-diagnosis + link to #174) and both submit backstops emit an
69
+ `entity_attach_context` discovery field (`video`/`image`).
70
+
71
+ ### Not live-triggerable this cycle — reason
72
+
73
+ Triggering the hint live requires an account on Flow's new full-page media-library
74
+ UI (the #174 A/B variant where staged entities are dropped from the submit). The
75
+ A/B has **rolled back off both available accounts**: the variant re-probe on
76
+ 2026-06-12 15:48 (UTC+1) via `scripts/dev/spike_issue174_library_ui_recon.py`
77
+ returned `variant=dialog` on **denon82** (15 ms) and **promo-denon82** (8 ms) —
78
+ evidence posted on [#174](https://github.com/ffroliva/gflow-cli/issues/174).
79
+ With no affected account, the backstop cannot fire live without a real wire
80
+ regression to provoke it.
81
+
82
+ Coverage in lieu of a live trigger:
83
+
84
+ - The hint text, exit code, and `entity_attach_context` field are covered by the
85
+ PR #177 unit/BDD suites (green in CI on the release tree).
86
+ - The underlying backstops themselves were live-verified for v0.16.0 (the image
87
+ backstop's first live encounter is what *opened* #174 — see
88
+ [LIVE_VERIFICATION_v0.16.0](LIVE_VERIFICATION_v0.16.0.md)).
89
+ - The credit-free variant probe above exercised the real composer Add-Media path
90
+ on both accounts at the release tree without drift.
91
+
92
+ ## Post-tag evidence
93
+
94
+ *(filled after the tag push and PyPI publish)*
@@ -0,0 +1,72 @@
1
+ # Live verification — v0.18.0
2
+
3
+ > Evidence record for the v0.18.0 release. v0.18.0 ships one feature — typed
4
+ > `UiSelectorDriftError` (exit code 23) for UI-automation selector-probe failures
5
+ > (issue #183, PR #184) — and one fix: the `gflow image` command family now wires
6
+ > its output directory into the API client so debug screenshots are actually
7
+ > captured on UI-automation failures.
8
+
9
+ ## Summary
10
+
11
+ - **Verified by:** ffroliva (Claude Code)
12
+ - **Date:** 2026-06-12 (live runs on the PR #184 head `45ae442`, merged unchanged
13
+ into `develop @ 9f1d80b`)
14
+ - **gflow-cli version:** 0.18.0 (pre-tag verification)
15
+ - **Status:** 🟢 Green — both the failure path (drift simulation) and the happy
16
+ path live-verified, **credit-free** (image generation spends no Veo credits)
17
+
18
+ ## 1. Pre-tag gates
19
+
20
+ - `ruff check src tests` — clean; `ruff format --check` — 220 files formatted
21
+ - `pyright src` — 0 errors (7 pre-existing `browser_cookie3` resolution errors in
22
+ the local env only, untouched `auth/cookies.py`; CI green)
23
+ - Scoped pytest (errors + transports + cli surfaces) — 475 passed, 1 skipped
24
+ - PR #184 CI — 7/7 checks green on `45ae442` (test matrix 3.11/3.12/3.13,
25
+ gitleaks, SonarCloud)
26
+
27
+ ## 2. Failure path — live drift simulation (the issue-#183 condition)
28
+
29
+ `MODE_SWITCH_TRIGGER_SELECTORS` was patched (in both transport module namespaces)
30
+ to a guaranteed-miss selector, reproducing exactly the reporter's DOM condition —
31
+ the crop_* mode-switch trigger absent from the Flow editor. The real CLI t2i path
32
+ was then run against live Flow (profile `denon82`, project created, $0 credits —
33
+ the failure fires before any generation).
34
+
35
+ | Ledger layer | Evidence |
36
+ |---|---|
37
+ | Exit code | **23** (`UiSelectorDriftError` via `EXIT_CODE_MAP`) |
38
+ | File count | 1 — `debug_no_mode_trigger.png` written to the `--out` dir |
39
+ | Magic bytes | `\x89PNG\r\n\x1a\n` ✅ (valid PNG) |
40
+ | Dimensions | 1280×720 (Pillow) |
41
+ | structlog invariants | `selector_miss` ×1 (bogus selector) → `selector_probe_failed` → `error_raised` with full RFC 9457 problem payload; **zero** `error_unhandled` / `message_hash` events |
42
+ | User-visible artifact | `Flow UI selector drift: probe=mode_switch_trigger: no matching element found on the Flow editor. Screenshot: <out-dir>/debug_no_mode_trigger.png` + remediation hint (no `--verbose` claim, PII warning present) |
43
+
44
+ This is the user-facing contract the release exists for: the issue-#183 reporter
45
+ saw `Unexpected error` (exit 1) with the real message hashed away; on v0.18.0 the
46
+ same condition produces an actionable, screenshot-carrying exit-23 error.
47
+
48
+ ## 3. Happy path — mode-switch unregressed
49
+
50
+ `gflow --verbose image t2i "<prompt>" --profile denon82 --aspect 9:16 --out <dir>`
51
+ against live Flow:
52
+
53
+ | Ledger layer | Evidence |
54
+ |---|---|
55
+ | Exit code | 0 |
56
+ | File count | 1 (`ec262f4c-….jpg`) |
57
+ | Magic bytes | `\xff\xd8\xff` ✅ (valid JPEG) |
58
+ | Dimensions | 768×1376 (portrait — matches `--aspect 9:16`) |
59
+ | structlog invariants | `image_mode_entered` fired (mode-switch dropdown found and used); no `UiSelectorDriftError` in the run |
60
+ | User gallery | image present in the Flow project gallery (denon82) |
61
+
62
+ ## 4. Not verified this cycle (recorded, not omitted)
63
+
64
+ - **The drift error on a genuinely affected account:** the issue-#183 reporter's
65
+ account is in the (suspected) issue-#174 new-UI A/B cohort; both maintainer
66
+ accounts probed as the old dialog UI on 2026-06-12, so the organic condition is
67
+ not reproducible on our side. The simulation in § 2 exercises the identical
68
+ code path (selector cascade miss → typed raise → CLI boundary → exit 23).
69
+ Reporter confirmation is requested on #183.
70
+ - **`cli_character.py` screenshot wiring:** intentionally out of scope for this
71
+ release (tracked as a follow-up); its drift errors correctly omit the
72
+ `Screenshot:` clause.
@@ -4,9 +4,9 @@
4
4
 
5
5
  ## Current release
6
6
 
7
- **v0.15.0 — alpha.** **Character-consistent images via entity references.** `gflow image t2i/i2i` can now reference locked Flow CHARACTER entities (`--reference-entity <id>`, repeatable) and generate in an existing project (`--project <id>`) where those entities liveentities attach through the editor's Personagens picker and ride the submit as `referenceEntities` (confirmed against the live API; the body builder serializes them for headless transports too). Live-verified 2026-06-08: a 3-frame Dragon-Hook smoke rendered drift-free with all three characters on-model. LLM-council-reviewed (security/correctness/dedup) before merge. Carries forward the v0.14.0 `gflow movie` line (multi-scene, character-consistent video).
7
+ **v0.17.0 — alpha.** **Cookie-store session verification.** `verify_flow_profile` (contributed by @3mora2, PR #168) verifies a Flow session directly from the Chrome cookie store via `browser_cookie3` + `httpx` a fast path that skips launching a browser with a marker-gated Playwright fallback for encrypted/locked stores (Windows DPAPI failures included) and retry/backoff on transient HTTP errors. Entity-attach `WireFormatError` failures (exit 7) now carry an issue-#174-aware remediation hint plus `entity_attach_context` drift telemetry. Live-verified 2026-06-12 ([evidence](LIVE_VERIFICATION_v0.17.0.md)). Carries forward v0.16.0 (locale-free picker include selectors #170, `gflow image upscale` #171) and v0.15.1 (Docker `/dev/shm` hardening, mid-workflow 401 detection).
8
8
 
9
- **Develop (unreleased, post-v0.15.0):** *(empty — develop is the staging branch for the next release).*
9
+ **Develop (unreleased, post-v0.17.0):** *(empty — develop is the staging branch for the next release).*
10
10
 
11
11
  ## Milestone history
12
12
 
@@ -58,6 +58,11 @@
58
58
  | `gflow scene` — Add Clip / Scenes compose + credit-free server-side extended video (`runVideoFxConcatenation`) | ✅ done (v0.12.0) |
59
59
  | `gflow video chain` — last-frame I2V chaining from a JSONL manifest (`--dry-run`/`--max-links`/`--resume-from`) | ✅ done (v0.12.0) |
60
60
  | Create-project generation works under Flow's Agent docked chat panel | ✅ done (v0.12.0) |
61
+ | Video status poll raises `AuthExpiredError` (exit 3) on mid-workflow 401 (#156) + Docker `/dev/shm` hardening | ✅ done (v0.15.1) |
62
+ | Locale-free resource-picker include selectors — entity attach works on every account language (#170) | ✅ done (v0.16.0) |
63
+ | `gflow image upscale <mediaId> --scale 2k\|4k` — credit-free download-menu upscale, 4K Ultra-gated (#171) | ✅ done (v0.16.0) |
64
+ | Cookie-store session verification fast path (`verify_flow_profile`, PR #168) + Playwright fallback | ✅ done (v0.17.0) |
65
+ | Entity-attach exit-7 remediation hint + `entity_attach_context` drift telemetry (#174 interim) | ✅ done (v0.17.0) |
61
66
  | `gflow video batch` (TSV manifest) on `ui_automation` | ⏳ Phase B |
62
67
  | Persistence layer (stay-mounted batch sessions across project boundaries) | ⏳ Phase B |
63
68
  | Provider abstraction for official Veo 3.1 API | ⏳ planned |
@@ -1022,9 +1022,15 @@ shell scripts can branch on the failure mode without parsing stderr.
1022
1022
  | `12` | `AuthLoginTimeoutError` | Browser sign-in was not completed in time | Re-run login or raise `GFLOW_CLI_AUTH_LOGIN_TIMEOUT` |
1023
1023
  | `13` | `SecurityError` | Unsafe local profile or secret handling blocked | Follow the error's safety guidance |
1024
1024
  | `14` | `AuthBrowserRejectedError` | Google rejected the login browser | `gflow auth login --browser chrome` |
1025
+ | `15` | `BrowserSessionClosedError` | The automation browser window was closed mid-operation | Re-run; keep the browser window open until the command finishes |
1025
1026
  | `16` | `DataStoreError` | Local database cannot be opened, a migration failed, or the DB schema is newer than the installed gflow-cli | See below |
1026
1027
  | `17` | `ModelModeIncompatibilityError` | The chosen video model can't do the requested mode (e.g. `--model omni-flash` with an `i2v` start/end frame — issue #125) | Use `--model veo-lite` (or veo-fast / veo-quality / veo-lite-lp) for `i2v` |
1027
1028
  | `18` | `VideoModelSelectionError` | gflow could not select the requested video model in Flow's editor for an `i2v` run (model-picker option not found) | Usually transient — retry; if it persists, Flow's model-picker UI changed (report referencing #125) |
1029
+ | `19` | `SceneConcatError` | Server-side scene render/concat failed (`gflow scene --output`) | Retry; the recorded compose survives, so re-render is safe |
1030
+ | `20` | `FrameExtractionError` | Could not extract the last frame for a video chain link | Check the source video downloaded intact; retry the link |
1031
+ | `21` | `ChainPartialError` | A video chain stopped mid-way; earlier links completed | Resume from the last completed link shown in the error |
1032
+ | `22` | `UpscaleUnavailableError` | 4K upscale is gated to Flow **Ultra** accounts (HTTP 403) | Use `--scale 2k`, or upgrade the Flow plan |
1033
+ | `23` | `UiSelectorDriftError` | A Flow editor control could not be located — Google changed the frontend (issue #183) | Update gflow-cli; file a bug with the probe name + debug screenshot from the error message |
1028
1034
  | `130`| SIGINT | User-interrupted (Ctrl-C) | — |
1029
1035
 
1030
1036
  **Exit code 16 — data store / migration error.** Fires when: