gflow-cli 0.66.0__tar.gz → 0.66.1__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 (866) hide show
  1. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.codex-plugin/plugin.json +1 -1
  2. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/CHANGELOG.md +34 -1
  3. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/PKG-INFO +1 -1
  4. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/INDEX.md +2 -0
  5. gflow_cli-0.66.1/docs/LIVE_VERIFICATION_v0.66.1.md +69 -0
  6. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/PROJECT_STATUS.md +36 -0
  7. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/pyproject.toml +1 -1
  8. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/__init__.py +1 -1
  9. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/api/client.py +17 -2
  10. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/api/routes.py +32 -0
  11. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/api/transports/_common.py +6 -0
  12. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/api/transports/drivers/factory.py +21 -0
  13. gflow_cli-0.66.1/tests/api/test_routes_locale.py +185 -0
  14. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/transports/drivers/test_ui_mode.py +96 -1
  15. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/transports/test_common.py +43 -1
  16. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/uv.lock +1 -1
  17. gflow_cli-0.66.0/tests/api/test_routes_locale.py +0 -68
  18. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.agents/plugins/marketplace.json +0 -0
  19. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.claude/README.md +0 -0
  20. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.claude/commands/gflow/active.md +0 -0
  21. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.claude/commands/gflow/branch-review.md +0 -0
  22. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.claude/commands/gflow/changelog.md +0 -0
  23. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.claude/commands/gflow/check.md +0 -0
  24. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.claude/commands/gflow/doc-review.md +0 -0
  25. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.claude/commands/gflow/issue-assessment.md +0 -0
  26. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.claude/commands/gflow/issue-resolve.md +0 -0
  27. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.claude/commands/gflow/known-issues.md +0 -0
  28. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.claude/commands/gflow/live-verify.md +0 -0
  29. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.claude/commands/gflow/llm-council.md +0 -0
  30. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.claude/commands/gflow/next.md +0 -0
  31. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.claude/commands/gflow/plan.md +0 -0
  32. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.claude/commands/gflow/pr-council-review.md +0 -0
  33. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.claude/commands/gflow/predict.md +0 -0
  34. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.claude/commands/gflow/release.md +0 -0
  35. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.claude/commands/gflow/scenario.md +0 -0
  36. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.claude/commands/gflow/sonar.md +0 -0
  37. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.claude/commands/gflow/status.md +0 -0
  38. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.env.template +0 -0
  39. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.gitattributes +0 -0
  40. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.github/CODEOWNERS +0 -0
  41. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.github/FUNDING.yml +0 -0
  42. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  43. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.github/copilot-instructions.md +0 -0
  44. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.github/dependabot.yml +0 -0
  45. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.github/workflows/ci.yml +0 -0
  46. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.github/workflows/deps-watch.yml +0 -0
  47. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.github/workflows/external-pr-triage.yml +0 -0
  48. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.github/workflows/governance-advisory.yml +0 -0
  49. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.github/workflows/governance-benchmark.yml +0 -0
  50. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.github/workflows/labels.yml +0 -0
  51. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.github/workflows/main-base-guard.yml +0 -0
  52. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.github/workflows/pages.yml +0 -0
  53. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.github/workflows/release.yml +0 -0
  54. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.github/workflows/scorecard.yml +0 -0
  55. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.github/workflows/selector-probe.yml +0 -0
  56. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.github/workflows/star-history-watch.yml +0 -0
  57. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.gitignore +0 -0
  58. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.gitleaks.toml +0 -0
  59. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.pre-commit-config.yaml +0 -0
  60. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/.secrets.baseline +0 -0
  61. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/AGENTS.md +0 -0
  62. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/CLAUDE.md +0 -0
  63. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/CONFIGURATION.md +0 -0
  64. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/CONTRIBUTING.md +0 -0
  65. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/DISCLAIMER.md +0 -0
  66. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/KNOWN_ISSUES.md +0 -0
  67. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/LICENSE +0 -0
  68. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/PLAN.md +0 -0
  69. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/README.md +0 -0
  70. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/RELEASE.md +0 -0
  71. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/ROADMAP.md +0 -0
  72. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/conftest.py +0 -0
  73. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/deploy/PR-TRIAGE-AUTOPILOT-OPS.md +0 -0
  74. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/deploy/logrotate-pr-triage +0 -0
  75. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docker-compose.yml +0 -0
  76. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/ACCOUNT_SAFETY.md +0 -0
  77. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/AGENT_GUIDE.md +0 -0
  78. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/AGENT_UI_E2E.md +0 -0
  79. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/AGENT_UI_RECON.md +0 -0
  80. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/ARCHITECTURE.md +0 -0
  81. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/ASSET_TAGGING_RECON.md +0 -0
  82. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/AUTHENTICATION.md +0 -0
  83. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/CHARACTER.md +0 -0
  84. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/CHARACTER_RECON.md +0 -0
  85. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/CONFIGURATION.md +0 -0
  86. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/DATA_LAYER.md +0 -0
  87. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/DEBUGGING.md +0 -0
  88. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/DEMOS.md +0 -0
  89. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/DEVELOPMENT.md +0 -0
  90. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/E2E_TESTING.md +0 -0
  91. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/EXTERNAL_STORAGE.md +0 -0
  92. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/GITHUB.md +0 -0
  93. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/GOVERNANCE_BENCHMARK.md +0 -0
  94. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/IMAGE_UPSCALE_RECON.md +0 -0
  95. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/INSTRUCTIONS.md +0 -0
  96. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
  97. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
  98. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_playwright_1.61.md +0 -0
  99. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_reference_entity_guard.md +0 -0
  100. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
  101. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
  102. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
  103. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
  104. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
  105. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
  106. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
  107. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
  108. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
  109. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
  110. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.21.0.md +0 -0
  111. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.22.0.md +0 -0
  112. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.23.0.md +0 -0
  113. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.24.0.md +0 -0
  114. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.25.0.md +0 -0
  115. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.26.0.md +0 -0
  116. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.27.0.md +0 -0
  117. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.27.1.md +0 -0
  118. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.28.0.md +0 -0
  119. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.29.0.md +0 -0
  120. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.30.0.md +0 -0
  121. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.31.0.md +0 -0
  122. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.32.0.md +0 -0
  123. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.32.1.md +0 -0
  124. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.33.0.md +0 -0
  125. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.34.0.md +0 -0
  126. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.35.0.md +0 -0
  127. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.36.0.md +0 -0
  128. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.37.0.md +0 -0
  129. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.38.0.md +0 -0
  130. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.38.1.md +0 -0
  131. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.39.0.md +0 -0
  132. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.40.0-production-readiness.md +0 -0
  133. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.40.0.md +0 -0
  134. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.41.0.md +0 -0
  135. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.42.0.md +0 -0
  136. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.43.0.md +0 -0
  137. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.44.0.md +0 -0
  138. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.45.0.md +0 -0
  139. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.46.0.md +0 -0
  140. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.46.1.md +0 -0
  141. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.47.0.md +0 -0
  142. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.48.0.md +0 -0
  143. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.49.0.md +0 -0
  144. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.50.0.md +0 -0
  145. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.51.0.md +0 -0
  146. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.52.0.md +0 -0
  147. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.54.0.md +0 -0
  148. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.55.0.md +0 -0
  149. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.56.0.md +0 -0
  150. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.57.0.md +0 -0
  151. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.57.1.md +0 -0
  152. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.58.0.md +0 -0
  153. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.59.0.md +0 -0
  154. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.60.0.md +0 -0
  155. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.61.0.md +0 -0
  156. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.62.0.md +0 -0
  157. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.62.1.md +0 -0
  158. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.63.0.md +0 -0
  159. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.64.0.md +0 -0
  160. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.65.0.md +0 -0
  161. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.66.0.md +0 -0
  162. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
  163. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
  164. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
  165. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
  166. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/LIVE_VERIFICATION_video_download.md +0 -0
  167. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/MCP.md +0 -0
  168. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/MEDIA_LIBRARY.md +0 -0
  169. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/MOVIE.md +0 -0
  170. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/PROMPT_EXPANSION.md +0 -0
  171. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/REFERENCE_STRATEGIES.md +0 -0
  172. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/SECURITY.md +0 -0
  173. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/TOOLS.md +0 -0
  174. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/USAGE.md +0 -0
  175. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/USER_GUIDE.md +0 -0
  176. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/assets/demo-split-pf.gif +0 -0
  177. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/assets/example-run.gif +0 -0
  178. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/assets/examples.webp +0 -0
  179. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/medium_tutorial.md +0 -0
  180. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/schemas/movie-handoff.schema.json +0 -0
  181. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/sonar-cleanup-tracker.md +0 -0
  182. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
  183. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +0 -0
  184. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +0 -0
  185. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +0 -0
  186. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +0 -0
  187. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +0 -0
  188. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +0 -0
  189. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +0 -0
  190. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +0 -0
  191. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +0 -0
  192. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-07-08-pr-triage-autopilot/PLAN.md +0 -0
  193. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-07-09-camoufox-adoption/PLAN.md +0 -0
  194. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-07-14-storyboarding-and-visual-curation/PLAN.md +0 -0
  195. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-07-18-asset-tagging/PLAN.md +0 -0
  196. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-07-19-live-verify/PLAN.md +0 -0
  197. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-07-19-production-readiness-browser-lifecycle.md +0 -0
  198. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-07-19-production-readiness-driver-cdp-verification.md +0 -0
  199. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-07-19-production-readiness-public-truth.md +0 -0
  200. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-07-19-production-readiness-queue-safety.md +0 -0
  201. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-07-26-character-prompt-polishing/PLAN.md +0 -0
  202. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-07-26-project-name-management/PLAN.md +0 -0
  203. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-07-26-self-documenting-errors/PLAN.md +0 -0
  204. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-07-27-overlay-banner-dismissal/PLAN.md +0 -0
  205. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/PLAN.md +0 -0
  206. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/SCENARIO.md +0 -0
  207. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-08-04-mcp-tasks/PLAN.md +0 -0
  208. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-08-04-output-hardening/PLAN.md +0 -0
  209. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-08-05-issue-317-intra-batch-references/PLAN.md +0 -0
  210. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-08-05-issue-317-intra-batch-references/SCENARIO.md +0 -0
  211. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-08-05-issue-402-entity-provenance/PLAN.md +0 -0
  212. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-08-05-issue-402-entity-provenance/SCENARIO.md +0 -0
  213. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-08-05-issue-451-duration-tab-drift/PLAN.md +0 -0
  214. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-08-05-issue-451-duration-tab-drift/SCENARIO.md +0 -0
  215. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-08-06-driver-delay-jittering/PLAN.md +0 -0
  216. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-08-06-driver-delay-jittering/SCENARIO.md +0 -0
  217. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-08-06-overlay-changelog-watermark/PLAN.md +0 -0
  218. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-08-06-overlay-changelog-watermark/SCENARIO.md +0 -0
  219. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-08-06-ui-mode-policy/PLAN.md +0 -0
  220. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-08-06-ui-mode-policy/SCENARIO.md +0 -0
  221. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-08-14-video-ui-mode-policy/PLAN.md +0 -0
  222. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-08-14-video-ui-mode-policy/SCENARIO.md +0 -0
  223. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-08-21-selector-registry.md +0 -0
  224. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-08-25-workflow-hardening-gaps.md +0 -0
  225. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/plans/2026-09-01-video-extend/PLAN.md +0 -0
  226. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/research/2026-06-27-tool-abstraction-evaluation.md +0 -0
  227. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/specs/2026-06-29-issue-assessment-workflow-design.md +0 -0
  228. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/specs/2026-07-04-pr-triage-autopilot-design.md +0 -0
  229. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/specs/2026-07-18-asset-tagging-design.md +0 -0
  230. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/specs/2026-07-19-live-verify-design.md +0 -0
  231. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/specs/2026-07-19-production-readiness-hardening-design.md +0 -0
  232. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/specs/2026-08-21-selector-registry-design.md +0 -0
  233. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/specs/2026-08-26-model-attribution-provenance.md +0 -0
  234. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/specs/2026-08-26-model-cost-quota-catalog.md +0 -0
  235. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/specs/2026-08-27-changelog-modal-precondition-design.md +0 -0
  236. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/spikes/2026-07-09-camoufox-waf-403.md +0 -0
  237. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/spikes/2026-07-12-ui-cohort-backend-config.md +0 -0
  238. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/spikes/2026-07-17-production-readiness-assessment.md +0 -0
  239. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/spikes/2026-08-01-mcp-2026-07-28-spec-impact.md +0 -0
  240. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/spikes/2026-08-14-video-model-capability-matrix.md +0 -0
  241. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/spikes/2026-08-15-picker-tile-alt-text.md +0 -0
  242. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/docs/superpowers/spikes/2026-08-31-veo-extend-route-recon.md +0 -0
  243. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/eval/pr_triage_eval.py +0 -0
  244. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/eval/pr_triage_fixtures.json +0 -0
  245. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/examples/README.md +0 -0
  246. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/examples/batch_from_config.py +0 -0
  247. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/examples/multi_prompt_t2i.py +0 -0
  248. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/examples/sample_config.json +0 -0
  249. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/examples/sample_prompts.txt +0 -0
  250. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/examples/single_image_t2i.py +0 -0
  251. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/examples/workflow_chain.py +0 -0
  252. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/index.html +0 -0
  253. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/llms.txt +0 -0
  254. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/samples/README.md +0 -0
  255. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/samples/captured/01_upload_image.json +0 -0
  256. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
  257. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
  258. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/samples/captured/04_archive_workflow.json +0 -0
  259. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/samples/captured/05_createProject.json +0 -0
  260. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/samples/captured/06_batchGenerateImages.json +0 -0
  261. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
  262. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
  263. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
  264. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
  265. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
  266. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/samples/captured/12_create_scene.json +0 -0
  267. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/samples/captured/13_sceneWorkflows_update.json +0 -0
  268. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/samples/captured/14_get_scene_workflows.json +0 -0
  269. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/samples/captured/15_commit_flowWorkflow.json +0 -0
  270. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/autopilot/Dockerfile.triage +0 -0
  271. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/autopilot/entrypoint.sh +0 -0
  272. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/autopilot/package-lock.json +0 -0
  273. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/autopilot/package.json +0 -0
  274. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/autopilot/pr_triage_autopilot.py +0 -0
  275. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/autopilot/pr_triage_gate.py +0 -0
  276. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/autopilot/run_sandboxed_review.sh +0 -0
  277. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/canary/register_task.ps1 +0 -0
  278. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/canary/run_canary.py +0 -0
  279. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/ci/check_doc_links.py +0 -0
  280. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/ci/check_materiality.py +0 -0
  281. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/ci/check_release_artifacts.py +0 -0
  282. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/ci/check_repo_hygiene.py +0 -0
  283. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/ci/check_test_count.py +0 -0
  284. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/ci/check_website_docs_pii.py +0 -0
  285. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/ci/generate_website_docs.py +0 -0
  286. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/debug_editor.py +0 -0
  287. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/debug_gen_settings.py +0 -0
  288. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/debug_settings.py +0 -0
  289. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/_recording_client.py +0 -0
  290. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/_spike_common.py +0 -0
  291. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/active_plan.py +0 -0
  292. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/analyze_agent_ui_capture.py +0 -0
  293. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/capture_frames_mode_trigger_ligature.py +0 -0
  294. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
  295. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
  296. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
  297. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
  298. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/capture_image_add_media_dom.py +0 -0
  299. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/capture_locale_invariants.py +0 -0
  300. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/capture_lower_priority_model_cost.py +0 -0
  301. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/capture_project_listing.py +0 -0
  302. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/capture_r2v_ingredient_lifecycle.py +0 -0
  303. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/capture_sidebar_state_dom.py +0 -0
  304. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/capture_video_model_capability_matrix.py +0 -0
  305. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/cdp_drive_and_probe.py +0 -0
  306. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/character_create_spike.py +0 -0
  307. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/character_create_spike_v2.py +0 -0
  308. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/dump_character_selectors.js +0 -0
  309. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/incident_bundle_quality.py +0 -0
  310. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/live_verify_mcp_tasks.py +0 -0
  311. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/live_verify_policy_400_v060.py +0 -0
  312. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/live_verify_video_model_select.py +0 -0
  313. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/make_project.py +0 -0
  314. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/materiality_backtest.py +0 -0
  315. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/measure_locale_probe.py +0 -0
  316. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/patch_character.py +0 -0
  317. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/skillopt/README.md +0 -0
  318. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/skillopt/harness.py +0 -0
  319. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/skillopt/tasks.json +0 -0
  320. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/sonar-local-scan.sh +0 -0
  321. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/sonar-pre-push-gate.sh +0 -0
  322. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/spike_changelog_capture.py +0 -0
  323. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/spike_char_editor_dom.py +0 -0
  324. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/spike_char_gen_capture.py +0 -0
  325. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/spike_character_prompt_format.py +0 -0
  326. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/spike_extend_model_recon.py +0 -0
  327. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/spike_extend_ourstack_verify.py +0 -0
  328. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/spike_extend_route_capture.py +0 -0
  329. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/spike_extend_submit_capture.py +0 -0
  330. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/spike_extend_ui_recon.py +0 -0
  331. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/spike_image_upscale_capture.py +0 -0
  332. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/spike_image_upscale_drive.py +0 -0
  333. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
  334. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
  335. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/spike_incident_live.py +0 -0
  336. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
  337. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
  338. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/spike_issue313_agent_mode_controls.py +0 -0
  339. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/spike_issue314_picker_filename_search.py +0 -0
  340. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/spike_issue404_count_tabs_recon.py +0 -0
  341. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/spike_locale_poison.py +0 -0
  342. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/spike_mode_roundtrip.py +0 -0
  343. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/spike_mode_switch_agentic_to_classic.py +0 -0
  344. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/spike_model_inventory.py +0 -0
  345. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/spike_movie_attach_payload.py +0 -0
  346. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/spike_movie_entity_recon.py +0 -0
  347. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/spike_movie_gen_capture.py +0 -0
  348. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/spike_movie_picker_select.py +0 -0
  349. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/spike_movie_voice_list.py +0 -0
  350. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/spike_omni_flash_i2v_ui_recon.py +0 -0
  351. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/spike_patch_entity.py +0 -0
  352. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/spike_patchright.py +0 -0
  353. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/spike_trpc_origin_referer_401.py +0 -0
  354. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/spike_video_tab_dom.py +0 -0
  355. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/verify_language_agnostic.py +0 -0
  356. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/verify_locale_navigation_race.py +0 -0
  357. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/dev/verify_model_attribution.py +0 -0
  358. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/diag/README.md +0 -0
  359. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/diag/capture_flow_traffic.py +0 -0
  360. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/diag/diag_aisandbox_bearer.py +0 -0
  361. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/diag/memory_profile.py +0 -0
  362. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/diag/recaptcha_mint.py +0 -0
  363. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/diag/spike_387_openai_compat.py +0 -0
  364. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
  365. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/e2e/capture_agent_toggle.py +0 -0
  366. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/probe/run_probe.py +0 -0
  367. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/probe/spike_auth_matrix.py +0 -0
  368. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/record_demo.ps1 +0 -0
  369. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/smoke_image.py +0 -0
  370. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/smoke_video_editor.py +0 -0
  371. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/smoke_worker_style.py +0 -0
  372. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/spike_waf_camoufox.py +0 -0
  373. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/scripts/verify_chrome_auth_viability.py +0 -0
  374. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/skills/README.md +0 -0
  375. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/skills/changelog/SKILL.md +0 -0
  376. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/skills/check/SKILL.md +0 -0
  377. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/skills/doc-review/SKILL.md +0 -0
  378. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/skills/gflow-cli/SKILL.md +0 -0
  379. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/skills/issue-assessment/SKILL.md +0 -0
  380. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/skills/issue-resolve/SKILL.md +0 -0
  381. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/skills/known-issues/SKILL.md +0 -0
  382. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/skills/live-verify/SKILL.md +0 -0
  383. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/skills/llm-council/SKILL.md +0 -0
  384. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/skills/plan/SKILL.md +0 -0
  385. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/skills/pr-council-review/SKILL.md +0 -0
  386. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/skills/predict/SKILL.md +0 -0
  387. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/skills/release/SKILL.md +0 -0
  388. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/skills/scenario/SKILL.md +0 -0
  389. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/skills/sonar/SKILL.md +0 -0
  390. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/skills/status/SKILL.md +0 -0
  391. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/sonar-project.properties +0 -0
  392. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/__main__.py +0 -0
  393. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/_cli_helpers.py +0 -0
  394. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/api/__init__.py +0 -0
  395. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/api/_engine.py +0 -0
  396. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/api/_retry.py +0 -0
  397. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/api/_sapisidhash.py +0 -0
  398. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/api/character.py +0 -0
  399. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/api/dto.py +0 -0
  400. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/api/extend_chain.py +0 -0
  401. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/api/image.py +0 -0
  402. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/api/image_upscale.py +0 -0
  403. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/api/recaptcha.py +0 -0
  404. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/api/scene.py +0 -0
  405. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/api/transports/__init__.py +0 -0
  406. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
  407. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/api/transports/base.py +0 -0
  408. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
  409. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/api/transports/drivers/agentic.py +0 -0
  410. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/api/transports/drivers/base.py +0 -0
  411. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/api/transports/drivers/classic.py +0 -0
  412. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
  413. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
  414. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
  415. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
  416. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/api/transports/mode_control.py +0 -0
  417. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/api/transports/ui_automation.py +0 -0
  418. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/api/transports/ui_automation_video.py +0 -0
  419. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/api/video.py +0 -0
  420. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/api/video_extend.py +0 -0
  421. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/auth/__init__.py +0 -0
  422. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/auth/base.py +0 -0
  423. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/auth/cookies.py +0 -0
  424. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/auth/factory.py +0 -0
  425. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/auth/internal_chromium.py +0 -0
  426. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/auth/real_chrome.py +0 -0
  427. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/auth/strategies.py +0 -0
  428. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/auth/verification.py +0 -0
  429. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/browser_manager.py +0 -0
  430. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/chain.py +0 -0
  431. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/chain_manifest.py +0 -0
  432. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/cli.py +0 -0
  433. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/cli_character.py +0 -0
  434. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/cli_data.py +0 -0
  435. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/cli_doctor.py +0 -0
  436. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/cli_image.py +0 -0
  437. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/cli_instructions.py +0 -0
  438. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/cli_models.py +0 -0
  439. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/cli_movie.py +0 -0
  440. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/cli_project.py +0 -0
  441. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/cli_run.py +0 -0
  442. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/cli_scene.py +0 -0
  443. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/cli_tools.py +0 -0
  444. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/cli_video.py +0 -0
  445. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/composition.py +0 -0
  446. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/config.py +0 -0
  447. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/data/__init__.py +0 -0
  448. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/data/chain_repo.py +0 -0
  449. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
  450. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
  451. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
  452. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
  453. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
  454. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
  455. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/data/migrations/0007_queue.sql +0 -0
  456. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/data/migrations/0008_add_operation_expanded_prompt.sql +0 -0
  457. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/data/migrations/0009_queue_claims.sql +0 -0
  458. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/data/migrations/__init__.py +0 -0
  459. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/data/models.py +0 -0
  460. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/data/queries.py +0 -0
  461. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/data/recorder.py +0 -0
  462. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/data/redaction.py +0 -0
  463. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/data/repository.py +0 -0
  464. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/data/store.py +0 -0
  465. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/diagnostics.py +0 -0
  466. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/errors.py +0 -0
  467. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/exceptions.py +0 -0
  468. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/file_integrity.py +0 -0
  469. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/flow_selectors/__init__.py +0 -0
  470. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/flow_selectors/grading.py +0 -0
  471. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/flow_selectors/model.py +0 -0
  472. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/flow_selectors/registry.py +0 -0
  473. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/image_batch.py +0 -0
  474. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/json_output.py +0 -0
  475. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/mcp/__init__.py +0 -0
  476. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/mcp/prompts.py +0 -0
  477. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/mcp/resources.py +0 -0
  478. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/mcp/server.py +0 -0
  479. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/mcp/setup.py +0 -0
  480. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/mcp/tasks_extension.py +0 -0
  481. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/mcp/tools.py +0 -0
  482. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/media.py +0 -0
  483. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/movie_manifest.py +0 -0
  484. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/observability.py +0 -0
  485. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/paths.py +0 -0
  486. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/profile_lease.py +0 -0
  487. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/profile_store.py +0 -0
  488. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/redaction.py +0 -0
  489. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/services/__init__.py +0 -0
  490. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/services/catalog_sync.py +0 -0
  491. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/services/character_create.py +0 -0
  492. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/services/doctor.py +0 -0
  493. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/services/mentions.py +0 -0
  494. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/storage.py +0 -0
  495. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/tools/__init__.py +0 -0
  496. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/tools/banned.py +0 -0
  497. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/tools/builtin/__init__.py +0 -0
  498. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/tools/builtin/creative-director.toml +0 -0
  499. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/tools/builtin/reverse-engineer.toml +0 -0
  500. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/tools/builtin/storyboard.toml +0 -0
  501. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/tools/expander.py +0 -0
  502. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/tools/invocation.py +0 -0
  503. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/tools/loader.py +0 -0
  504. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/tools/registry.py +0 -0
  505. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/tools/runtime.py +0 -0
  506. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/tools/spec.py +0 -0
  507. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/ui/app.py +0 -0
  508. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/ui/server.py +0 -0
  509. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/update_check.py +0 -0
  510. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/winsec.py +0 -0
  511. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/worker/codec.py +0 -0
  512. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/worker/daemon.py +0 -0
  513. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/src/gflow_cli/worker/queue.py +0 -0
  514. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tasks/lessons.md +0 -0
  515. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/test_assets/sample_batch.json +0 -0
  516. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/test_assets/sample_batch.tsv +0 -0
  517. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/test_assets/sample_batch_invalid.tsv +0 -0
  518. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/__init__.py +0 -0
  519. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/__init__.py +0 -0
  520. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/fixtures/character_gen_response.json +0 -0
  521. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/fixtures/patch_entity_response.json +0 -0
  522. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/fixtures/project_initial_data_extend_models.json +0 -0
  523. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_aisandbox_auth_error.py +0 -0
  524. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_aisandbox_auth_headers.py +0 -0
  525. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_bearer_redaction.py +0 -0
  526. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_character.py +0 -0
  527. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_client.py +0 -0
  528. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_client_character.py +0 -0
  529. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_client_delete_characters.py +0 -0
  530. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_client_errors.py +0 -0
  531. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_client_extend.py +0 -0
  532. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_client_generate_character.py +0 -0
  533. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_client_image.py +0 -0
  534. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_client_incidents.py +0 -0
  535. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_client_launch_kwargs.py +0 -0
  536. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_client_locale_cache.py +0 -0
  537. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_client_patch_entity.py +0 -0
  538. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_client_scene.py +0 -0
  539. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_client_upscale.py +0 -0
  540. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_concurrency.py +0 -0
  541. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_dto.py +0 -0
  542. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_engine.py +0 -0
  543. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_extend_chain.py +0 -0
  544. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_image.py +0 -0
  545. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_image_dto.py +0 -0
  546. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_image_upscale.py +0 -0
  547. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_post_json_aisandbox_auth.py +0 -0
  548. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_recaptcha.py +0 -0
  549. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_retry.py +0 -0
  550. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_routes.py +0 -0
  551. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_routes_character.py +0 -0
  552. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_routes_scene.py +0 -0
  553. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_sapisidhash_helper.py +0 -0
  554. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_scene_models.py +0 -0
  555. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_video.py +0 -0
  556. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_video_extend.py +0 -0
  557. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_video_request.py +0 -0
  558. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/test_video_status_poll.py +0 -0
  559. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/transports/__init__.py +0 -0
  560. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/transports/conftest.py +0 -0
  561. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/transports/drivers/__init__.py +0 -0
  562. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/transports/drivers/test_agentic.py +0 -0
  563. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/transports/drivers/test_classic.py +0 -0
  564. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/transports/drivers/test_factory.py +0 -0
  565. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/transports/test_agentic_cohort_detection.py +0 -0
  566. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/transports/test_base.py +0 -0
  567. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/transports/test_bearer.py +0 -0
  568. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/transports/test_evaluate_fetch.py +0 -0
  569. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/transports/test_factory.py +0 -0
  570. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/transports/test_fingerprint.py +0 -0
  571. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/transports/test_locale_navigation.py +0 -0
  572. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/transports/test_mode_control.py +0 -0
  573. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/transports/test_model_selection_loud.py +0 -0
  574. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/transports/test_navigation_settled.py +0 -0
  575. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/transports/test_overlay_precondition.py +0 -0
  576. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/transports/test_policy_400.py +0 -0
  577. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/transports/test_sapisidhash.py +0 -0
  578. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/transports/test_selector_symmetry.py +0 -0
  579. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/transports/test_transport_timeout.py +0 -0
  580. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/transports/test_ui_automation.py +0 -0
  581. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/transports/test_ui_automation_batch.py +0 -0
  582. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
  583. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/transports/test_ui_automation_video.py +0 -0
  584. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/transports/test_ui_character_editor.py +0 -0
  585. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/api/transports/test_video_model_selection_loud.py +0 -0
  586. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/auth/strategies/test_factory.py +0 -0
  587. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/auth/strategies/test_strategies.py +0 -0
  588. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/auth/test_cookies.py +0 -0
  589. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/auth/test_real_chrome.py +0 -0
  590. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/auth/test_verification.py +0 -0
  591. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/auth/test_windows_acl.py +0 -0
  592. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/autopilot/test_pr_triage_autopilot.py +0 -0
  593. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/cli/__init__.py +0 -0
  594. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/cli/test_auth_status.py +0 -0
  595. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/cli/test_cli_auth_list.py +0 -0
  596. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/cli/test_cli_character.py +0 -0
  597. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/cli/test_cli_character_create.py +0 -0
  598. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/cli/test_cli_data.py +0 -0
  599. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/cli/test_cli_data_errors.py +0 -0
  600. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/cli/test_cli_data_errors_retention.py +0 -0
  601. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/cli/test_cli_data_sync.py +0 -0
  602. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/cli/test_cli_doctor.py +0 -0
  603. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/cli/test_cli_image.py +0 -0
  604. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/cli/test_cli_image_seed_removed.py +0 -0
  605. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/cli/test_cli_image_selector_drift.py +0 -0
  606. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/cli/test_cli_image_upscale.py +0 -0
  607. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/cli/test_cli_image_uuid_ref_enrichment.py +0 -0
  608. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/cli/test_cli_instructions.py +0 -0
  609. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/cli/test_cli_models.py +0 -0
  610. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/cli/test_cli_movie.py +0 -0
  611. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/cli/test_cli_run.py +0 -0
  612. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/cli/test_cli_scene.py +0 -0
  613. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/cli/test_cli_tools.py +0 -0
  614. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/cli/test_cli_video.py +0 -0
  615. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/cli/test_cli_video_chain.py +0 -0
  616. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/cli/test_cli_video_extend.py +0 -0
  617. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/cli/test_error_handling.py +0 -0
  618. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/cli/test_failure_funnel.py +0 -0
  619. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/cli/test_helpers.py +0 -0
  620. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/cli/test_incident_output.py +0 -0
  621. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/cli/test_movie_manifest.py +0 -0
  622. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/cli/test_movie_manifest_style_variants.py +0 -0
  623. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/cli/test_predictable_output.py +0 -0
  624. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/cli/test_run_with_handlers_interrupt.py +0 -0
  625. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/cli/test_settings_validation.py +0 -0
  626. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/cli/test_t2i_multi_prompt.py +0 -0
  627. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/composition/test_character.py +0 -0
  628. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/composition/test_compose_prompt.py +0 -0
  629. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/composition/test_handoff.py +0 -0
  630. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/composition/test_style_variants.py +0 -0
  631. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/composition/test_style_variants_e2e.py +0 -0
  632. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/conftest.py +0 -0
  633. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/data/__init__.py +0 -0
  634. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/data/test_chain_repo.py +0 -0
  635. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/data/test_failure_recording.py +0 -0
  636. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/data/test_find_incomplete_character.py +0 -0
  637. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/data/test_models.py +0 -0
  638. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/data/test_null_columns_stay_null.py +0 -0
  639. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/data/test_packaging.py +0 -0
  640. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/data/test_recorder.py +0 -0
  641. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/data/test_recorder_character.py +0 -0
  642. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/data/test_redaction.py +0 -0
  643. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/data/test_repository.py +0 -0
  644. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/data/test_scene_persistence.py +0 -0
  645. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/data/test_settings_and_errors.py +0 -0
  646. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/data/test_store.py +0 -0
  647. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/data/test_store_migrations.py +0 -0
  648. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/dev/test_recording_client.py +0 -0
  649. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/e2e/__init__.py +0 -0
  650. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/e2e/conftest.py +0 -0
  651. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/e2e/test_agentic_count_enforcement_e2e.py +0 -0
  652. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/e2e/test_aisandbox_auth_live.py +0 -0
  653. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/e2e/test_asset_tagging_e2e.py +0 -0
  654. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/e2e/test_auth_verification_e2e.py +0 -0
  655. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/e2e/test_cancellation_e2e.py +0 -0
  656. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/e2e/test_chain_e2e.py +0 -0
  657. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/e2e/test_character_create_e2e.py +0 -0
  658. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/e2e/test_classic_count_setter_e2e.py +0 -0
  659. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/e2e/test_crash_recovery_e2e.py +0 -0
  660. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/e2e/test_daemon_e2e.py +0 -0
  661. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/e2e/test_data_layer_e2e.py +0 -0
  662. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/e2e/test_data_sync_names_e2e.py +0 -0
  663. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/e2e/test_entity_provenance_e2e.py +0 -0
  664. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/e2e/test_entity_smuggling_e2e.py +0 -0
  665. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/e2e/test_i2v_flags_e2e.py +0 -0
  666. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/e2e/test_image_batch_e2e.py +0 -0
  667. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
  668. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/e2e/test_image_uuid_ref_e2e.py +0 -0
  669. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/e2e/test_incident_quality_e2e.py +0 -0
  670. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/e2e/test_json_output_e2e.py +0 -0
  671. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/e2e/test_live_agentic_instructions.py +0 -0
  672. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/e2e/test_locale_selectors_e2e.py +0 -0
  673. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/e2e/test_project_naming_e2e.py +0 -0
  674. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/e2e/test_refresh_on_miss_e2e.py +0 -0
  675. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/e2e/test_scene_compose_live.py +0 -0
  676. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/e2e/test_sidebar_recovery_e2e.py +0 -0
  677. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/e2e/test_tools_e2e.py +0 -0
  678. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/e2e/test_transports_e2e.py +0 -0
  679. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
  680. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/e2e/test_video_r2v_uuid_name_e2e.py +0 -0
  681. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/e2e/test_video_t2v_e2e.py +0 -0
  682. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/__init__.py +0 -0
  683. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/asset_tagging.feature +0 -0
  684. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/auth.feature +0 -0
  685. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/auth_login.feature +0 -0
  686. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/character_create.feature +0 -0
  687. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/character_read.feature +0 -0
  688. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/conftest.py +0 -0
  689. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/duration_tab_drift.feature +0 -0
  690. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/entity_provenance.feature +0 -0
  691. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/image.feature +0 -0
  692. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/image_batch_references.feature +0 -0
  693. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/image_upscale.feature +0 -0
  694. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/incident_diagnostics.feature +0 -0
  695. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/instructions.feature +0 -0
  696. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/locale_picker_include.feature +0 -0
  697. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/mcp_tasks.feature +0 -0
  698. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/media_picker_tiers.feature +0 -0
  699. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/output_hardening.feature +0 -0
  700. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/test_asset_tagging_steps.py +0 -0
  701. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/test_auth_login_steps.py +0 -0
  702. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/test_auth_steps.py +0 -0
  703. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/test_character_create_steps.py +0 -0
  704. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/test_character_read_steps.py +0 -0
  705. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/test_image_steps.py +0 -0
  706. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/test_image_upscale_steps.py +0 -0
  707. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/test_incident_diagnostics_steps.py +0 -0
  708. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/test_instructions_steps.py +0 -0
  709. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/test_locale_picker_include_steps.py +0 -0
  710. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/test_mcp_tasks_steps.py +0 -0
  711. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/test_media_picker_tiers_steps.py +0 -0
  712. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/test_output_hardening_steps.py +0 -0
  713. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/test_step_collision_guard.py +0 -0
  714. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/test_video_agent_ui_steps.py +0 -0
  715. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/test_video_chain_steps.py +0 -0
  716. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/video_agent_ui.feature +0 -0
  717. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/features/video_chain.feature +0 -0
  718. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/fixtures/__init__.py +0 -0
  719. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/fixtures/changelog_modal_page.html +0 -0
  720. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/fixtures/doctor_env.py +0 -0
  721. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/fixtures/flow_model_inventory.json +0 -0
  722. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/fixtures/flow_project_listing_media.json +0 -0
  723. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/fixtures/listing_payload.py +0 -0
  724. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/fixtures/seeded_catalog.py +0 -0
  725. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/flow_selectors/__init__.py +0 -0
  726. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/flow_selectors/test_grading.py +0 -0
  727. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/flow_selectors/test_model.py +0 -0
  728. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/flow_selectors/test_model_governance.py +0 -0
  729. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/flow_selectors/test_registry.py +0 -0
  730. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/flow_selectors/test_report.py +0 -0
  731. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/image_batch/__init__.py +0 -0
  732. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/image_batch/test_image_manifest.py +0 -0
  733. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/image_batch/test_jitter_config.py +0 -0
  734. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/image_batch/test_observability_events.py +0 -0
  735. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/integration/__init__.py +0 -0
  736. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/integration/conftest.py +0 -0
  737. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/integration/constants.py +0 -0
  738. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/integration/test_expander_gateway.py +0 -0
  739. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/integration/test_storage_gcs.py +0 -0
  740. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/integration/test_storage_s3.py +0 -0
  741. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/mcp/__init__.py +0 -0
  742. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/mcp/conftest.py +0 -0
  743. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/mcp/test_auth_status_tool.py +0 -0
  744. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/mcp/test_cli_parity.py +0 -0
  745. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/mcp/test_error_funnel.py +0 -0
  746. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/mcp/test_http_transport.py +0 -0
  747. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/mcp/test_known_issues_resource.py +0 -0
  748. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/mcp/test_no_spend.py +0 -0
  749. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/mcp/test_rate_limit_envelope.py +0 -0
  750. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/mcp/test_resources.py +0 -0
  751. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/mcp/test_server.py +0 -0
  752. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/mcp/test_setup.py +0 -0
  753. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/mcp/test_stdio_transport.py +0 -0
  754. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/mcp/test_tasks_extension.py +0 -0
  755. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/mcp/test_tools_helpers.py +0 -0
  756. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/mcp/test_tools_instructions.py +0 -0
  757. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/mcp/test_tools_wired.py +0 -0
  758. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
  759. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/scripts/test_canary_classify.py +0 -0
  760. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/scripts/test_canary_reexec.py +0 -0
  761. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/scripts/test_capture_locale_invariants.py +0 -0
  762. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/scripts/test_check_materiality.py +0 -0
  763. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/scripts/test_check_release_artifacts.py +0 -0
  764. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/scripts/test_check_repo_hygiene.py +0 -0
  765. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/scripts/test_check_test_count.py +0 -0
  766. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/scripts/test_check_website_docs_pii.py +0 -0
  767. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/scripts/test_codex_plugin.py +0 -0
  768. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/scripts/test_generate_website_docs.py +0 -0
  769. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/scripts/test_incident_bundle_quality.py +0 -0
  770. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/scripts/test_materiality_backtest.py +0 -0
  771. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/scripts/test_workflow_hardening.py +0 -0
  772. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/services/__init__.py +0 -0
  773. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/services/test_catalog_sync.py +0 -0
  774. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/services/test_character_create_redaction.py +0 -0
  775. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/services/test_character_create_saga.py +0 -0
  776. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/services/test_character_gen_no_direct_post.py +0 -0
  777. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/services/test_doctor.py +0 -0
  778. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/services/test_media_attribution.py +0 -0
  779. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/services/test_mentions_observability.py +0 -0
  780. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/services/test_mentions_parse.py +0 -0
  781. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/services/test_mentions_resolve.py +0 -0
  782. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/services/test_resolve_and_apply.py +0 -0
  783. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/smoke/__init__.py +0 -0
  784. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/smoke/test_profile_account_smoke.py +0 -0
  785. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/smoke/test_real_flow.py +0 -0
  786. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_auth.py +0 -0
  787. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_browser_manager.py +0 -0
  788. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_chain.py +0 -0
  789. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_chain_manifest.py +0 -0
  790. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_cli_data.py +0 -0
  791. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_cli_project.py +0 -0
  792. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_config.py +0 -0
  793. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_conftest_isolation.py +0 -0
  794. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_data_queries.py +0 -0
  795. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_diagnostics_bundle.py +0 -0
  796. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_diagnostics_events.py +0 -0
  797. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_diagnostics_journal.py +0 -0
  798. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_diagnostics_recorder.py +0 -0
  799. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_diagnostics_retention.py +0 -0
  800. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_diagnostics_sanitize.py +0 -0
  801. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_documentation_gate.py +0 -0
  802. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_duration_tab_drift.py +0 -0
  803. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_entity_provenance.py +0 -0
  804. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_errors.py +0 -0
  805. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_errors_classification.py +0 -0
  806. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_image_batch_references.py +0 -0
  807. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_incident_generation_requests.py +0 -0
  808. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_json_output.py +0 -0
  809. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_marker_registry.py +0 -0
  810. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_media.py +0 -0
  811. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_observability.py +0 -0
  812. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_overlay_banner_dismissal.py +0 -0
  813. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_paths.py +0 -0
  814. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_playwright_pin.py +0 -0
  815. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_profile_lease.py +0 -0
  816. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_profile_lease_subprocess.py +0 -0
  817. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_profile_store.py +0 -0
  818. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_profile_store_locale.py +0 -0
  819. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_project_list_urls.py +0 -0
  820. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_self_documenting_errors.py +0 -0
  821. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_smoke.py +0 -0
  822. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/test_update_check.py +0 -0
  823. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/tools/__init__.py +0 -0
  824. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/tools/test_banned.py +0 -0
  825. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/tools/test_expander.py +0 -0
  826. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/tools/test_invocation.py +0 -0
  827. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/tools/test_loader.py +0 -0
  828. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/tools/test_registry.py +0 -0
  829. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/tools/test_runtime.py +0 -0
  830. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/tools/test_spec.py +0 -0
  831. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/ui/test_app.py +0 -0
  832. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/worker/test_codec.py +0 -0
  833. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/worker/test_daemon.py +0 -0
  834. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/worker/test_mcp_daemon_race.py +0 -0
  835. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/worker/test_queue.py +0 -0
  836. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/worker/test_queue_multiprocess.py +0 -0
  837. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/tests/worker/test_queue_reconciliation.py +0 -0
  838. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/website/docs/ACCOUNT_SAFETY.md +0 -0
  839. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/website/docs/ARCHITECTURE.md +0 -0
  840. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/website/docs/AUTHENTICATION.md +0 -0
  841. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/website/docs/CHARACTER.md +0 -0
  842. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/website/docs/CONFIGURATION.md +0 -0
  843. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/website/docs/DATA_LAYER.md +0 -0
  844. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/website/docs/DEBUGGING.md +0 -0
  845. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/website/docs/DEVELOPMENT.md +0 -0
  846. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/website/docs/E2E_TESTING.md +0 -0
  847. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/website/docs/EXTERNAL_STORAGE.md +0 -0
  848. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/website/docs/INSTRUCTIONS.md +0 -0
  849. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/website/docs/KNOWN_ISSUES.md +0 -0
  850. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/website/docs/MCP.md +0 -0
  851. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/website/docs/MEDIA_LIBRARY.md +0 -0
  852. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/website/docs/MOVIE.md +0 -0
  853. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/website/docs/PROMPT_EXPANSION.md +0 -0
  854. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/website/docs/SECURITY.md +0 -0
  855. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/website/docs/TOOLS.md +0 -0
  856. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/website/docs/USAGE.md +0 -0
  857. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/website/docs/USER_GUIDE.md +0 -0
  858. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/website/docs/agents.md +0 -0
  859. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/website/docs/index.md +0 -0
  860. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/website/docs/installation.md +0 -0
  861. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/website/docs/onboarding-mockup.html +0 -0
  862. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/website/docs/onboarding.md +0 -0
  863. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/website/docs/stylesheets/extra.css +0 -0
  864. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/website/mkdocs.yml +0 -0
  865. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/website/requirements.in +0 -0
  866. {gflow_cli-0.66.0 → gflow_cli-0.66.1}/website/requirements.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gflow",
3
- "version": "0.66.0",
3
+ "version": "0.66.1",
4
4
  "description": "Reusable development and operations workflows for gflow-cli",
5
5
  "author": {
6
6
  "name": "Flavio Oliva",
@@ -7,6 +7,38 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.66.1] — 2026-09-03
11
+
12
+ ### Fixed
13
+
14
+ - **A migrated-origin run spent ~36 s discovering a failure knowable in microseconds
15
+ ([#639](https://github.com/ffroliva/gflow-cli/issues/639)).** `flow.google.com` renders none
16
+ of the controls gflow drives, so every DOM probe is doomed before it starts — yet the run
17
+ still burned the full `detect_ui_mode` poll window (~8 s, both arms missing), the crop
18
+ selector cascade (~24 s) and the URL settle (4 s) before raising `FlowHostMigratedError`.
19
+ Because the rollout flaps per page load and callers retry on exit 36, that cost was paid on
20
+ **every attempt** of a retry loop. `get_ui_driver` now checks the host first and fails fast
21
+ with the same retryable exit 36. The old host is untouched and still gets full DOM detection;
22
+ a page whose URL cannot be read still probes rather than bailing, so a transient is never
23
+ mistaken for a migrated origin.
24
+
25
+ - **Locale resolution was blind on `flow.google.com`, and silently discarded a locale it had
26
+ already learned ([#643](https://github.com/ffroliva/gflow-cli/issues/643)).** The migrated
27
+ origin serves `/project/<id>` with no `/fx/<locale>/tools/flow` segment, so
28
+ `locale_segment_from_url` could never match there. The locale had not disappeared — it moved
29
+ into `<html lang>`, which stays correct on the migrated host. Two measured consequences:
30
+ `next_locale_state("pt", None)` returned PROVISIONAL, **demoting** an already-learned locale
31
+ on every migrated load (so a fully-migrated account could never learn it again, undoing
32
+ [#587](https://github.com/ffroliva/gflow-cli/issues/587)); and `await_url_settled` burned the
33
+ full 4 s timeout per navigation waiting for a shape that can no longer exist. gflow now falls
34
+ back to `<html lang>` when the URL carries no segment, and skips the settle wait entirely on
35
+ the migrated origin.
36
+
37
+ The fallback is evidence-backed, not assumed: measured on two accounts (`en` and `pt-BR`),
38
+ `<html lang>` **agreed with the URL segment wherever both existed**. Unlike
39
+ `navigator.language` — which reports the value gflow itself sets — it is server-rendered by
40
+ Flow. Where Flow does state the locale in the URL, that stays authoritative.
41
+
10
42
  ## [0.66.0] — 2026-09-03
11
43
 
12
44
  ### Fixed
@@ -3705,7 +3737,8 @@ shell-script template that branches on these codes.
3705
3737
 
3706
3738
  First skeleton. Not functional end-to-end yet.
3707
3739
 
3708
- [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.66.0...HEAD
3740
+ [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.66.1...HEAD
3741
+ [0.66.1]: https://github.com/ffroliva/gflow-cli/compare/v0.66.0...v0.66.1
3709
3742
  [0.66.0]: https://github.com/ffroliva/gflow-cli/compare/v0.65.0...v0.66.0
3710
3743
  [0.65.0]: https://github.com/ffroliva/gflow-cli/compare/v0.64.0...v0.65.0
3711
3744
  [0.64.0]: https://github.com/ffroliva/gflow-cli/compare/v0.63.0...v0.64.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: gflow-cli
3
- Version: 0.66.0
3
+ Version: 0.66.1
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
@@ -158,6 +158,8 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
158
158
  **What was actually live-verified for the latest release?** → latest: [LIVE_VERIFICATION_v0.64.0](LIVE_VERIFICATION_v0.64.0.md) (**#626 `--model omni-flash --end-frame` — first+last interpolation on Omni 1.1 Flash, verified 2026-09-02.** The guard this release removes was evidence-gated, so it was retired on evidence: a route-aborted submit capture on **two distinct Google accounts** (`ffroliva`, `denon82`) fired `video:batchAsyncGenerateVideoStartAndEndImage` with `startImage` AND `endImage` non-null at **zero credits**, ruling out a single-account artifact. The decisive layer is semantic, not structural: the paid 4s generation's **last frame IS the supplied end image** and its first frame is the start image — two visibly different subjects — which is the only check that distinguishes "Flow bound the end frame" from "Flow accepted and ignored it", and which layers 1–4 would pass either way. Render: 4.01s / 720×1280 / h264+aac / 2.4 MB, `MEDIA_GENERATION_STATUS_SUCCESSFUL`. The static capability table is **deleted**, not corrected — it went stale silently once and would again; a post-submit route check (`_assert_i2v_route`) now fails a run whose end frame Flow dropped back to the `StartImage` route, catching a rollback on any account without anyone re-reading a support page. One item is recorded as NOT verified rather than omitted: `--duration 10` + end frame is **submit-verified only** (`duration_set seconds=10` on the correct route with both images bound), because the status poll returned HTTP 401 mid-run and a retry 401'd at `project.create` before submitting — [#561](https://github.com/ffroliva/gflow-cli/issues/561), pre-existing, so verification was stopped rather than spending further credits on an environmental fault.) · previous: [LIVE_VERIFICATION_v0.63.0](LIVE_VERIFICATION_v0.63.0.md) (**`gflow video extend` — continuing a clip past Flow's 8s ceiling, verified 2026-09-01 on profile `ffroliva`, 20 Veo credits.** The decisive observation is that segment 2's `source_media_id` **is** segment 1's `media_id` (`0c9364f3…` seeded from `b9458021…`, then `648f9291…` seeded from `0c9364f3…`) — tail-only chaining, which no mock can establish; had it re-seeded from the source, the output would have been two divergent continuations of the same moment instead of one continuous shot. `extend_model_resolved` logged `candidate_count=99` against `SERVICE_TIER_INTERMEDIATE`, proving the key came from the live capability listing rather than a constant, and plan cost matched actual spend (`20 credits total, balance 875` → `Extended — 2/2 segment(s), 20 credits`). Render: 23.02s / 1280×720 / 24fps / h264+aac. **The run found a defect the offline suite is structurally incapable of seeing:** an extend segment carries **7.000000s** of content, not the 8 Flow advertises and bills, so server-side concat pads every internal seam with a frozen frame and digital silence (15s at −75.1 dB against −29 neighbours, reproduced on a second independent render) — filed in KNOWN_ISSUES with the three questions that must be answered before any clamp, and the reason `--extend N` on t2v/i2v was deliberately NOT shipped. Seven items are recorded as NOT verified rather than omitted: portrait `9:16`, `--aspect` against a mismatched source, chains longer than 2 segments, `--resume-from` against a live partial scene, the insufficient-credits refusal, a live Ctrl+C, and `OperationKind.EXTEND` rows.) · previous: [LIVE_VERIFICATION_v0.62.1](LIVE_VERIFICATION_v0.62.1.md) (**#604 `--model omni-flash` selects again after Flow's `Omni Flash` → `Omni 1.1 Flash` rename, verified 2026-08-30 on profile `ffroliva` at ZERO Veo credits.** The production `_select_video_model` was driven against the real picker: the shipped selector resolves verbatim — `model_selected model=omni_flash via="[role='menuitem']:has-text('Omni'):has-text('Flash'):not(:has-text('[Lower Priority]'))"` — and all six cases came back as expected: the four offered tiers SELECT, a tier Flow does not offer REFUSES, and a deliberately ambiguous selector REFUSES rather than resolving `.first`. Selection happens before submit, so the whole matrix is free. The transport's own refusal diagnostic read the live menu back as `Omni 1.1 Flash / Veo 3.1 - Lite / Fast / Quality`, independently corroborating the fixture. Four items are recorded as NOT verified rather than omitted: the rename *direction* [the `Omni Flash` baseline is a different account, locale and date], an actual `Omni ... [Lower Priority]` entry [Flow has never offered one], a full credit-spending generation on omni-flash, and #539's absence question, which stays open.) · previous: [LIVE_VERIFICATION_v0.62.0](LIVE_VERIFICATION_v0.62.0.md) (**#595 `auto` ≡ `classic` for images, verified 2026-08-28 on profile `ci-probe` — an account Flow had moved to the agentic cohort the day before — at ZERO Veo credits.** With no flags and no env vars the run logged `ui_driver.ui_mode.attempt_exit_agent` → `ui_driver.bound mode=classic ui_mode=classic` and generated a real 768x1376 JPEG (exit 0); the day before, the identical command on the same account bound `auto`→`agentic` and failed. The same log independently closed **#183**: `mode_switch_trigger` and `image_mode_tab`, the selectors it reported as unfindable, both matched. #591 was proven against the real 500-row catalog — **0** occurrences of the string `"None"`, 31 proper JSON `null`s, over a catalog holding 119 NULL-bearing rows. #592 shows exactly one `client.account_locale_cached` per command. Three items are recorded as NOT verified rather than omitted: the exit-28 abort on a *pinned* agentic account, the #597 batch inter-prompt guard, and any fresh announcement modal — the last two because all three accounts have already acked the current changelog, so no modal can be raised until Google ships the next one.) · previous: [LIVE_VERIFICATION_v0.61.0](LIVE_VERIFICATION_v0.61.0.md) (**#539 video-model refusal + #586 image-model refusal and server-side attribution, verified 2026-08-26/27 on profile `denon82`, ONE Veo generation total** — the video fix was proven by a **zero-credit A/B against the stashed pre-fix source running on live Flow**: the old code returned SELECTED for `veo-lite-lp`, a model Flow does not offer to this account, and for a deliberately ambiguous selector matching 3 entries; the new code refuses both with exit 18 naming what Flow offered. Model selection happens before submit, so refusals cost nothing and the A/B was free. The happy path still generates: `--model omni-flash` → exit 0, a real 2.2 MB `ftypisom` mp4, catalog recording `omni_flash`. Two items are recorded as NOT verified rather than omitted: three of #584's four navigation-settle sites were never exercised [no bearer refresh occurred in these runs], and #582's canary self-re-exec has its first real exercise tonight. Also falsified: #539's recorded note that the video picker uses a different trigger — the two constants are byte-identical strings, and the repeated empty menu captures were the capture's own fault.) · previous: [LIVE_VERIFICATION_v0.60.0](LIVE_VERIFICATION_v0.60.0.md)
159
159
  **"Was the playwright upper bound raised, and on what evidence?"** → [LIVE_VERIFICATION_playwright_1.61](LIVE_VERIFICATION_playwright_1.61.md) (**`>=1.59.0,<1.60.0` → `>=1.61.0,<1.62.0` verified 2026-08-05, 1 Imagen + 1 Veo credit** — the 2026-08-03 regression that motivated the bound does NOT reproduce on 1.61.0: a live `i2v` drove the full chain with `image_uploaded status=200` → `frame_attached` → `generate_captured status=200` with `startImage` parsed, where **1.62.0 hung silently at exactly that upload step**; live `i2i` local-ref attach passed outright [96.7s]. **1.62.0 stays excluded** — never root-caused. Also found, A/B-proven pre-existing on BOTH 1.59.0 and 1.61.0: Flow dropped the duration-tab UI, so **`--duration` is currently broken for i2v** — `UiSelectorDriftError` fires correctly [refusing rather than silently accepting Flow's default, #288] but the selector needs re-deriving; that is why the i2v proof was driven via the CLI without `--duration`, and Flow's own server-side `PUBLIC_ERROR_VIDEO_GENERATION_TIMED_OUT` means no finished mp4 is claimed).
160
160
  **"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. Pre-capture research recons: [ASSET_TAGGING_RECON](ASSET_TAGGING_RECON.md) (`@`-mention asset tagging — shipped in v0.40.0, see [LIVE_VERIFICATION_v0.40.0](LIVE_VERIFICATION_v0.40.0.md)).
161
+ **"What was live-verified for v0.66.1?"** → [LIVE_VERIFICATION_v0.66.1](LIVE_VERIFICATION_v0.66.1.md) — **the two migrated-origin fixes, verified 2026-09-03 on profile `ffroliva` at ZERO credits, on BOTH sides of the still-flapping rollout.** On a real `flow.google.com` load `get_ui_driver` raised `FlowHostMigratedError` in **0 ms** (was ~36 s: ~8 s detect window + ~24 s crop cascade + 4 s URL settle), exit 36, `retryable: true`, `ui_driver.migrated_host_bail` logged; `await_url_settled` returned `null` in **0 ms** (measured 4018 ms before); and the locale was recovered as `en` from `html lang=en-GB` where the URL gave `null`. The no-regression half is the stronger evidence: minutes later the same command landed on the OLD host and completed **exit 0** with a real 768x1376 JPEG in 42.2 s, proving the host guard is scoped and does not short-circuit the working path. Three items recorded as NOT verified rather than omitted: driving the migrated frontend (still impossible, #639 stays open), the pt-BR recovery live (measured `html lang=pt` on `denon82` but exercised live only on `en-GB`), and the `en-GB`→`en` region reduction against a locale where region is load-bearing (`zh-Hans`/`zh-Hant`) — only two locales observed.
162
+
161
163
  **"What was live-verified for v0.66.0?"** → [LIVE_VERIFICATION_v0.66.0](LIVE_VERIFICATION_v0.66.0.md) — **#639 Flow's `flow.google.com` migration, verified 2026-09-03 on profile `ffroliva` at ZERO credits.** The maintainer's own account turned out to be inside the rollout, so the fix was proven against the real migrated frontend rather than a reconstructed DOM: a read-only probe of `flow.google.com/project/<id>` measured `i_total: 0` (independently reproducing the reporter's central measurement) and drove the production functions against the live page — `flow_host_kind: "migrated"`, `_check_logged_in: true` (it was `false` before the fix, i.e. a valid session read as logged-out), and `_mode_switch_error` returning `FlowHostMigratedError` / exit 36 / `retryable: true`. The flap is confirmed on ONE account: a credit-free `image t2i` minutes earlier landed on the OLD host and completed exit 0 with a real 768x1376 JPEG (`ffd8ffe0`, 401,939 bytes, Pillow dims matching the API claim), proving the rewritten host gate does not regress the old path. Also recorded: the migrated URL **drops `/fx/tools/flow` entirely** — it is `/project/<id>` — which is why a substring gate on `labs.google` could never match it; and the migrated composer is not control-less but exposes **no `data-testid`, zero ligature `<i>`, and 13 `button[aria-label]`** (`Settings trigger`, `Start generation`, …), recorded as recon for the follow-up WITH the caveat that `aria-label` is translated and therefore Tier-2 at best under the locale-invariance rule. One item is recorded as NOT verified rather than omitted: gflow **driving** the migrated frontend, which is out of scope and keeps #639 open. Verification also hit pre-existing [#561](https://github.com/ffroliva/gflow-cli/issues/561) (401 on `project.createProject`), A/B'd against unmodified `develop` to prove it was not this change, then routed around with an existing `--project`.
162
164
 
163
165
  **"What was live-verified for v0.65.0?"** → [LIVE_VERIFICATION_v0.65.0](LIVE_VERIFICATION_v0.65.0.md) — the guard A/B (three runs, zero credits, control included); the `chain`/`movie` duration guards are validation that refuses **before** any transport call, so they are covered by a red state that reproduces the mid-spend crash in a test plus negative controls, and the reason they were not live-run is recorded rather than omitted.
@@ -0,0 +1,69 @@
1
+ # Live Verification — v0.66.1 (migrated-origin fixes for #639/#643)
2
+
3
+ **Date:** 2026-09-03 · **Account:** ffroliva@gmail.com · **Platform:** Windows 11, Chrome strategy
4
+ **Credits spent:** **0** — one Imagen image (images are credit-free) plus read-only probes.
5
+
6
+ ## What had to be proven
7
+
8
+ Two fixes, both on the migrated-origin path, and both verifiable live because the account is
9
+ inside Google's rollout:
10
+
11
+ 1. `get_ui_driver` fails fast on `flow.google.com` instead of probing a DOM that cannot answer.
12
+ 2. The account locale is recovered from `<html lang>` when the migrated URL carries no segment.
13
+
14
+ Plus the property that matters more than either: **the old host still works.**
15
+
16
+ ## Layer 1 — the migrated path, measured on a real migrated load
17
+
18
+ ```json
19
+ {
20
+ "final_url": "https://flow.google.com/project/c5550ed7-...",
21
+ "host_kind": "migrated",
22
+ "get_ui_driver": { "raised": "FlowHostMigratedError", "ms": 0,
23
+ "exit_code": 36, "retryable": true, "names_host": true },
24
+ "await_url_settled": { "result": null, "ms": 0 },
25
+ "locale_recovery": { "html_lang": "en-GB", "from_url": null, "from_lang_attr": "en" }
26
+ }
27
+ ```
28
+
29
+ | | before | after (measured) |
30
+ |---|---|---|
31
+ | `detect_ui_mode` poll window | ~8 s | skipped |
32
+ | crop selector cascade | ~24 s | skipped |
33
+ | `await_url_settled` | 4018 ms | **0 ms** |
34
+ | **time to exit 36** | **~36 s** | **0 ms** |
35
+ | locale on migrated origin | `null` (and demoted a learned locale) | **`en`** recovered from `<html lang>` |
36
+
37
+ `ui_driver.migrated_host_bail` is logged, so the fast path is observable rather than inferred.
38
+
39
+ ## Layer 2 — no regression on the old host (full generation, exit 0)
40
+
41
+ The rollout still flaps on this account, and a `gflow image t2i --project <existing>` run landed
42
+ on the **old** host during verification:
43
+
44
+ ```
45
+ EXIT=0 ELAPSED_MS=42168
46
+ status: ok | model: NARWHAL
47
+ dims: 768x1376 | tmp/lv661/images/2026-09-03/0add6af6-...-_1.jpg
48
+ ```
49
+
50
+ Real image generated and written. The host guard is scoped to the migrated origin and does not
51
+ short-circuit the path that works.
52
+
53
+ ## Layer 3 — offline
54
+
55
+ - 5 + 8 tests written **red first** across the two fixes.
56
+ - **A/B controls:** neutering the early bail fails exactly 3; neutering the locale fix fails
57
+ exactly 8 — one per claimed behaviour, no test passing vacuously. No-regression tests pass in
58
+ **both** directions.
59
+ - `1614 passed / 3 skipped`; ruff clean; pyright 78 = `develop` baseline.
60
+
61
+ ## Recorded as NOT verified rather than omitted
62
+
63
+ - **Driving the migrated frontend.** Still impossible; #639 stays open. These fixes make the
64
+ failure fast and honest, not survivable.
65
+ - **A non-English migrated locale end to end.** `html lang=pt` was measured on `denon82`'s
66
+ migrated load, but the recovery path was exercised live only on `en-GB` → `en`. The `pt` case
67
+ is unit-tested, not live-run.
68
+ - **The `en-GB` → `en` region reduction against a locale where region is load-bearing**
69
+ (`zh-Hans`/`zh-Hant`). Only two locales observed; flagged in the docstring.
@@ -4,6 +4,39 @@
4
4
 
5
5
  ## Current release
6
6
 
7
+ **v0.66.1 — alpha.** **The migrated-origin failure went from 36 seconds of doomed probing to
8
+ instant, and stopped throwing away a locale it had already learned.**
9
+
10
+ v0.66.0 taught gflow to *name* Google's `flow.google.com` migration
11
+ ([#639](https://github.com/ffroliva/gflow-cli/issues/639)). This release makes living with it
12
+ cheap. Two fixes, both measured on real migrated loads rather than reasoned about:
13
+
14
+ **Fail fast.** The migrated frontend renders none of the controls gflow drives, so every DOM
15
+ probe was doomed before it started — yet a run still burned the `detect_ui_mode` poll window
16
+ (~8 s, both arms missing), the crop cascade (~24 s) and the URL settle (4 s) before raising
17
+ `FlowHostMigratedError`. Because the rollout flaps per page load and callers retry on exit 36,
18
+ that was paid on **every attempt of a retry loop**. The host is knowable from `page.url` in
19
+ microseconds; measured live, exit 36 now arrives in **0 ms**.
20
+
21
+ **Stop discarding the locale.** The migrated origin serves `/project/<id>` with no
22
+ `/fx/<locale>/tools/flow` segment, so locale resolution was structurally blind there — and
23
+ `next_locale_state("pt", None)` then *demoted* an already-learned locale to PROVISIONAL on
24
+ every migrated load, silently undoing [#587](https://github.com/ffroliva/gflow-cli/issues/587).
25
+ The locale had not disappeared with the URL shape; it was in `<html lang>` the whole time.
26
+ Measured on two accounts, `<html lang>` **agreed with the URL segment wherever both existed** —
27
+ which is what licenses it as a fallback, where `navigator.language` (which reports the value
28
+ gflow itself sets) would not
29
+ ([#643](https://github.com/ffroliva/gflow-cli/issues/643)).
30
+
31
+ Neither fix makes the migrated frontend drivable — #639 stays open for that. What they buy is a
32
+ failure that is instant and honest instead of slow and lossy.
33
+
34
+ Verification: [LIVE_VERIFICATION_v0.66.1](LIVE_VERIFICATION_v0.66.1.md) — proven on **both sides
35
+ of the still-flapping rollout** at zero credits: 0 ms exit 36 on a migrated load, and minutes
36
+ later **exit 0** with a real 768x1376 JPEG on an old-host load, proving the guard is scoped.
37
+
38
+ <details><summary>v0.66.0 — naming Flow's flow.google.com migration</summary>
39
+
7
40
  **v0.66.0 — alpha.** **Google started moving Flow to a new domain, and gflow blamed its own
8
41
  selectors for it.**
9
42
 
@@ -42,6 +75,8 @@ Verification: [LIVE_VERIFICATION_v0.66.0](LIVE_VERIFICATION_v0.66.0.md) — prov
42
75
  `check_logged_in: true`, exit 36, `retryable: true`), with a credit-free `image t2i` on the
43
76
  old host minutes earlier completing exit 0 to prove no regression.
44
77
 
78
+ </details>
79
+
45
80
  <details><summary>v0.65.0 — the referenceEntity guard that had never fired</summary>
46
81
 
47
82
  **v0.65.0 — alpha.** **A safety net that had never once fired, and two crashes that spent
@@ -485,6 +520,7 @@ reporter-verified e2e on macOS).
485
520
 
486
521
  | Milestone | Status |
487
522
  |---|---|
523
+ | Migrated-origin runs fail instantly (0 ms) and keep their learned locale | ✅ done (v0.66.1) |
488
524
  | Flow `flow.google.com` migration named as its own retryable failure (exit 36) | ✅ done (v0.66.0) |
489
525
  | Repo scaffold, CI, license, README, disclaimer | ✅ done |
490
526
  | Auth login flow (one-time browser capture) | ✅ done |
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "gflow-cli"
3
- version = "0.66.0"
3
+ version = "0.66.1"
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" }
@@ -1,3 +1,3 @@
1
1
  """gflow-cli — unofficial CLI for Google Flow."""
2
2
 
3
- __version__ = "0.66.0"
3
+ __version__ = "0.66.1"
@@ -792,8 +792,23 @@ class FlowApiClient:
792
792
  segment = routes.locale_segment_from_url(settled or "")
793
793
  if segment is not None:
794
794
  logger.info("client.account_locale_resolved", locale=segment, url=settled)
795
- else:
796
- logger.info("client.account_locale_unresolved", last_url=settled)
795
+ return segment
796
+ # #643: the migrated flow.google.com origin serves /project/<id> with no
797
+ # locale segment, so the URL can never answer there — but Flow still
798
+ # renders the account locale into <html lang>. Without this the resolver
799
+ # returns None and `next_locale_state` DEMOTES an already-learned locale
800
+ # to PROVISIONAL (measured: a pt account lost its "pt" on every migrated
801
+ # load). Best-effort: a probe failure must never break navigation.
802
+ try:
803
+ lang = await page.evaluate("() => document.documentElement.lang || ''")
804
+ except Exception as exc: # noqa: BLE001 - observation only
805
+ logger.info("client.account_locale_lang_probe_failed", error=type(exc).__name__)
806
+ lang = None
807
+ segment = routes.locale_segment_from_lang_attr(lang)
808
+ if segment is not None:
809
+ logger.info("client.account_locale_resolved", locale=segment, source="html_lang")
810
+ return segment
811
+ logger.info("client.account_locale_unresolved", last_url=settled)
797
812
  return segment
798
813
 
799
814
  async def _launch_persistent_context(self, kwargs: JsonObject) -> BrowserContext:
@@ -212,6 +212,38 @@ def locale_segment_from_url(url: str) -> str | None:
212
212
  return match.group(1).lower()
213
213
 
214
214
 
215
+ _LANG_ATTR_RE = re.compile(r"^([a-z]{2,3})(?:-[a-z]{2,4})?$")
216
+
217
+
218
+ def locale_segment_from_lang_attr(lang: str | None) -> str | None:
219
+ """Derive Flow's locale SEGMENT from a page's ``<html lang>`` attribute (#643).
220
+
221
+ Needed because the migrated ``flow.google.com`` origin serves ``/project/<id>``
222
+ with **no locale segment at all** — :func:`locale_segment_from_url` is
223
+ structurally blind there. The locale did not disappear with the URL shape; it
224
+ is still served in the document.
225
+
226
+ Measured 2026-09-03 on two profiles, old host vs migrated:
227
+
228
+ * ``ffroliva`` old ``/fx/tools/flow`` (bare), ``lang=en`` -> migrated ``lang=en-GB``
229
+ * ``denon82`` old ``/fx/pt/tools/flow``, ``lang=pt`` -> migrated ``lang=pt``
230
+
231
+ ``html lang`` **agreed with the URL segment wherever both existed**, which is
232
+ what licenses it as a fallback. Unlike ``navigator.language`` — which reports
233
+ the value gflow itself sets when it launches the context, and so answers
234
+ confidently but wrongly — this attribute is server-rendered by Flow.
235
+
236
+ The region suffix is dropped (``en-GB`` -> ``en``) because Flow's URL segments
237
+ carry no region, and the two derivations must stay comparable. Anything that
238
+ is not a plausible tag returns ``None`` — "build the bare URL" is always safe,
239
+ and guessing is the defect this exists to avoid.
240
+ """
241
+ if not lang:
242
+ return None
243
+ match = _LANG_ATTR_RE.match(lang.strip().lower())
244
+ return match.group(1) if match else None
245
+
246
+
215
247
  def project_editor_url(locale: str | None, project_id: str) -> str:
216
248
  """Build the user-facing Flow editor URL for an existing project.
217
249
 
@@ -224,6 +224,12 @@ async def await_url_settled(page: Any) -> str | None:
224
224
  current = ""
225
225
  if current and FLOW_LOCALISED_URL_RE.match(current):
226
226
  return current
227
+ # #643: on the migrated origin the localised shape can NEVER appear — the path
228
+ # is /project/<id>, with no /fx/<locale>/tools/flow segment. Waiting for it
229
+ # burned the full timeout (measured 4018 ms on every migrated navigation) to
230
+ # return the None we can return now.
231
+ if flow_host_kind(current) == "migrated":
232
+ return None
227
233
 
228
234
  try:
229
235
  await page.wait_for_url(FLOW_LOCALISED_URL_RE, timeout=URL_SETTLE_TIMEOUT_MS)
@@ -152,6 +152,27 @@ async def get_ui_driver(
152
152
  Call per generation — the cohort flaps per page load, so a cached driver
153
153
  goes stale on the next navigation / batch item.
154
154
  """
155
+ # #639: the migrated flow.google.com frontend renders none of the controls
156
+ # gflow drives, so every probe below is doomed before it starts. Finding that
157
+ # out the slow way costs ~32 s per attempt (the ~8 s detect_ui_mode poll
158
+ # window, both arms missing, plus the ~24 s crop cascade) -- and because the
159
+ # rollout flaps and callers retry on exit 36, that is paid on every attempt of
160
+ # a retry loop. The host is knowable from page.url in microseconds.
161
+ from gflow_cli.api.transports._common import flow_host_kind
162
+
163
+ if flow_host_kind(getattr(page, "url", None)) == "migrated":
164
+ from gflow_cli.errors import FlowHostMigratedError
165
+
166
+ log.info("ui_driver.migrated_host_bail")
167
+ raise FlowHostMigratedError(
168
+ detail=(
169
+ "Flow served this project from flow.google.com — the origin Google is "
170
+ "migrating the app onto — whose frontend renders none of the controls "
171
+ "gflow drives. This is not selector drift. The migration flaps per page "
172
+ "load, so retrying often lands the old frontend."
173
+ )
174
+ )
175
+
155
176
  # Prerequisite switch: when a specific arm is required and the current one
156
177
  # differs, attempt the DOM toggle for that direction (best-effort — the
157
178
  # server can pin the arm). The re-probe below VERIFIES whether it took.
@@ -0,0 +1,185 @@
1
+ """Locale-segment extraction from a settled Flow URL (issue #580).
2
+
3
+ gflow hardcoded `locale="en-US"` for every account, so a pt-BR account was sent to
4
+ `/fx/en/...` and Flow redirected it to `/fx/pt/...` AFTER `page.goto` had already
5
+ returned — leaving the next DOM action operating on a page about to be navigated
6
+ away. The only trustworthy source of the account locale is where Flow itself lands
7
+ (`auth/session` carries no locale, and `navigator.language` reports the value gflow
8
+ sets at launch). This parses that landing URL.
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ from unittest.mock import AsyncMock, MagicMock
14
+
15
+ import pytest
16
+
17
+ from gflow_cli.api.routes import locale_segment_from_lang_attr, locale_segment_from_url
18
+
19
+ PID = "2ddc3a33-97db-41a0-a0d3-7f9488b0d5a9"
20
+
21
+
22
+ @pytest.mark.parametrize(
23
+ ("url", "expected"),
24
+ [
25
+ # measured live on denon82 (pt-BR)
26
+ (f"https://labs.google/fx/pt/tools/flow/project/{PID}", "pt"),
27
+ ("https://labs.google/fx/pt/tools/flow", "pt"),
28
+ ("https://labs.google/fx/pt/tools/flow?hl=en", "pt"),
29
+ ("https://labs.google/fx/en/tools/flow", "en"),
30
+ ("https://labs.google/fx/ja/tools/flow", "ja"),
31
+ # three-letter segments are legal BCP-47 primary tags
32
+ ("https://labs.google/fx/fil/tools/flow", "fil"),
33
+ ],
34
+ )
35
+ def test_extracts_locale_segment(url: str, expected: str) -> None:
36
+ assert locale_segment_from_url(url) == expected
37
+
38
+
39
+ @pytest.mark.parametrize(
40
+ "url",
41
+ [
42
+ # no segment at all — Flow serves this and normalises later
43
+ f"https://labs.google/fx/tools/flow/project/{PID}",
44
+ "https://labs.google/fx/tools/flow",
45
+ # `tools` is not a locale: the guard must not mistake the next path
46
+ # component for one just because it sits in the segment position.
47
+ "https://labs.google/fx/tools",
48
+ # junk in the segment slot
49
+ "https://labs.google/fx/PROJECT/tools/flow",
50
+ "https://labs.google/fx/toolong/tools/flow",
51
+ "https://labs.google/fx/1/tools/flow",
52
+ "https://labs.google/fx/p-t/tools/flow",
53
+ # not a Flow URL
54
+ "https://example.invalid/fx/pt/tools/flow",
55
+ "https://labs.google/other/pt/tools/flow",
56
+ "",
57
+ ],
58
+ )
59
+ def test_returns_none_when_no_trustworthy_segment(url: str) -> None:
60
+ """No segment is strictly better than a guessed one.
61
+
62
+ Falling back to the bare URL is never worse than today's behaviour; guessing
63
+ `en` is exactly the bug.
64
+ """
65
+ assert locale_segment_from_url(url) is None
66
+
67
+
68
+ def test_bcp47_tail_is_dropped() -> None:
69
+ """`pt-BR` in the path reduces to the primary tag Flow actually serves."""
70
+ assert locale_segment_from_url("https://labs.google/fx/pt-BR/tools/flow") == "pt"
71
+
72
+
73
+ # ---------------------------------------------------------------------------
74
+ # #643: on flow.google.com the locale left the URL but NOT the document
75
+ # ---------------------------------------------------------------------------
76
+
77
+
78
+ class TestLocaleSegmentFromLangAttr:
79
+ """The migrated origin serves `/project/<id>` with no locale segment, so
80
+ `locale_segment_from_url` is structurally blind there — but the locale is
81
+ still being served, in `<html lang>`.
82
+
83
+ Measured on two profiles, old host vs migrated:
84
+
85
+ ffroliva old: /fx/tools/flow (bare) lang=en migrated: lang=en-GB
86
+ denon82 old: /fx/**pt**/tools/flow lang=pt migrated: lang=pt
87
+
88
+ `html lang` AGREED with the URL segment wherever both existed, which is what
89
+ makes it a trustworthy fallback. Unlike `navigator.language` — which reports
90
+ the value gflow itself sets when it launches the context — this attribute is
91
+ server-rendered by Flow.
92
+ """
93
+
94
+ def test_plain_segment(self) -> None:
95
+ assert locale_segment_from_lang_attr("pt") == "pt"
96
+
97
+ def test_region_suffix_is_reduced_to_the_segment(self) -> None:
98
+ """Measured: the migrated English account renders `en-GB`; Flow's URL
99
+ segment form is `en`, so the region must be dropped to stay comparable."""
100
+ assert locale_segment_from_lang_attr("en-GB") == "en"
101
+ assert locale_segment_from_lang_attr("pt-BR") == "pt"
102
+
103
+ def test_case_is_normalised(self) -> None:
104
+ assert locale_segment_from_lang_attr("PT-br") == "pt"
105
+
106
+ def test_three_letter_segment_allowed(self) -> None:
107
+ assert locale_segment_from_lang_attr("fil") == "fil"
108
+
109
+ def test_junk_is_none_not_a_guess(self) -> None:
110
+ for bad in ("", " ", "x", "english", "e n", "1234", "zz-ZZ-ZZ-ZZ"):
111
+ assert locale_segment_from_lang_attr(bad) is None, bad
112
+
113
+ def test_none_input(self) -> None:
114
+ assert locale_segment_from_lang_attr(None) is None
115
+
116
+ def test_agrees_with_url_derivation_where_both_exist(self) -> None:
117
+ """The property that licenses the fallback: on the OLD host, both
118
+ sources are present and they must not disagree."""
119
+ url = "https://labs.google/fx/pt/tools/flow"
120
+ assert locale_segment_from_url(url) == locale_segment_from_lang_attr("pt")
121
+
122
+
123
+ # ---------------------------------------------------------------------------
124
+ # #643: the resolver must USE the fallback, not just have one available
125
+ # ---------------------------------------------------------------------------
126
+
127
+
128
+ class TestResolveAccountLocaleFallsBackToHtmlLang:
129
+ """`_resolve_account_locale` derived the locale from the settled URL only.
130
+
131
+ On the migrated origin that URL carries no segment, so it resolved `None` —
132
+ and `next_locale_state("pt", None)` then returned PROVISIONAL, DEMOTING a
133
+ correctly-learned locale (measured on `denon82`). The locale was sitting in
134
+ `<html lang>` the whole time.
135
+ """
136
+
137
+ @staticmethod
138
+ def _page(url: str, lang: str) -> MagicMock:
139
+ page = MagicMock()
140
+ page.url = url
141
+ page.wait_for_url = AsyncMock()
142
+ page.evaluate = AsyncMock(return_value=lang)
143
+ return page
144
+
145
+ @pytest.mark.asyncio
146
+ async def test_migrated_host_recovers_locale_from_html_lang(self) -> None:
147
+ from gflow_cli.api.client import FlowApiClient
148
+
149
+ page = self._page("https://flow.google.com/project/abc-123", "pt")
150
+ got = await FlowApiClient._resolve_account_locale(object(), page) # type: ignore[arg-type]
151
+ assert got == "pt"
152
+
153
+ @pytest.mark.asyncio
154
+ async def test_migrated_english_region_tag_reduces_to_segment(self) -> None:
155
+ from gflow_cli.api.client import FlowApiClient
156
+
157
+ page = self._page("https://flow.google.com/", "en-GB")
158
+ got = await FlowApiClient._resolve_account_locale(object(), page) # type: ignore[arg-type]
159
+ assert got == "en"
160
+
161
+ @pytest.mark.asyncio
162
+ async def test_url_segment_still_wins_on_the_old_host(self) -> None:
163
+ """No regression: where Flow states the locale in the URL, that stays
164
+ authoritative — the fallback must not override it."""
165
+ from gflow_cli.api.client import FlowApiClient
166
+
167
+ page = self._page("https://labs.google/fx/pt/tools/flow", "de")
168
+ got = await FlowApiClient._resolve_account_locale(object(), page) # type: ignore[arg-type]
169
+ assert got == "pt"
170
+ page.evaluate.assert_not_awaited()
171
+
172
+ @pytest.mark.asyncio
173
+ async def test_unreadable_lang_stays_none_rather_than_guessing(self) -> None:
174
+ from gflow_cli.api.client import FlowApiClient
175
+
176
+ page = self._page("https://flow.google.com/", "")
177
+ assert await FlowApiClient._resolve_account_locale(object(), page) is None # type: ignore[arg-type]
178
+
179
+ @pytest.mark.asyncio
180
+ async def test_evaluate_failure_is_survivable(self) -> None:
181
+ from gflow_cli.api.client import FlowApiClient
182
+
183
+ page = self._page("https://flow.google.com/", "pt")
184
+ page.evaluate = AsyncMock(side_effect=RuntimeError("no execution context"))
185
+ assert await FlowApiClient._resolve_account_locale(object(), page) is None # type: ignore[arg-type]
@@ -11,7 +11,7 @@ arm (which today drops `-i` cards and mis-hints aspect ratios).
11
11
 
12
12
  from __future__ import annotations
13
13
 
14
- from unittest.mock import AsyncMock
14
+ from unittest.mock import AsyncMock, MagicMock
15
15
 
16
16
  import pytest
17
17
 
@@ -317,3 +317,98 @@ def test_worker_video_ui_mode_agentic_payload_rejected() -> None:
317
317
 
318
318
  with _pytest.raises(ValueError, match="agentic"):
319
319
  build_video_request({"prompt": "a", "ui_mode": "agentic"})
320
+
321
+
322
+ # ---------------------------------------------------------------------------
323
+ # #639 follow-up: fail fast on the migrated origin instead of probing a DOM
324
+ # that cannot answer
325
+ # ---------------------------------------------------------------------------
326
+
327
+
328
+ _CROP = "i.google-symbols:text-is('crop_16_9')"
329
+
330
+
331
+ def _page_with_present(present: set[str]):
332
+ page = MagicMock()
333
+
334
+ def locator(sel: str):
335
+ loc = MagicMock()
336
+ loc.count = AsyncMock(return_value=1 if sel in present else 0)
337
+ return loc
338
+
339
+ page.locator = MagicMock(side_effect=locator)
340
+ return page
341
+
342
+
343
+ class TestMigratedOriginFailsFast:
344
+ """`flow.google.com` renders none of the controls gflow drives, so every
345
+ probe below is doomed before it starts. Measured cost of finding that out
346
+ the slow way, per attempt:
347
+
348
+ detect_ui_mode poll window ~8 s (both arms miss, falls to deadline)
349
+ crop selector cascade ~24 s
350
+ -----
351
+ ~32 s before FlowHostMigratedError is raised
352
+
353
+ The migration flaps per load and callers retry on exit 36, so that cost is
354
+ paid on every attempt of a retry loop. The host is knowable in microseconds
355
+ from `page.url`, so none of it needs to be spent.
356
+ """
357
+
358
+ @pytest.mark.asyncio
359
+ async def test_raises_before_probing_the_dom(self) -> None:
360
+ from gflow_cli.api.transports.drivers.factory import get_ui_driver
361
+ from gflow_cli.errors import FlowHostMigratedError
362
+
363
+ page = MagicMock()
364
+ page.url = "https://flow.google.com/project/abc-123"
365
+ page.locator = MagicMock(side_effect=AssertionError("must not probe the DOM"))
366
+
367
+ with pytest.raises(FlowHostMigratedError):
368
+ await get_ui_driver(page)
369
+ page.locator.assert_not_called()
370
+
371
+ @pytest.mark.asyncio
372
+ async def test_error_is_retryable_with_exit_36(self) -> None:
373
+ from gflow_cli.api.transports.drivers.factory import get_ui_driver
374
+ from gflow_cli.errors import EXIT_CODE_MAP, FlowHostMigratedError, is_retryable
375
+
376
+ page = MagicMock()
377
+ page.url = "https://flow.google.com/"
378
+ page.locator = MagicMock(side_effect=AssertionError("must not probe the DOM"))
379
+
380
+ with pytest.raises(FlowHostMigratedError) as exc:
381
+ await get_ui_driver(page)
382
+ assert is_retryable(exc.value)
383
+ assert EXIT_CODE_MAP[FlowHostMigratedError] == 36
384
+
385
+ @pytest.mark.asyncio
386
+ async def test_bail_names_the_migration_not_selector_drift(self) -> None:
387
+ from gflow_cli.api.transports.drivers.factory import get_ui_driver
388
+ from gflow_cli.errors import FlowHostMigratedError
389
+
390
+ page = MagicMock()
391
+ page.url = "https://flow.google.com/"
392
+ page.locator = MagicMock(side_effect=AssertionError("must not probe the DOM"))
393
+ with pytest.raises(FlowHostMigratedError) as exc:
394
+ await get_ui_driver(page)
395
+ assert "flow.google.com" in str(exc.value)
396
+
397
+ @pytest.mark.asyncio
398
+ async def test_labs_host_is_untouched(self) -> None:
399
+ """No regression: the old host must still go through full DOM detection."""
400
+ from gflow_cli.api.transports.drivers.factory import detect_ui_mode
401
+
402
+ page = _page_with_present({_CROP})
403
+ page.url = "https://labs.google/fx/tools/flow/project/abc"
404
+ assert await detect_ui_mode(page, timeout_s=0.1, poll_interval_s=0.01) == "classic"
405
+
406
+ @pytest.mark.asyncio
407
+ async def test_unreadable_url_still_probes_rather_than_bailing(self) -> None:
408
+ """Defensive: a page whose .url is not a usable string must NOT be
409
+ mistaken for a migrated host — that would turn a transient into a
410
+ permanent-looking abort."""
411
+ from gflow_cli.api.transports.drivers.factory import detect_ui_mode
412
+
413
+ page = _page_with_present({_CROP}) # MagicMock .url, never assigned
414
+ assert await detect_ui_mode(page, timeout_s=0.1, poll_interval_s=0.01) == "classic"