gflow-cli 0.53.0__tar.gz → 0.54.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (727) hide show
  1. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.codex-plugin/plugin.json +1 -1
  2. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.github/dependabot.yml +35 -7
  3. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.github/workflows/deps-watch.yml +1 -1
  4. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.github/workflows/external-pr-triage.yml +1 -1
  5. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.github/workflows/labels.yml +1 -1
  6. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/CHANGELOG.md +24 -1
  7. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/PKG-INFO +3 -3
  8. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/INDEX.md +1 -1
  9. gflow_cli-0.54.0/docs/LIVE_VERIFICATION_v0.54.0.md +67 -0
  10. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/SECURITY.md +7 -2
  11. gflow_cli-0.54.0/docs/superpowers/plans/2026-08-06-ui-mode-policy/PLAN.md +98 -0
  12. gflow_cli-0.54.0/docs/superpowers/plans/2026-08-06-ui-mode-policy/SCENARIO.md +27 -0
  13. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/pyproject.toml +3 -3
  14. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/__init__.py +1 -1
  15. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/api/transports/ui_automation.py +12 -23
  16. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/auth/real_chrome.py +5 -2
  17. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tasks/lessons.md +10 -0
  18. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/test_overlay_banner_dismissal.py +3 -4
  19. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/test_playwright_pin.py +60 -0
  20. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/uv.lock +34 -34
  21. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/website/docs/SECURITY.md +7 -2
  22. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.agents/plugins/marketplace.json +0 -0
  23. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.claude/README.md +0 -0
  24. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.claude/commands/gflow/active.md +0 -0
  25. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.claude/commands/gflow/branch-review.md +0 -0
  26. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.claude/commands/gflow/changelog.md +0 -0
  27. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.claude/commands/gflow/check.md +0 -0
  28. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.claude/commands/gflow/doc-review.md +0 -0
  29. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.claude/commands/gflow/issue-assessment.md +0 -0
  30. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.claude/commands/gflow/issue-resolve.md +0 -0
  31. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.claude/commands/gflow/known-issues.md +0 -0
  32. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.claude/commands/gflow/live-verify.md +0 -0
  33. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.claude/commands/gflow/llm-council.md +0 -0
  34. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.claude/commands/gflow/next.md +0 -0
  35. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.claude/commands/gflow/plan.md +0 -0
  36. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.claude/commands/gflow/pr-council-review.md +0 -0
  37. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.claude/commands/gflow/predict.md +0 -0
  38. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.claude/commands/gflow/release.md +0 -0
  39. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.claude/commands/gflow/scenario.md +0 -0
  40. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.claude/commands/gflow/sonar.md +0 -0
  41. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.claude/commands/gflow/status.md +0 -0
  42. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.env.template +0 -0
  43. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.gitattributes +0 -0
  44. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.github/CODEOWNERS +0 -0
  45. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  46. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.github/copilot-instructions.md +0 -0
  47. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.github/workflows/ci.yml +0 -0
  48. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.github/workflows/governance-advisory.yml +0 -0
  49. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.github/workflows/governance-benchmark.yml +0 -0
  50. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.github/workflows/main-base-guard.yml +0 -0
  51. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.github/workflows/pages.yml +0 -0
  52. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.github/workflows/release.yml +0 -0
  53. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.gitignore +0 -0
  54. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.gitleaks.toml +0 -0
  55. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.pre-commit-config.yaml +0 -0
  56. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/.secrets.baseline +0 -0
  57. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/AGENTS.md +0 -0
  58. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/CLAUDE.md +0 -0
  59. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/CONFIGURATION.md +0 -0
  60. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/CONTRIBUTING.md +0 -0
  61. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/DISCLAIMER.md +0 -0
  62. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/KNOWN_ISSUES.md +0 -0
  63. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/LICENSE +0 -0
  64. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/PLAN.md +0 -0
  65. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/README.md +0 -0
  66. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/RELEASE.md +0 -0
  67. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/ROADMAP.md +0 -0
  68. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/conftest.py +0 -0
  69. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/deploy/PR-TRIAGE-AUTOPILOT-OPS.md +0 -0
  70. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docker-compose.yml +0 -0
  71. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/AGENT_GUIDE.md +0 -0
  72. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/AGENT_UI_E2E.md +0 -0
  73. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/AGENT_UI_RECON.md +0 -0
  74. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/ARCHITECTURE.md +0 -0
  75. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/ASSET_TAGGING_RECON.md +0 -0
  76. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/AUTHENTICATION.md +0 -0
  77. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/CHARACTER.md +0 -0
  78. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/CHARACTER_RECON.md +0 -0
  79. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/CONFIGURATION.md +0 -0
  80. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/DATA_LAYER.md +0 -0
  81. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/DEBUGGING.md +0 -0
  82. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/DEMOS.md +0 -0
  83. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/DEVELOPMENT.md +0 -0
  84. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/E2E_TESTING.md +0 -0
  85. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/EXTERNAL_STORAGE.md +0 -0
  86. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/GITHUB.md +0 -0
  87. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
  88. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
  89. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/INSTRUCTIONS.md +0 -0
  90. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
  91. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
  92. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_playwright_1.61.md +0 -0
  93. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
  94. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
  95. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
  96. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
  97. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
  98. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
  99. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
  100. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
  101. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
  102. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
  103. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.21.0.md +0 -0
  104. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.22.0.md +0 -0
  105. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.23.0.md +0 -0
  106. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.24.0.md +0 -0
  107. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.25.0.md +0 -0
  108. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.26.0.md +0 -0
  109. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.27.0.md +0 -0
  110. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.27.1.md +0 -0
  111. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.28.0.md +0 -0
  112. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.29.0.md +0 -0
  113. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.30.0.md +0 -0
  114. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.31.0.md +0 -0
  115. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.32.0.md +0 -0
  116. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.32.1.md +0 -0
  117. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.33.0.md +0 -0
  118. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.34.0.md +0 -0
  119. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.35.0.md +0 -0
  120. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.36.0.md +0 -0
  121. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.37.0.md +0 -0
  122. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.38.0.md +0 -0
  123. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.38.1.md +0 -0
  124. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.39.0.md +0 -0
  125. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.40.0-production-readiness.md +0 -0
  126. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.40.0.md +0 -0
  127. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.41.0.md +0 -0
  128. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.42.0.md +0 -0
  129. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.43.0.md +0 -0
  130. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.44.0.md +0 -0
  131. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.45.0.md +0 -0
  132. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.46.0.md +0 -0
  133. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.46.1.md +0 -0
  134. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.47.0.md +0 -0
  135. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.48.0.md +0 -0
  136. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.49.0.md +0 -0
  137. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.50.0.md +0 -0
  138. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.51.0.md +0 -0
  139. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.52.0.md +0 -0
  140. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
  141. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
  142. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
  143. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
  144. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
  145. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/MCP.md +0 -0
  146. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/MOVIE.md +0 -0
  147. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/PROJECT_STATUS.md +0 -0
  148. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/PROMPT_EXPANSION.md +0 -0
  149. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/REFERENCE_STRATEGIES.md +0 -0
  150. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/TOOLS.md +0 -0
  151. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/USAGE.md +0 -0
  152. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/USER_GUIDE.md +0 -0
  153. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/assets/demo-split-pf.gif +0 -0
  154. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/assets/example-run.gif +0 -0
  155. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/assets/examples.webp +0 -0
  156. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/medium_tutorial.md +0 -0
  157. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/schemas/movie-handoff.schema.json +0 -0
  158. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/sonar-cleanup-tracker.md +0 -0
  159. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
  160. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +0 -0
  161. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +0 -0
  162. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +0 -0
  163. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +0 -0
  164. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +0 -0
  165. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +0 -0
  166. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +0 -0
  167. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +0 -0
  168. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +0 -0
  169. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-07-08-pr-triage-autopilot/PLAN.md +0 -0
  170. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-07-09-camoufox-adoption/PLAN.md +0 -0
  171. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-07-14-storyboarding-and-visual-curation/PLAN.md +0 -0
  172. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-07-18-asset-tagging/PLAN.md +0 -0
  173. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-07-19-live-verify/PLAN.md +0 -0
  174. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-07-19-production-readiness-browser-lifecycle.md +0 -0
  175. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-07-19-production-readiness-driver-cdp-verification.md +0 -0
  176. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-07-19-production-readiness-public-truth.md +0 -0
  177. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-07-19-production-readiness-queue-safety.md +0 -0
  178. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-07-26-character-prompt-polishing/PLAN.md +0 -0
  179. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-07-26-project-name-management/PLAN.md +0 -0
  180. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-07-26-self-documenting-errors/PLAN.md +0 -0
  181. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-07-27-overlay-banner-dismissal/PLAN.md +0 -0
  182. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/PLAN.md +0 -0
  183. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/SCENARIO.md +0 -0
  184. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-08-04-mcp-tasks/PLAN.md +0 -0
  185. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-08-04-output-hardening/PLAN.md +0 -0
  186. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-08-05-issue-317-intra-batch-references/PLAN.md +0 -0
  187. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-08-05-issue-317-intra-batch-references/SCENARIO.md +0 -0
  188. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-08-05-issue-402-entity-provenance/PLAN.md +0 -0
  189. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-08-05-issue-402-entity-provenance/SCENARIO.md +0 -0
  190. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-08-05-issue-451-duration-tab-drift/PLAN.md +0 -0
  191. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-08-05-issue-451-duration-tab-drift/SCENARIO.md +0 -0
  192. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-08-06-driver-delay-jittering/PLAN.md +0 -0
  193. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-08-06-driver-delay-jittering/SCENARIO.md +0 -0
  194. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-08-06-overlay-changelog-watermark/PLAN.md +0 -0
  195. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/plans/2026-08-06-overlay-changelog-watermark/SCENARIO.md +0 -0
  196. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/research/2026-06-27-tool-abstraction-evaluation.md +0 -0
  197. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/specs/2026-06-29-issue-assessment-workflow-design.md +0 -0
  198. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/specs/2026-07-04-pr-triage-autopilot-design.md +0 -0
  199. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/specs/2026-07-18-asset-tagging-design.md +0 -0
  200. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/specs/2026-07-19-live-verify-design.md +0 -0
  201. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/specs/2026-07-19-production-readiness-hardening-design.md +0 -0
  202. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/spikes/2026-07-09-camoufox-waf-403.md +0 -0
  203. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/spikes/2026-07-12-ui-cohort-backend-config.md +0 -0
  204. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/spikes/2026-07-17-production-readiness-assessment.md +0 -0
  205. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/docs/superpowers/spikes/2026-08-01-mcp-2026-07-28-spec-impact.md +0 -0
  206. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/eval/pr_triage_eval.py +0 -0
  207. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/eval/pr_triage_fixtures.json +0 -0
  208. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/examples/README.md +0 -0
  209. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/examples/batch_from_config.py +0 -0
  210. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/examples/multi_prompt_t2i.py +0 -0
  211. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/examples/sample_config.json +0 -0
  212. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/examples/sample_prompts.txt +0 -0
  213. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/examples/single_image_t2i.py +0 -0
  214. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/examples/workflow_chain.py +0 -0
  215. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/index.html +0 -0
  216. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/llms.txt +0 -0
  217. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/samples/README.md +0 -0
  218. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/samples/captured/01_upload_image.json +0 -0
  219. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
  220. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
  221. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/samples/captured/04_archive_workflow.json +0 -0
  222. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/samples/captured/05_createProject.json +0 -0
  223. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/samples/captured/06_batchGenerateImages.json +0 -0
  224. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
  225. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
  226. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
  227. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
  228. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
  229. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/samples/captured/12_create_scene.json +0 -0
  230. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
  231. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/samples/captured/14_get_scene_workflows.json +0 -0
  232. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
  233. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/autopilot/Dockerfile.triage +0 -0
  234. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/autopilot/entrypoint.sh +0 -0
  235. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/autopilot/pr_triage_autopilot.py +0 -0
  236. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/autopilot/pr_triage_gate.py +0 -0
  237. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/autopilot/run_sandboxed_review.sh +0 -0
  238. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/ci/check_doc_links.py +0 -0
  239. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/ci/check_materiality.py +0 -0
  240. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/ci/check_release_artifacts.py +0 -0
  241. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/ci/check_repo_hygiene.py +0 -0
  242. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/ci/check_website_docs_pii.py +0 -0
  243. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/ci/generate_website_docs.py +0 -0
  244. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/debug_editor.py +0 -0
  245. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/debug_gen_settings.py +0 -0
  246. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/debug_settings.py +0 -0
  247. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/_recording_client.py +0 -0
  248. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/_spike_common.py +0 -0
  249. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/active_plan.py +0 -0
  250. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/analyze_agent_ui_capture.py +0 -0
  251. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
  252. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
  253. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
  254. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
  255. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
  256. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/capture_locale_invariants.py +0 -0
  257. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
  258. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/character_create_spike.py +0 -0
  259. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/character_create_spike_v2.py +0 -0
  260. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/dump_character_selectors.js +0 -0
  261. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/incident_bundle_quality.py +0 -0
  262. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/live_verify_mcp_tasks.py +0 -0
  263. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/make_project.py +0 -0
  264. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/materiality_backtest.py +0 -0
  265. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/monitor_pr_38.py +0 -0
  266. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/patch_character.py +0 -0
  267. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/skillopt/README.md +0 -0
  268. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/skillopt/harness.py +0 -0
  269. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/skillopt/tasks.json +0 -0
  270. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/sonar-local-scan.sh +0 -0
  271. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/sonar-pre-push-gate.sh +0 -0
  272. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/spike_char_editor_dom.py +0 -0
  273. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/spike_char_gen_capture.py +0 -0
  274. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/spike_character_prompt_format.py +0 -0
  275. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
  276. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
  277. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
  278. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
  279. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/spike_incident_live.py +0 -0
  280. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
  281. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
  282. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/spike_issue313_agent_mode_controls.py +0 -0
  283. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/spike_issue314_picker_filename_search.py +0 -0
  284. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/spike_issue404_count_tabs_recon.py +0 -0
  285. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/spike_mode_roundtrip.py +0 -0
  286. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/spike_mode_switch_agentic_to_classic.py +0 -0
  287. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
  288. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
  289. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
  290. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/spike_movie_picker_select.py +0 -0
  291. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/spike_movie_voice_list.py +0 -0
  292. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/spike_omni_flash_i2v_ui_recon.py +0 -0
  293. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/spike_patch_entity.py +0 -0
  294. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/dev/spike_patchright.py +0 -0
  295. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/diag/README.md +0 -0
  296. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/diag/capture_flow_traffic.py +0 -0
  297. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/diag/memory_profile.py +0 -0
  298. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/diag/recaptcha_mint.py +0 -0
  299. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/diag/spike_387_openai_compat.py +0 -0
  300. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
  301. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/e2e/capture_agent_toggle.py +0 -0
  302. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/record_demo.ps1 +0 -0
  303. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/smoke_image.py +0 -0
  304. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/smoke_video_editor.py +0 -0
  305. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/smoke_worker_style.py +0 -0
  306. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/spike_waf_camoufox.py +0 -0
  307. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/scripts/verify_chrome_auth_viability.py +0 -0
  308. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/skills/README.md +0 -0
  309. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/skills/changelog/SKILL.md +0 -0
  310. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/skills/check/SKILL.md +0 -0
  311. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/skills/doc-review/SKILL.md +0 -0
  312. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/skills/gflow-cli/SKILL.md +0 -0
  313. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/skills/issue-assessment/SKILL.md +0 -0
  314. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/skills/issue-resolve/SKILL.md +0 -0
  315. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/skills/known-issues/SKILL.md +0 -0
  316. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/skills/live-verify/SKILL.md +0 -0
  317. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/skills/llm-council/SKILL.md +0 -0
  318. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/skills/plan/SKILL.md +0 -0
  319. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/skills/pr-council-review/SKILL.md +0 -0
  320. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/skills/predict/SKILL.md +0 -0
  321. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/skills/release/SKILL.md +0 -0
  322. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/skills/scenario/SKILL.md +0 -0
  323. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/skills/sonar/SKILL.md +0 -0
  324. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/skills/status/SKILL.md +0 -0
  325. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/sonar-project.properties +0 -0
  326. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/__main__.py +0 -0
  327. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/_cli_helpers.py +0 -0
  328. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/api/__init__.py +0 -0
  329. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/api/_engine.py +0 -0
  330. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/api/_retry.py +0 -0
  331. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
  332. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/api/character.py +0 -0
  333. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/api/client.py +0 -0
  334. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/api/dto.py +0 -0
  335. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/api/image.py +0 -0
  336. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/api/image_upscale.py +0 -0
  337. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/api/recaptcha.py +0 -0
  338. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/api/routes.py +0 -0
  339. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/api/scene.py +0 -0
  340. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/api/transports/__init__.py +0 -0
  341. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/api/transports/_common.py +0 -0
  342. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
  343. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/api/transports/base.py +0 -0
  344. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
  345. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/api/transports/drivers/agentic.py +0 -0
  346. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/api/transports/drivers/base.py +0 -0
  347. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/api/transports/drivers/classic.py +0 -0
  348. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/api/transports/drivers/factory.py +0 -0
  349. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
  350. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
  351. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
  352. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
  353. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/api/transports/mode_control.py +0 -0
  354. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/api/transports/ui_automation_video.py +0 -0
  355. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/api/video.py +0 -0
  356. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/auth/__init__.py +0 -0
  357. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/auth/base.py +0 -0
  358. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/auth/cookies.py +0 -0
  359. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/auth/factory.py +0 -0
  360. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
  361. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/auth/strategies.py +0 -0
  362. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/auth/verification.py +0 -0
  363. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/browser_manager.py +0 -0
  364. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/chain.py +0 -0
  365. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/chain_manifest.py +0 -0
  366. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/cli.py +0 -0
  367. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/cli_character.py +0 -0
  368. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/cli_data.py +0 -0
  369. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/cli_image.py +0 -0
  370. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/cli_instructions.py +0 -0
  371. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/cli_models.py +0 -0
  372. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/cli_movie.py +0 -0
  373. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/cli_project.py +0 -0
  374. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/cli_run.py +0 -0
  375. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/cli_scene.py +0 -0
  376. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/cli_tools.py +0 -0
  377. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/cli_video.py +0 -0
  378. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/composition.py +0 -0
  379. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/config.py +0 -0
  380. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/data/__init__.py +0 -0
  381. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/data/chain_repo.py +0 -0
  382. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
  383. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
  384. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
  385. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
  386. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
  387. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
  388. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/data/migrations/0007_queue.sql +0 -0
  389. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/data/migrations/0008_add_operation_expanded_prompt.sql +0 -0
  390. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/data/migrations/0009_queue_claims.sql +0 -0
  391. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
  392. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/data/models.py +0 -0
  393. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/data/queries.py +0 -0
  394. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/data/recorder.py +0 -0
  395. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/data/redaction.py +0 -0
  396. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/data/repository.py +0 -0
  397. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/data/store.py +0 -0
  398. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/diagnostics.py +0 -0
  399. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/errors.py +0 -0
  400. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/exceptions.py +0 -0
  401. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/image_batch.py +0 -0
  402. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/json_output.py +0 -0
  403. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/mcp/__init__.py +0 -0
  404. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/mcp/prompts.py +0 -0
  405. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/mcp/resources.py +0 -0
  406. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/mcp/server.py +0 -0
  407. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/mcp/tasks_extension.py +0 -0
  408. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/mcp/tools.py +0 -0
  409. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/media.py +0 -0
  410. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/movie_manifest.py +0 -0
  411. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/observability.py +0 -0
  412. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/paths.py +0 -0
  413. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/profile_lease.py +0 -0
  414. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/profile_store.py +0 -0
  415. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/redaction.py +0 -0
  416. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/services/__init__.py +0 -0
  417. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/services/character_create.py +0 -0
  418. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/services/mentions.py +0 -0
  419. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/storage.py +0 -0
  420. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/tools/__init__.py +0 -0
  421. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/tools/banned.py +0 -0
  422. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/tools/builtin/__init__.py +0 -0
  423. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/tools/builtin/creative-director.toml +0 -0
  424. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/tools/builtin/reverse-engineer.toml +0 -0
  425. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/tools/builtin/storyboard.toml +0 -0
  426. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/tools/expander.py +0 -0
  427. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/tools/invocation.py +0 -0
  428. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/tools/loader.py +0 -0
  429. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/tools/registry.py +0 -0
  430. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/tools/runtime.py +0 -0
  431. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/tools/spec.py +0 -0
  432. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/ui/app.py +0 -0
  433. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/ui/server.py +0 -0
  434. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/worker/codec.py +0 -0
  435. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/worker/daemon.py +0 -0
  436. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/src/gflow_cli/worker/queue.py +0 -0
  437. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/test_assets/sample_batch.json +0 -0
  438. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/test_assets/sample_batch.tsv +0 -0
  439. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/test_assets/sample_batch_invalid.tsv +0 -0
  440. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/__init__.py +0 -0
  441. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/__init__.py +0 -0
  442. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/fixtures/character_gen_response.json +0 -0
  443. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/fixtures/patch_entity_response.json +0 -0
  444. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/test_aisandbox_auth_error.py +0 -0
  445. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
  446. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/test_bearer_redaction.py +0 -0
  447. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/test_character.py +0 -0
  448. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/test_client.py +0 -0
  449. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/test_client_character.py +0 -0
  450. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/test_client_delete_characters.py +0 -0
  451. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/test_client_errors.py +0 -0
  452. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/test_client_generate_character.py +0 -0
  453. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/test_client_image.py +0 -0
  454. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/test_client_incidents.py +0 -0
  455. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/test_client_launch_kwargs.py +0 -0
  456. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/test_client_patch_entity.py +0 -0
  457. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/test_client_scene.py +0 -0
  458. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/test_client_upscale.py +0 -0
  459. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/test_concurrency.py +0 -0
  460. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/test_dto.py +0 -0
  461. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/test_engine.py +0 -0
  462. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/test_image.py +0 -0
  463. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/test_image_dto.py +0 -0
  464. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/test_image_upscale.py +0 -0
  465. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/test_post_json_aisandbox_auth.py +0 -0
  466. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/test_recaptcha.py +0 -0
  467. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/test_retry.py +0 -0
  468. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/test_routes.py +0 -0
  469. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/test_routes_character.py +0 -0
  470. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/test_routes_scene.py +0 -0
  471. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/test_sapisidhash_helper.py +0 -0
  472. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/test_scene_models.py +0 -0
  473. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/test_video.py +0 -0
  474. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/test_video_request.py +0 -0
  475. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/transports/__init__.py +0 -0
  476. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/transports/conftest.py +0 -0
  477. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/transports/drivers/__init__.py +0 -0
  478. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/transports/drivers/test_agentic.py +0 -0
  479. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/transports/drivers/test_classic.py +0 -0
  480. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/transports/drivers/test_factory.py +0 -0
  481. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/transports/drivers/test_ui_mode.py +0 -0
  482. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/transports/test_agentic_cohort_detection.py +0 -0
  483. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/transports/test_base.py +0 -0
  484. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/transports/test_bearer.py +0 -0
  485. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/transports/test_common.py +0 -0
  486. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
  487. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/transports/test_factory.py +0 -0
  488. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/transports/test_fingerprint.py +0 -0
  489. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/transports/test_mode_control.py +0 -0
  490. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/transports/test_sapisidhash.py +0 -0
  491. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/transports/test_selector_symmetry.py +0 -0
  492. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/transports/test_transport_timeout.py +0 -0
  493. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/transports/test_ui_automation.py +0 -0
  494. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/transports/test_ui_automation_batch.py +0 -0
  495. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
  496. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/transports/test_ui_automation_video.py +0 -0
  497. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/api/transports/test_ui_character_editor.py +0 -0
  498. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/auth/strategies/test_factory.py +0 -0
  499. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/auth/strategies/test_strategies.py +0 -0
  500. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/auth/test_cookies.py +0 -0
  501. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/auth/test_real_chrome.py +0 -0
  502. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/auth/test_verification.py +0 -0
  503. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/autopilot/test_pr_triage_autopilot.py +0 -0
  504. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/cli/__init__.py +0 -0
  505. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/cli/test_cli_auth_list.py +0 -0
  506. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/cli/test_cli_character.py +0 -0
  507. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/cli/test_cli_character_create.py +0 -0
  508. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/cli/test_cli_data.py +0 -0
  509. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/cli/test_cli_data_errors.py +0 -0
  510. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/cli/test_cli_data_errors_retention.py +0 -0
  511. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/cli/test_cli_image.py +0 -0
  512. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
  513. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/cli/test_cli_image_selector_drift.py +0 -0
  514. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/cli/test_cli_image_upscale.py +0 -0
  515. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/cli/test_cli_image_uuid_ref_enrichment.py +0 -0
  516. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/cli/test_cli_instructions.py +0 -0
  517. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/cli/test_cli_models.py +0 -0
  518. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/cli/test_cli_movie.py +0 -0
  519. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/cli/test_cli_run.py +0 -0
  520. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/cli/test_cli_scene.py +0 -0
  521. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/cli/test_cli_tools.py +0 -0
  522. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/cli/test_cli_video.py +0 -0
  523. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/cli/test_cli_video_chain.py +0 -0
  524. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/cli/test_error_handling.py +0 -0
  525. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/cli/test_failure_funnel.py +0 -0
  526. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/cli/test_helpers.py +0 -0
  527. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/cli/test_incident_output.py +0 -0
  528. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/cli/test_movie_manifest.py +0 -0
  529. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/cli/test_movie_manifest_style_variants.py +0 -0
  530. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/cli/test_predictable_output.py +0 -0
  531. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/cli/test_settings_validation.py +0 -0
  532. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
  533. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/composition/test_character.py +0 -0
  534. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/composition/test_compose_prompt.py +0 -0
  535. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/composition/test_handoff.py +0 -0
  536. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/composition/test_style_variants.py +0 -0
  537. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/composition/test_style_variants_e2e.py +0 -0
  538. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/conftest.py +0 -0
  539. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/data/__init__.py +0 -0
  540. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/data/test_chain_repo.py +0 -0
  541. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/data/test_failure_recording.py +0 -0
  542. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/data/test_find_incomplete_character.py +0 -0
  543. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/data/test_models.py +0 -0
  544. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/data/test_packaging.py +0 -0
  545. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/data/test_recorder.py +0 -0
  546. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/data/test_recorder_character.py +0 -0
  547. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/data/test_redaction.py +0 -0
  548. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/data/test_repository.py +0 -0
  549. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/data/test_scene_persistence.py +0 -0
  550. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/data/test_settings_and_errors.py +0 -0
  551. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/data/test_store_migrations.py +0 -0
  552. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/dev/test_recording_client.py +0 -0
  553. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/e2e/__init__.py +0 -0
  554. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/e2e/conftest.py +0 -0
  555. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/e2e/test_agentic_count_enforcement_e2e.py +0 -0
  556. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
  557. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/e2e/test_asset_tagging_e2e.py +0 -0
  558. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
  559. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/e2e/test_cancellation_e2e.py +0 -0
  560. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/e2e/test_chain_e2e.py +0 -0
  561. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/e2e/test_character_create_e2e.py +0 -0
  562. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/e2e/test_classic_count_setter_e2e.py +0 -0
  563. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/e2e/test_crash_recovery_e2e.py +0 -0
  564. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/e2e/test_daemon_e2e.py +0 -0
  565. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/e2e/test_data_layer_e2e.py +0 -0
  566. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/e2e/test_entity_provenance_e2e.py +0 -0
  567. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/e2e/test_entity_smuggling_e2e.py +0 -0
  568. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/e2e/test_i2v_flags_e2e.py +0 -0
  569. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/e2e/test_image_batch_e2e.py +0 -0
  570. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
  571. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/e2e/test_image_uuid_ref_e2e.py +0 -0
  572. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/e2e/test_incident_quality_e2e.py +0 -0
  573. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/e2e/test_json_output_e2e.py +0 -0
  574. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/e2e/test_live_agentic_instructions.py +0 -0
  575. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
  576. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/e2e/test_project_naming_e2e.py +0 -0
  577. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/e2e/test_scene_compose_live.py +0 -0
  578. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/e2e/test_tools_e2e.py +0 -0
  579. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/e2e/test_transports_e2e.py +0 -0
  580. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
  581. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
  582. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/features/__init__.py +0 -0
  583. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/features/asset_tagging.feature +0 -0
  584. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/features/auth.feature +0 -0
  585. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/features/auth_login.feature +0 -0
  586. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/features/character_create.feature +0 -0
  587. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/features/character_read.feature +0 -0
  588. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/features/conftest.py +0 -0
  589. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/features/duration_tab_drift.feature +0 -0
  590. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/features/entity_provenance.feature +0 -0
  591. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/features/image.feature +0 -0
  592. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/features/image_batch_references.feature +0 -0
  593. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/features/image_upscale.feature +0 -0
  594. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/features/incident_diagnostics.feature +0 -0
  595. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/features/instructions.feature +0 -0
  596. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/features/locale_picker_include.feature +0 -0
  597. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/features/mcp_tasks.feature +0 -0
  598. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/features/output_hardening.feature +0 -0
  599. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/features/test_asset_tagging_steps.py +0 -0
  600. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/features/test_auth_login_steps.py +0 -0
  601. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/features/test_auth_steps.py +0 -0
  602. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/features/test_character_create_steps.py +0 -0
  603. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/features/test_character_read_steps.py +0 -0
  604. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/features/test_image_steps.py +0 -0
  605. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/features/test_image_upscale_steps.py +0 -0
  606. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/features/test_incident_diagnostics_steps.py +0 -0
  607. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/features/test_instructions_steps.py +0 -0
  608. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/features/test_locale_picker_include_steps.py +0 -0
  609. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/features/test_mcp_tasks_steps.py +0 -0
  610. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/features/test_output_hardening_steps.py +0 -0
  611. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/features/test_step_collision_guard.py +0 -0
  612. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/features/test_video_agent_ui_steps.py +0 -0
  613. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/features/test_video_chain_steps.py +0 -0
  614. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/features/video_agent_ui.feature +0 -0
  615. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/features/video_chain.feature +0 -0
  616. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/fixtures/__init__.py +0 -0
  617. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/fixtures/seeded_catalog.py +0 -0
  618. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/image_batch/__init__.py +0 -0
  619. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/image_batch/test_image_manifest.py +0 -0
  620. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/image_batch/test_jitter_config.py +0 -0
  621. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/image_batch/test_observability_events.py +0 -0
  622. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/integration/__init__.py +0 -0
  623. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/integration/conftest.py +0 -0
  624. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/integration/constants.py +0 -0
  625. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/integration/test_expander_gateway.py +0 -0
  626. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/integration/test_storage_gcs.py +0 -0
  627. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/integration/test_storage_s3.py +0 -0
  628. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/mcp/__init__.py +0 -0
  629. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/mcp/conftest.py +0 -0
  630. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/mcp/test_cli_parity.py +0 -0
  631. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/mcp/test_server.py +0 -0
  632. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/mcp/test_stdio_transport.py +0 -0
  633. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/mcp/test_tasks_extension.py +0 -0
  634. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/mcp/test_tools_helpers.py +0 -0
  635. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/mcp/test_tools_instructions.py +0 -0
  636. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/mcp/test_tools_wired.py +0 -0
  637. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
  638. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
  639. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/scripts/test_check_materiality.py +0 -0
  640. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/scripts/test_check_release_artifacts.py +0 -0
  641. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/scripts/test_check_repo_hygiene.py +0 -0
  642. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/scripts/test_check_website_docs_pii.py +0 -0
  643. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/scripts/test_codex_plugin.py +0 -0
  644. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/scripts/test_generate_website_docs.py +0 -0
  645. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/scripts/test_incident_bundle_quality.py +0 -0
  646. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/scripts/test_materiality_backtest.py +0 -0
  647. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/services/__init__.py +0 -0
  648. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/services/test_character_create_redaction.py +0 -0
  649. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/services/test_character_create_saga.py +0 -0
  650. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
  651. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/services/test_mentions_observability.py +0 -0
  652. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/services/test_mentions_parse.py +0 -0
  653. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/services/test_mentions_resolve.py +0 -0
  654. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/services/test_resolve_and_apply.py +0 -0
  655. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/smoke/__init__.py +0 -0
  656. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/smoke/test_profile_account_smoke.py +0 -0
  657. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/smoke/test_real_flow.py +0 -0
  658. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/test_auth.py +0 -0
  659. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/test_browser_manager.py +0 -0
  660. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/test_chain.py +0 -0
  661. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/test_chain_manifest.py +0 -0
  662. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/test_cli_data.py +0 -0
  663. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/test_cli_project.py +0 -0
  664. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/test_config.py +0 -0
  665. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/test_conftest_isolation.py +0 -0
  666. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/test_data_queries.py +0 -0
  667. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/test_diagnostics_bundle.py +0 -0
  668. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/test_diagnostics_events.py +0 -0
  669. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/test_diagnostics_journal.py +0 -0
  670. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/test_diagnostics_recorder.py +0 -0
  671. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/test_diagnostics_retention.py +0 -0
  672. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/test_diagnostics_sanitize.py +0 -0
  673. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/test_documentation_gate.py +0 -0
  674. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/test_duration_tab_drift.py +0 -0
  675. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/test_entity_provenance.py +0 -0
  676. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/test_errors.py +0 -0
  677. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/test_errors_classification.py +0 -0
  678. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/test_image_batch_references.py +0 -0
  679. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/test_json_output.py +0 -0
  680. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/test_marker_registry.py +0 -0
  681. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/test_media.py +0 -0
  682. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/test_observability.py +0 -0
  683. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/test_paths.py +0 -0
  684. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/test_profile_lease.py +0 -0
  685. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/test_profile_lease_subprocess.py +0 -0
  686. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/test_profile_store.py +0 -0
  687. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/test_self_documenting_errors.py +0 -0
  688. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/test_smoke.py +0 -0
  689. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/tools/__init__.py +0 -0
  690. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/tools/test_banned.py +0 -0
  691. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/tools/test_expander.py +0 -0
  692. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/tools/test_invocation.py +0 -0
  693. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/tools/test_loader.py +0 -0
  694. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/tools/test_registry.py +0 -0
  695. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/tools/test_runtime.py +0 -0
  696. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/tools/test_spec.py +0 -0
  697. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/ui/test_app.py +0 -0
  698. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/worker/test_codec.py +0 -0
  699. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/worker/test_daemon.py +0 -0
  700. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/worker/test_mcp_daemon_race.py +0 -0
  701. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/worker/test_queue.py +0 -0
  702. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/worker/test_queue_multiprocess.py +0 -0
  703. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/tests/worker/test_queue_reconciliation.py +0 -0
  704. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/website/docs/ARCHITECTURE.md +0 -0
  705. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/website/docs/AUTHENTICATION.md +0 -0
  706. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/website/docs/CHARACTER.md +0 -0
  707. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/website/docs/CONFIGURATION.md +0 -0
  708. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/website/docs/DATA_LAYER.md +0 -0
  709. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/website/docs/DEBUGGING.md +0 -0
  710. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/website/docs/DEVELOPMENT.md +0 -0
  711. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/website/docs/E2E_TESTING.md +0 -0
  712. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/website/docs/EXTERNAL_STORAGE.md +0 -0
  713. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/website/docs/INSTRUCTIONS.md +0 -0
  714. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/website/docs/KNOWN_ISSUES.md +0 -0
  715. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/website/docs/MCP.md +0 -0
  716. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/website/docs/MOVIE.md +0 -0
  717. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/website/docs/PROMPT_EXPANSION.md +0 -0
  718. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/website/docs/TOOLS.md +0 -0
  719. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/website/docs/USAGE.md +0 -0
  720. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/website/docs/USER_GUIDE.md +0 -0
  721. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/website/docs/agents.md +0 -0
  722. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/website/docs/index.md +0 -0
  723. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/website/docs/installation.md +0 -0
  724. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/website/docs/onboarding-mockup.html +0 -0
  725. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/website/docs/onboarding.md +0 -0
  726. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/website/docs/stylesheets/extra.css +0 -0
  727. {gflow_cli-0.53.0 → gflow_cli-0.54.0}/website/mkdocs.yml +0 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gflow",
3
- "version": "0.53.0",
3
+ "version": "0.54.0",
4
4
  "description": "Reusable development and operations workflows for gflow-cli",
5
5
  "author": {
6
6
  "name": "Flavio Oliva",
@@ -51,14 +51,42 @@ updates:
51
51
  # `groups` unless a group sets `applies-to: security-updates`, so an advisory
52
52
  # fix still opens immediately on its own instead of waiting for Monday.
53
53
  ignore:
54
- # playwright minors are gated by the `<1.60.0` upper bound in
55
- # pyproject.toml, not by this rule — an untested driver minor silently
56
- # wedged video generation (see the bound's comment). This entry keeps
57
- # majors out even if that bound is ever widened. Raising playwright is a
58
- # deliberate, live-verified act; the weekly `deps-watch` workflow reports
59
- # how far behind the pin has drifted so it does not freeze unnoticed.
54
+ # playwright MINORS must be ignored here. They are NOT gated by the
55
+ # `<1.62.0` upper bound in pyproject.toml -- that was the assumption this
56
+ # rule used to state, and PR #465 falsified it. The "uv" ecosystem does
57
+ # not respect a constraint standing in an update's way, it REWRITES it:
58
+ # #465 widened `playwright>=1.61.0,<1.62.0` to `<1.63.0` and locked
59
+ # 1.62.0 -- the exact version observed hanging every `video i2v` right
60
+ # after the frame upload (see the bound's comment in pyproject.toml).
61
+ # Only tests/test_playwright_pin.py stopped it, and on its way out it
62
+ # red-lighted the whole grouped weekly batch.
63
+ #
64
+ # PATCH bumps stay allowed on purpose: the 1.61.x headroom exists so a
65
+ # driver CVE fix does not require a gflow release. Raising a MINOR is a
66
+ # deliberate, live-verified act (AGENTS.md "verify before you act") and
67
+ # also means hand-editing SUPPORTED_PLAYWRIGHT_RANGE in
68
+ # src/gflow_cli/api/transports/ui_automation_video.py, which no bot can
69
+ # do -- so a bot-authored minor bump can never be mergeable here anyway.
70
+ # The weekly `deps-watch` workflow reports how far behind the pin has
71
+ # drifted so it does not freeze unnoticed.
60
72
  - dependency-name: "playwright"
61
- update-types: ["version-update:semver-major"]
73
+ update-types:
74
+ - "version-update:semver-major"
75
+ - "version-update:semver-minor"
76
+ # patchright is the SAME hazard with a bigger blast radius, and the exact
77
+ # `==` pin protects it no better than playwright's upper bound protected
78
+ # playwright -- an exact pin is just another constraint for the "uv"
79
+ # ecosystem to rewrite. It ships a PATCHED Chromium driver that loads the
80
+ # real Google session (cookies, OAuth Bearer, SAPISID), so docs/SECURITY.md
81
+ # requires every bump to get a security review and explicitly says it is
82
+ # "NOT a routine dependabot auto-merge". That was prose with nothing
83
+ # enforcing it; this is the enforcement. ALL update-types, patch included:
84
+ # any version change moves the browser binary underneath the user.
85
+ - dependency-name: "patchright"
86
+ update-types:
87
+ - "version-update:semver-major"
88
+ - "version-update:semver-minor"
89
+ - "version-update:semver-patch"
62
90
 
63
91
  # GitHub Actions
64
92
  - package-ecosystem: "github-actions"
@@ -66,7 +66,7 @@ jobs:
66
66
  # Unlike the step above, this ignores our constraints and reports the
67
67
  # true latest on PyPI — so a package frozen by one of OUR upper bounds
68
68
  # shows up here and nowhere else. This is the expiry alarm for those
69
- # bounds: `playwright>=1.59.0,<1.60.0` is deliberate (an untested driver
69
+ # bounds: `playwright>=1.61.0,<1.62.0` is deliberate (an untested driver
70
70
  # silently wedged video generation — see the comment in pyproject.toml),
71
71
  # but a deliberate pin still needs a periodic "how stale is it now?"
72
72
  # signal, and raising it requires a live-verified generation first.
@@ -15,7 +15,7 @@ jobs:
15
15
  runs-on: ubuntu-latest
16
16
  steps:
17
17
  - name: Triage external pull request
18
- uses: actions/github-script@v7
18
+ uses: actions/github-script@v9
19
19
  with:
20
20
  script: |
21
21
  const pr = context.payload.pull_request;
@@ -37,7 +37,7 @@ jobs:
37
37
  runs-on: ubuntu-latest
38
38
  steps:
39
39
  - name: Create or update labels
40
- uses: actions/github-script@v7
40
+ uses: actions/github-script@v9
41
41
  with:
42
42
  script: |
43
43
  // Every label referenced by .github/dependabot.yml. Keep in sync.
@@ -7,6 +7,27 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.54.0] — 2026-08-12
11
+
12
+ ### Changed
13
+
14
+ - **Clearer close-the-browser guidance in `gflow auth login` (#470).** Reworded the final passive-capture step in `real_chrome.py` from the abrupt "CLOSE THE BROWSER" command into plain-language guidance: closing the Chrome window is how you signal you're done, after which gflow verifies the Flow session automatically. No behavior change — the manual close stays required on the real-Chrome path, because Chrome holds an exclusive lock on its cookie store while running (verified empirically), so gflow cannot auto-detect completion there without breaking the zero-automation-surface stealth model.
15
+ - **Overlay/watermark detection hardened to pure structural selectors.** Council-review cleanup of `ui_automation.py`: enforced 100% language-agnostic structural anchors, removed text-label hacks and dead aliases, and fixed a stale test assertion — strengthens the #403 release-modal dismissal across localized profiles.
16
+
17
+ ### Fixed
18
+
19
+ - **Dependabot could re-offer the known-bad playwright 1.62.0 every Monday (#465).** The `uv` ecosystem does not respect a version bound standing in an update's way — it **rewrites** it, so the deliberate `playwright>=1.61.0,<1.62.0` bound in `pyproject.toml` never gated Dependabot as `.github/dependabot.yml` claimed. PR #465 widened it to `<1.63.0` and locked 1.62.0, the exact version documented as hanging every `video i2v` right after the frame upload. Dependabot now ignores playwright `semver-minor` alongside `semver-major` (patch bumps stay allowed so a driver CVE fix needs no gflow release), guarded by `tests/test_playwright_pin.py::test_dependabot_ignores_playwright_minor_bumps`.
20
+ - **`patchright` was exposed to the same bug, with a bigger blast radius.** Its exact `==` pin is just another constraint the `uv` ecosystem can rewrite, so `docs/SECURITY.md`'s "a Patchright version change is NOT a routine dependabot auto-merge" was prose with nothing enforcing it. Dependabot now ignores **all** patchright update-types (any version change moves the patched Chromium driver — which loads the real Google session — underneath the user), guarded by `test_dependabot_ignores_driver_engine_bumps`. Also corrected the stale pin cited in `docs/SECURITY.md` (`1.60.1` → `1.61.2`) and the stale playwright range in `.github/workflows/deps-watch.yml`.
21
+ - **Character-composer focus isolation.** `_submit_body_prompt` now preserves the locator-scoped `press_sequentially`, keeping correct focus during character-composer submission.
22
+
23
+ ### Security
24
+
25
+ - **Timing-jitter entropy now uses a cryptographically-strong RNG (SonarCloud S2245).** The `_jitter_ms` interaction-delay humanization helper draws from `secrets.SystemRandom` instead of the standard `random` module, so the jitter entropy is not predictable.
26
+
27
+ ## [0.53.1] — 2026-08-06
28
+
29
+ - Re-release of 0.53.0 (version bump only; recorded headed live-verification evidence). No functional changes.
30
+
10
31
  ## [0.53.0] — 2026-08-06
11
32
 
12
33
  ### Added
@@ -2753,7 +2774,9 @@ shell-script template that branches on these codes.
2753
2774
 
2754
2775
  First skeleton. Not functional end-to-end yet.
2755
2776
 
2756
- [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.53.0...HEAD
2777
+ [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.54.0...HEAD
2778
+ [0.54.0]: https://github.com/ffroliva/gflow-cli/compare/v0.53.1...v0.54.0
2779
+ [0.53.1]: https://github.com/ffroliva/gflow-cli/compare/v0.53.0...v0.53.1
2757
2780
  [0.53.0]: https://github.com/ffroliva/gflow-cli/compare/v0.52.0...v0.53.0
2758
2781
  [0.52.0]: https://github.com/ffroliva/gflow-cli/compare/v0.51.0...v0.52.0
2759
2782
  [0.51.0]: https://github.com/ffroliva/gflow-cli/compare/v0.50.0...v0.51.0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: gflow-cli
3
- Version: 0.53.0
3
+ Version: 0.54.0
4
4
  Summary: Unofficial CLI for Google Flow — drive Veo image-to-video generations from the terminal.
5
5
  Project-URL: Homepage, https://github.com/ffroliva/gflow-cli
6
6
  Project-URL: Issues, https://github.com/ffroliva/gflow-cli/issues
@@ -58,7 +58,7 @@ Requires-Dist: numpy>=1.24; extra == 'dev'
58
58
  Requires-Dist: pyright>=1.1.0; extra == 'dev'
59
59
  Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
60
60
  Requires-Dist: pytest>=8.0.0; extra == 'dev'
61
- Requires-Dist: ruff==0.16.1; extra == 'dev'
61
+ Requires-Dist: ruff==0.16.2; extra == 'dev'
62
62
  Provides-Extra: gcs
63
63
  Requires-Dist: gcsfs>=2024.2.0; extra == 'gcs'
64
64
  Requires-Dist: universal-pathlib>=0.2.5; extra == 'gcs'
@@ -135,7 +135,7 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
135
135
  **"A command failed — where is the incident bundle and what's in it?"** → [DEBUGGING § Automatic incident bundles](DEBUGGING.md#automatic-incident-bundles) (layout, triggers, review-before-sharing); privacy boundaries: [SECURITY § Automatic incident bundles](SECURITY.md#automatic-incident-bundles-gflow_cli_incident_capture-default-on); disable via [CONFIGURATION § GFLOW_CLI_INCIDENT_CAPTURE](CONFIGURATION.md#gflow_cli_incident_capture)
136
136
  **"Flow's UI broke a selector — how do I diagnose it?"** → [DEBUGGING § Inspecting Flow's live UI](DEBUGGING.md#inspecting-flows-live-ui)
137
137
  **"What does each `ui_automation.*` log event mean?"** → [DEBUGGING § Listener & HTTP-layer debugging](DEBUGGING.md#listener--http-layer-debugging)
138
- **What was actually live-verified for the latest release?** → latest: [LIVE_VERIFICATION_v0.52.0](LIVE_VERIFICATION_v0.52.0.md) (**batch DAG references #317, character entity provenance recording #402, and video duration selector cascade fix #451 live-verified 2026-08-05** — 3/3 live E2E tests in `tests/e2e/test_entity_provenance_e2e.py` passed clean on profile `ffroliva`, 5-layer evidence ledger verified). Prior: [v0.51.0](LIVE_VERIFICATION_v0.51.0.md) (**dependency/security/test-correctness release verified 2026-08-05, 1 Imagen credit + 1 Veo attempt** — the only change needing live evidence was the `playwright` bound raise `>=1.59.0,<1.60.0` → `>=1.61.0,<1.62.0`, and the 2026-08-03 regression does NOT reproduce on 1.61.0: a live i2v drove `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. `-m e2e_auth` 16/16, daemon e2e 1 passed [MCP over Streamable HTTP — the first live coverage that test has ever had, it was structurally incapable of passing before], MCP Tasks 5/5 layers, 2923 offline tests, `pip-audit --all-extras` clean. **No finished mp4 is claimed** — Flow's own generation returned `PUBLIC_ERROR_VIDEO_GENERATION_TIMED_OUT`, server-side. Defect found and recorded not omitted: Flow dropped the duration-tab UI so **`--duration` is currently broken for i2v**, A/B-proven pre-existing on BOTH 1.59.0 and 1.61.0 — [#451](https://github.com/ffroliva/gflow-cli/issues/451)). Prior: [v0.50.0](LIVE_VERIFICATION_v0.50.0.md) (**MCP Tasks extension SEP-2663, non-blocking task handle responses, CLI/MCP output path hardening -o/--output, and Telegram PR triage alert resilience verified 2026-08-04** — 5-layer evidence ledger note generated at `tmp/live-verify/mcp-tasks.md` confirming instant task handle return, working status queries, and cancelled status DB state transitions; full 118-test suite green). Prior: [v0.49.0](LIVE_VERIFICATION_v0.49.0.md) (**#125 `omni-flash` start-frame I2V video generation, Playwright dependency upper-bound pin `>=1.59.0,<1.60.0`, submission stage watchdog timeout, and #404 count-tab fail-closed logic verified 2026-08-03** — 0-credit wire intercept captured `batchAsyncGenerateVideoStartImage` with `startImage` bound; live costed generation on `omni-flash` I2V produced a 1.2MB valid mp4 video asset on `ffroliva`; full 2902-test release suite green). Prior: [v0.48.0](LIVE_VERIFICATION_v0.48.0.md) (**#411 predictable `-o`/`--output` paths, offline-verified 2026-08-02, ZERO credits** — exact single-target local writes + `_1`/`_2` multi-count **image** suffixes proven by the CLI suite; the pre-tag council audit [RED, then resolved] re-scoped the release to the truthful surface: a dead MCP `output` param was deleted [worker queue never read it — #414], cloud `-o` targets and video multi-count suffixes are follow-ups [#415], and two tautological video-path tests are recorded as weak evidence rather than claimed as proof; storage-layer S3 writes verified against Docker MinIO at the layer level only; 2888-test release tree green; the live-Flow run aborted pre-generation on an expired denon82 session [`AuthExpiredError` 401, correct RFC-7807 contract + remediation hint, $0] — recorded, not omitted; live re-run queued for the next authenticated session). Prior: [v0.47.0](LIVE_VERIFICATION_v0.47.0.md) (**MCP SDK 2.0.0 migration + dual-era protocol + #402 entity provenance recording live-verified 2026-08-01, ZERO credits** — stdio JSON-RPC initialization handshake verified over subprocess transport, `resolve-drift` CI job added to prevent dependency drift, and 121 unit tests in `tests/data` passed). Prior: [v0.46.1](LIVE_VERIFICATION_v0.46.1.md) (**#404 classic count-setter fix live-verified 2026-07-31 on the reporter's exact environment, ZERO credits** — credit-free DOM recon proved Flow renamed the count-tab labels to uniform `xN` [`x1` replaces `1x`, image AND video rows], that `nth(0)` of the old filtered set landed on the selected `x2` and actively moved the count AWAY from the target, and that a digit-keyed click on `x1` converges instantly and persists without a Save commit; the new classic e2e then passed live [count=1 against a fresh project displaying 2 → exactly 1 image; count=2 early-exit → exactly 2], and the #313 agentic count-enforcement e2e passed 4/4 [counts 1–4 vs deliberately mismatched sticky defaults, magic-byte-verified downloads] after its stale setup was repaired [Flow now loads the editor in classic mode — the setup needed an Agent-pill toggle before the `tune` icon; test-only fix, no product code implicated]; the video output-count cascade carries a recorded waiver [full drive costs Veo credits; its exact selector shape was exercised live in the spike's cleanup step]). Prior: [v0.46.0](LIVE_VERIFICATION_v0.46.0.md) (**#387 provider-agnostic prompt-tools transport live-verified 2026-07-28, ZERO credits** — a four-probe capability spike passed 4/4 against BOTH a non-Google gateway and Google's OpenAI-compat endpoint, including a *semantic* multimodal check [a generated solid-red JPEG round-tripped and the model answered 'Red'], which is what proved the native Gemini `inlineData` path could be deleted outright rather than kept as a fallback; the real CLI then returned `was_expanded: true` on gateway/gateway-no-model/Google-default, emitted the loud one-time notice + no-op for the removed `GFLOW_CLI_GEMINI_API_KEY`, and made NO network call when unconfigured. Live verification caught two defects a fully green 2849-test offline suite missed: Google's compat endpoint has no server-side default model [`400 "model is not specified"`, silently no-oping the DEFAULT configuration], and the first redirect guard did not actually work because `build_opener()` installs its default handlers regardless of arguments, so `Authorization` would still have been replayed cross-host. `/code-review high` is recorded as NOT run — it is user-triggered only). Prior: [v0.45.0](LIVE_VERIFICATION_v0.45.0.md) (**#393 UUID `--ref` binding + #395 character-entity binding live-verified 2026-07-27/28** — a controlled A/B on identical input flipped `--ref` from exit 9 to exit 0 via the catalog-backed upload fallback, with the anti-silence guard [an unbindable ref aborts non-zero and writes no image] pinned by a live e2e; picker DOM + HAR showed Flow indexes a short auto-caption, NOT the prompt, so a prompt-derived search hint was dropped rather than shipped on assumption; a CDP spike against Flow's own character flow then captured the `entityContext` contract that gflow's generations were missing, root-causing #395 to two gflow defects [overlay dismissal Escaping Flow's own composer, and a character-route bounce that sent the prompt to the project composer] — both fixed, both character e2e tests now pass live, including `--format-prompt` [#383], with a read-back confirming the character carries its name and `thumbnail_media_id`). Prior: [v0.44.0](LIVE_VERIFICATION_v0.44.0.md) (**#381 dual-side project management & Playwright Chromium transport live-verified 2026-07-26** — real-editor project creation + rename tRPC server/DOM sync, prompt slugging, `gflow project` subcommand family, HTTP 429 adaptive backoff, and full E2E test suite). Prior: [v0.43.0](LIVE_VERIFICATION_v0.43.0.md) (**private incident diagnostics live-verified 2026-07-23, 1 Veo credit**). Prior: [v0.42.0](LIVE_VERIFICATION_v0.42.0.md) (**#361 production-readiness live-gaps confirmed live 2026-07-21, 1 Veo credit** — a real `veo-lite` t2v through the worker path persisted a real `remote_started` checkpoint [observer→checkpoint→DB chain confirmed], crash-recovery classified the task `indeterminate` without resubmitting, and mid-launch cancellation released the `ProfileLease` credit-free; full evidence in [v0.40.0-production-readiness § "2026-07-21 live follow-up"](LIVE_VERIFICATION_v0.40.0-production-readiness.md#2026-07-21-live-follow-up-0420-cycle); #359 content-safety `400`→`ContentPolicyError` classification is unit-covered, not live-triggered [would require a deliberate policy violation]; #360/#362 are docs-only, verified by the documentation gates). Prior: [v0.41.0](LIVE_VERIFICATION_v0.41.0.md) (**#357 production-readiness hardening — stale-session fail-fast, free image gen, paid veo-lite T2V all proven live**). Prior: [v0.40.0](LIVE_VERIFICATION_v0.40.0.md) (**#344 `@`-mention asset-tagging resolution proven live e2e, ~2 Imagen credits** — `gflow character create` staged a real taggable character [bound reference images, `has_reference_images` guard], the e2e test's documented propagation wait cleared Flow's `projectInitialData` lag, and `gflow image t2i "@Zoro …"` passed with returncode 0, a real generated image, and the correctly de-tagged prompt in the catalog — no code changes needed, `resolve_and_apply` as merged in #344 already works end-to-end; pre-existing unrelated issue #174 [Flow media-library A/B flake] can still intermittently block generation regardless of this feature — recorded, not omitted). Prior: [v0.39.0](LIVE_VERIFICATION_v0.39.0.md) (**#341 failed-generation persistence proven live** — a real `image t2i` on denon82 failed at the wire [`batchGenerateImages` HTTP 400 → `WireFormatError`] and the record-on-catch funnel wrote the **first-ever `failed` row** into the production catalog [`error_type=wire-format`, redacted `error_detail`, browsable via `gflow data list errors`], **$0**; the remaining paid paths [video/chain/batch/movie/worker] are funnel-regression-tested, not force-failed live [would cost credits], and the status-aware `succeeded=false` video-poll fix is unit-locked — recorded, not omitted). Prior: [v0.38.1](LIVE_VERIFICATION_v0.38.1.md) (**#338 agentic-pin recovery proven live ON the pinned account** — run 1 caught the composer-render race the unit suite could not [`ensure_media_incomplete` +115 ms, toggle never reached]; the readiness-wait fix landed and run 2 recovered classic on denon82 after ~2h of pin [`ui_driver.bound mode=classic`, real 768×1376 JPEG, exact prompt adherence]; reload branch unit-locked, live trigger not observed this cycle — recorded, not omitted). Prior: [v0.38.0](LIVE_VERIFICATION_v0.38.0.md) (**#332 mode control + #314 i2i ref dedup proven live e2e** — `image t2i --ui-mode classic` recovered agentic→classic in a real run [`ui_mode.attempt_exit_agent` → full classic chain, 1376×768 JPEG]; two identical `image i2i` runs proved the dedup contract [run 1: picker miss → `image_uploaded`; run 2: `reference_deduped_by_filename`, ZERO uploads]; `video t2v` veo-fast [`MEDIA_GENERATION_STATUS_SUCCESSFUL`, 15.2 MB `ftyp` mp4]; autopilot #333 recorded deferred-with-reason [hermes-ops deployment staged separately]). Prior: [v0.37.0](LIVE_VERIFICATION_v0.37.0.md) (**viewport 1920×1080 + agentic count enforcement + FIPS-safe SAPISIDHASH proven live e2e** — `image t2i` [classic cohort, real 1376×768 JPEG] and `video t2v` veo-fast [`MEDIA_GENERATION_STATUS_SUCCESSFUL`, 11.5 MB `ftyp` mp4] both succeeded end-to-end at the new 1920×1080 viewport with every selector resolving [no drift]; SAPISIDHASH digest verified byte-identical [FIPS-safe `usedforsecurity=False`], auth unchanged). Prior: [v0.36.0](LIVE_VERIFICATION_v0.36.0.md) (**#316 diagnostic tooling live-verified against real Flow traffic** — `GFLOW_CLI_HAR_PATH` captured a real 54-entry HAR [real Flow domains, 34× 200s, and a genuine 401 the tool exists to diagnose]; `GFLOW_CLI_DEBUG_TRACEBACK`'s typed-error scoping confirmed live [console output identical with/without the flag on a `GFlowError`]; unhandled-path behavior covered by 6 new tests (30 total across both files) + SDD task review; #312 reference-entity-smuggling fix covered by its own dedicated e2e test). Prior: [v0.35.0](LIVE_VERIFICATION_v0.35.0.md) (**#305-follow-up multimodal reverse-engineering & storyboard tool proven live e2e** — `gflow tools run storyboard` successfully deconstructed a cyberpunk scene into a cohesive 4-panel sequence; `reverse-engineer` tool extracts frames from video streams/URLs using `claude-video`'s `watch.py` and produces structured prompt components using Gemini multimodal models; dynamic token budgeting and strict Pyright types verified via test suite). Prior: [v0.34.0](LIVE_VERIFICATION_v0.34.0.md) (**#299 `--ui-mode` gate proven live, ZERO credits** — drove `get_ui_driver` directly over 4 real editor loads, never generated: bidirectional switch works [classic→agentic via `_force_agent_mode`, agentic→classic via `_exit_agent_mode`, each DOM-reverified], `agentic`-when-already-agentic is idempotent, and a timed-out toggle → **exit-28 fail-fast before submission**; deprecation behavior-change [`prefer_classic`→exit 28] confirmed). Prior: [v0.33.0](LIVE_VERIFICATION_v0.33.0.md) (**#287-follow-up picker fix proven live on the original repro** — the v0.32.1-failing `i2v <uuid> --project <crowded>` command now exits 0 with a real 3.0 MB `ftyp` mp4, `frame_ref_attached` + `video_saved`, zero uploads; **#241 jitter live-verified on both paths** — flag `--jitter 4-6` → `batch_jitter_sleep seconds=4.98`, and the new 0.5–1.5 s default → `seconds=1.47`, each firing exactly once between two t2i submissions; environment note: the denon82 cohort is now natively agentic and round-2 generations hit the pre-existing #281 `MediaAttributionError`, not a regression). Prior: [v0.32.1](LIVE_VERIFICATION_v0.32.1.md) (**#293 teardown fix live-verified credit-free** — error-path aborts leave ZERO chrome.exe holding the profile [3× leak reproduced pre-fix same day]; force-close fallback + ProfileLockedError translation unit-pinned; #283 wave logic fixes mock-verified to exact call counts). Prior: [v0.32.0](LIVE_VERIFICATION_v0.32.0.md) (**#287 UUID i2v frames proven live e2e** — an in-project asset selected by media UUID in the frame-slot dialog [frame_ref_attached, startImage bound on the wire, ZERO upload events] produced a real 720×1280 interpolation, resolving the #237 negative prior; foreign UUID → exit 9 pre-generation with screenshot; **#288 duration fail-fast proven live** — exit 23 pre-submit saved a 10-credit generation, and the debug screenshot confirmed the duration control is ABSENT from the cohort's settings popover [locale hypothesis refuted]; upload-400 exit-27 repro deferred-with-reason — the original rejected JPEG no longer exists). Prior: [v0.31.0](LIVE_VERIFICATION_v0.31.0.md) (**#281 wrong-media defenses live-verified in BOTH directions, credit-free** — correct attribution downloads with real wire metadata [seed, 768×1376]; the incident-class lazy-render ambiguity reproduced live and hard-stopped with `MediaAttributionError` exit 26 naming every candidate UUID, no file written; **#282 two-UUID-ref i2i proven e2e** — both freshly generated portrait UUIDs picker-selected into one scene with both canonical identities visually transferred). Prior: [v0.30.0](LIVE_VERIFICATION_v0.30.0.md) (**agentic-cohort image path + both fixes live-verified credit-free** — native 768×1376 stills, i2i-chain + canonical-ref identity hold; the character-create `DataIntegrityError` and the `prefer_classic` WARNING were observed live then fixed [recorder idempotent + INFO log]; MCP video-param feature deferred-with-reason on Veo credits, per the stills-only goal). Prior: [v0.29.0](LIVE_VERIFICATION_v0.29.0.md) (**persistent `gflow instructions` CRUD proven live e2e GREEN, credit-free** — 11-command sequence on a fresh project: add incl. `--ref <image-UUID>` attach, list/enable/disable, master toggle both ways, TOML `apply` destructive full-sync with `enabled=false` honored, `rm` with server card-id preserved across mutations; movie brief-sync code-path-verified via the same primitives, deferred-with-reason on credits; MCP `gflow_instructions_*` tools are thin adapters over the live-verified primitives). Prior: [v0.28.0](LIVE_VERIFICATION_v0.28.0.md) (**agent instructions `-i` now steer agentic generation — crayon e2e GREEN**: a style-neutral prompt + an enabled "crayon" card produced an unmistakable crayon drawing through the real transport; root causes were conversational phrasing + the `project_brief.enabled` master switch). Prior: [v0.27.1](LIVE_VERIFICATION_v0.27.1.md) (**v0.27.0 release follow-up fixes and documentation sync**). Prior: [v0.27.0](LIVE_VERIFICATION_v0.27.0.md) (**`[style]` block with named variants + prompt-aware resume — credit-free CLI verification**: real `movie run --dry-run` 3-way ledger proving resolved-style display, `skip (done)` on matching `style_hash`, and `re-run (style changed)` after a style edit; composition is local, wire path untouched, so no Veo credits spent — first credited styled run will confirm visually). Prior: [v0.26.0](LIVE_VERIFICATION_v0.26.0.md) (**image i2i by generated-image UUID proven live e2e GREEN** — the existing asset is *selected in place* by its media UUID, no duplicate upload, producing an i2i output that references it; plus generated-image `display_name` capture, credited @C1ph3r404). Prior: [v0.25.0](LIVE_VERIFICATION_v0.25.0.md) (**#237 remote-UUID i2v proven live e2e GREEN** — a real 8s 720×1280 interpolation from a generated image's UUID, after the picker-search attach was reworked to local upload; #240 home-`.env` matrix live; plus two silent-failure guards root-caused live: video-as-image download rejection and rejected-upload fail-loud). Prior: [v0.24.0](LIVE_VERIFICATION_v0.24.0.md) (--project parity across CLI + MCP — automated coverage; live gen auth-gated). Prior: [v0.23.0](LIVE_VERIFICATION_v0.23.0.md) (MCP generation wiring proven live end-to-end — tool→worker→real Flow REST→structured-error translation; final image-write blocked by an expired session, environmental. #222 macOS fix reporter-verified e2e on Apple Silicon). Prior: [v0.22.0](LIVE_VERIFICATION_v0.22.0.md) (Tools framework — automated/CI coverage complete; credit/key-gated live feature run is a pending owner gate, see the doc) · [v0.21.0](LIVE_VERIFICATION_v0.21.0.md) (MCP server over stdio + HTTP/SSE — credit-free protocol handshake; 4 tools / 2 prompts / 3 resources confirmed on stdout) · [v0.20.1](LIVE_VERIFICATION_v0.20.1.md) · [v0.20.0](LIVE_VERIFICATION_v0.20.0.md) · [v0.19.0](LIVE_VERIFICATION_v0.19.0.md) · [v0.18.0](LIVE_VERIFICATION_v0.18.0.md) · [v0.17.0](LIVE_VERIFICATION_v0.17.0.md) · [v0.16.0](LIVE_VERIFICATION_v0.16.0.md) · [v0.13.0](LIVE_VERIFICATION_v0.13.0.md) · [v0.12.0](LIVE_VERIFICATION_v0.12.0.md) · [v0.11.0](LIVE_VERIFICATION_v0.11.0.md) · [v0.10.0](LIVE_VERIFICATION_v0.10.0.md) · [v0.9.1](LIVE_VERIFICATION_v0.9.1.md) · [v0.9.0](LIVE_VERIFICATION_v0.9.0.md) · [v0.8.1](LIVE_VERIFICATION_v0.8.1.md) · [v0.7.0](LIVE_VERIFICATION_v0.7.0.md)
138
+ **What was actually live-verified for the latest release?** → latest: [LIVE_VERIFICATION_v0.54.0](LIVE_VERIFICATION_v0.54.0.md) (**close-browser guidance #470, character-composer focus fix, overlay/jitter hardening, and SonarCloud-S2245 RNG swap live-verified 2026-08-12 on profile `ffroliva`, ZERO credits** — the new #470 login wording printed verbatim and the manual-close → `auth_flow_session_verified` round-trip worked end-to-end; a Classic-UI `t2i` produced a real 1024×1024 JPEG [`ff d8 ff e0`] exercising overlay dismissal + jitter + image-composer submit + mode controller, and a credit-free `character create` [entity `da3cd647…`, face 1376×768 JPEG] exercised the character-composer path directly [`entering_character_editor` → `prompt_submitted` → `entity_patched` → `completed`]; the first `t2i` hit the known agentic-cohort video-for-image condition [correctly refused via `WireFormatError`, tracked by #299, not a regression] and Classic UI worked around it. First mainline release after the orphaned v0.53.0/v0.53.1 tags — CHANGELOG restores honest 0.53.x sections). Prior: [LIVE_VERIFICATION_v0.52.0](LIVE_VERIFICATION_v0.52.0.md) (**batch DAG references #317, character entity provenance recording #402, and video duration selector cascade fix #451 live-verified 2026-08-05** — 3/3 live E2E tests in `tests/e2e/test_entity_provenance_e2e.py` passed clean on profile `ffroliva`, 5-layer evidence ledger verified). Prior: [v0.51.0](LIVE_VERIFICATION_v0.51.0.md) (**dependency/security/test-correctness release verified 2026-08-05, 1 Imagen credit + 1 Veo attempt** — the only change needing live evidence was the `playwright` bound raise `>=1.59.0,<1.60.0` → `>=1.61.0,<1.62.0`, and the 2026-08-03 regression does NOT reproduce on 1.61.0: a live i2v drove `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. `-m e2e_auth` 16/16, daemon e2e 1 passed [MCP over Streamable HTTP — the first live coverage that test has ever had, it was structurally incapable of passing before], MCP Tasks 5/5 layers, 2923 offline tests, `pip-audit --all-extras` clean. **No finished mp4 is claimed** — Flow's own generation returned `PUBLIC_ERROR_VIDEO_GENERATION_TIMED_OUT`, server-side. Defect found and recorded not omitted: Flow dropped the duration-tab UI so **`--duration` is currently broken for i2v**, A/B-proven pre-existing on BOTH 1.59.0 and 1.61.0 — [#451](https://github.com/ffroliva/gflow-cli/issues/451)). Prior: [v0.50.0](LIVE_VERIFICATION_v0.50.0.md) (**MCP Tasks extension SEP-2663, non-blocking task handle responses, CLI/MCP output path hardening -o/--output, and Telegram PR triage alert resilience verified 2026-08-04** — 5-layer evidence ledger note generated at `tmp/live-verify/mcp-tasks.md` confirming instant task handle return, working status queries, and cancelled status DB state transitions; full 118-test suite green). Prior: [v0.49.0](LIVE_VERIFICATION_v0.49.0.md) (**#125 `omni-flash` start-frame I2V video generation, Playwright dependency upper-bound pin `>=1.59.0,<1.60.0`, submission stage watchdog timeout, and #404 count-tab fail-closed logic verified 2026-08-03** — 0-credit wire intercept captured `batchAsyncGenerateVideoStartImage` with `startImage` bound; live costed generation on `omni-flash` I2V produced a 1.2MB valid mp4 video asset on `ffroliva`; full 2902-test release suite green). Prior: [v0.48.0](LIVE_VERIFICATION_v0.48.0.md) (**#411 predictable `-o`/`--output` paths, offline-verified 2026-08-02, ZERO credits** — exact single-target local writes + `_1`/`_2` multi-count **image** suffixes proven by the CLI suite; the pre-tag council audit [RED, then resolved] re-scoped the release to the truthful surface: a dead MCP `output` param was deleted [worker queue never read it — #414], cloud `-o` targets and video multi-count suffixes are follow-ups [#415], and two tautological video-path tests are recorded as weak evidence rather than claimed as proof; storage-layer S3 writes verified against Docker MinIO at the layer level only; 2888-test release tree green; the live-Flow run aborted pre-generation on an expired denon82 session [`AuthExpiredError` 401, correct RFC-7807 contract + remediation hint, $0] — recorded, not omitted; live re-run queued for the next authenticated session). Prior: [v0.47.0](LIVE_VERIFICATION_v0.47.0.md) (**MCP SDK 2.0.0 migration + dual-era protocol + #402 entity provenance recording live-verified 2026-08-01, ZERO credits** — stdio JSON-RPC initialization handshake verified over subprocess transport, `resolve-drift` CI job added to prevent dependency drift, and 121 unit tests in `tests/data` passed). Prior: [v0.46.1](LIVE_VERIFICATION_v0.46.1.md) (**#404 classic count-setter fix live-verified 2026-07-31 on the reporter's exact environment, ZERO credits** — credit-free DOM recon proved Flow renamed the count-tab labels to uniform `xN` [`x1` replaces `1x`, image AND video rows], that `nth(0)` of the old filtered set landed on the selected `x2` and actively moved the count AWAY from the target, and that a digit-keyed click on `x1` converges instantly and persists without a Save commit; the new classic e2e then passed live [count=1 against a fresh project displaying 2 → exactly 1 image; count=2 early-exit → exactly 2], and the #313 agentic count-enforcement e2e passed 4/4 [counts 1–4 vs deliberately mismatched sticky defaults, magic-byte-verified downloads] after its stale setup was repaired [Flow now loads the editor in classic mode — the setup needed an Agent-pill toggle before the `tune` icon; test-only fix, no product code implicated]; the video output-count cascade carries a recorded waiver [full drive costs Veo credits; its exact selector shape was exercised live in the spike's cleanup step]). Prior: [v0.46.0](LIVE_VERIFICATION_v0.46.0.md) (**#387 provider-agnostic prompt-tools transport live-verified 2026-07-28, ZERO credits** — a four-probe capability spike passed 4/4 against BOTH a non-Google gateway and Google's OpenAI-compat endpoint, including a *semantic* multimodal check [a generated solid-red JPEG round-tripped and the model answered 'Red'], which is what proved the native Gemini `inlineData` path could be deleted outright rather than kept as a fallback; the real CLI then returned `was_expanded: true` on gateway/gateway-no-model/Google-default, emitted the loud one-time notice + no-op for the removed `GFLOW_CLI_GEMINI_API_KEY`, and made NO network call when unconfigured. Live verification caught two defects a fully green 2849-test offline suite missed: Google's compat endpoint has no server-side default model [`400 "model is not specified"`, silently no-oping the DEFAULT configuration], and the first redirect guard did not actually work because `build_opener()` installs its default handlers regardless of arguments, so `Authorization` would still have been replayed cross-host. `/code-review high` is recorded as NOT run — it is user-triggered only). Prior: [v0.45.0](LIVE_VERIFICATION_v0.45.0.md) (**#393 UUID `--ref` binding + #395 character-entity binding live-verified 2026-07-27/28** — a controlled A/B on identical input flipped `--ref` from exit 9 to exit 0 via the catalog-backed upload fallback, with the anti-silence guard [an unbindable ref aborts non-zero and writes no image] pinned by a live e2e; picker DOM + HAR showed Flow indexes a short auto-caption, NOT the prompt, so a prompt-derived search hint was dropped rather than shipped on assumption; a CDP spike against Flow's own character flow then captured the `entityContext` contract that gflow's generations were missing, root-causing #395 to two gflow defects [overlay dismissal Escaping Flow's own composer, and a character-route bounce that sent the prompt to the project composer] — both fixed, both character e2e tests now pass live, including `--format-prompt` [#383], with a read-back confirming the character carries its name and `thumbnail_media_id`). Prior: [v0.44.0](LIVE_VERIFICATION_v0.44.0.md) (**#381 dual-side project management & Playwright Chromium transport live-verified 2026-07-26** — real-editor project creation + rename tRPC server/DOM sync, prompt slugging, `gflow project` subcommand family, HTTP 429 adaptive backoff, and full E2E test suite). Prior: [v0.43.0](LIVE_VERIFICATION_v0.43.0.md) (**private incident diagnostics live-verified 2026-07-23, 1 Veo credit**). Prior: [v0.42.0](LIVE_VERIFICATION_v0.42.0.md) (**#361 production-readiness live-gaps confirmed live 2026-07-21, 1 Veo credit** — a real `veo-lite` t2v through the worker path persisted a real `remote_started` checkpoint [observer→checkpoint→DB chain confirmed], crash-recovery classified the task `indeterminate` without resubmitting, and mid-launch cancellation released the `ProfileLease` credit-free; full evidence in [v0.40.0-production-readiness § "2026-07-21 live follow-up"](LIVE_VERIFICATION_v0.40.0-production-readiness.md#2026-07-21-live-follow-up-0420-cycle); #359 content-safety `400`→`ContentPolicyError` classification is unit-covered, not live-triggered [would require a deliberate policy violation]; #360/#362 are docs-only, verified by the documentation gates). Prior: [v0.41.0](LIVE_VERIFICATION_v0.41.0.md) (**#357 production-readiness hardening — stale-session fail-fast, free image gen, paid veo-lite T2V all proven live**). Prior: [v0.40.0](LIVE_VERIFICATION_v0.40.0.md) (**#344 `@`-mention asset-tagging resolution proven live e2e, ~2 Imagen credits** — `gflow character create` staged a real taggable character [bound reference images, `has_reference_images` guard], the e2e test's documented propagation wait cleared Flow's `projectInitialData` lag, and `gflow image t2i "@Zoro …"` passed with returncode 0, a real generated image, and the correctly de-tagged prompt in the catalog — no code changes needed, `resolve_and_apply` as merged in #344 already works end-to-end; pre-existing unrelated issue #174 [Flow media-library A/B flake] can still intermittently block generation regardless of this feature — recorded, not omitted). Prior: [v0.39.0](LIVE_VERIFICATION_v0.39.0.md) (**#341 failed-generation persistence proven live** — a real `image t2i` on denon82 failed at the wire [`batchGenerateImages` HTTP 400 → `WireFormatError`] and the record-on-catch funnel wrote the **first-ever `failed` row** into the production catalog [`error_type=wire-format`, redacted `error_detail`, browsable via `gflow data list errors`], **$0**; the remaining paid paths [video/chain/batch/movie/worker] are funnel-regression-tested, not force-failed live [would cost credits], and the status-aware `succeeded=false` video-poll fix is unit-locked — recorded, not omitted). Prior: [v0.38.1](LIVE_VERIFICATION_v0.38.1.md) (**#338 agentic-pin recovery proven live ON the pinned account** — run 1 caught the composer-render race the unit suite could not [`ensure_media_incomplete` +115 ms, toggle never reached]; the readiness-wait fix landed and run 2 recovered classic on denon82 after ~2h of pin [`ui_driver.bound mode=classic`, real 768×1376 JPEG, exact prompt adherence]; reload branch unit-locked, live trigger not observed this cycle — recorded, not omitted). Prior: [v0.38.0](LIVE_VERIFICATION_v0.38.0.md) (**#332 mode control + #314 i2i ref dedup proven live e2e** — `image t2i --ui-mode classic` recovered agentic→classic in a real run [`ui_mode.attempt_exit_agent` → full classic chain, 1376×768 JPEG]; two identical `image i2i` runs proved the dedup contract [run 1: picker miss → `image_uploaded`; run 2: `reference_deduped_by_filename`, ZERO uploads]; `video t2v` veo-fast [`MEDIA_GENERATION_STATUS_SUCCESSFUL`, 15.2 MB `ftyp` mp4]; autopilot #333 recorded deferred-with-reason [hermes-ops deployment staged separately]). Prior: [v0.37.0](LIVE_VERIFICATION_v0.37.0.md) (**viewport 1920×1080 + agentic count enforcement + FIPS-safe SAPISIDHASH proven live e2e** — `image t2i` [classic cohort, real 1376×768 JPEG] and `video t2v` veo-fast [`MEDIA_GENERATION_STATUS_SUCCESSFUL`, 11.5 MB `ftyp` mp4] both succeeded end-to-end at the new 1920×1080 viewport with every selector resolving [no drift]; SAPISIDHASH digest verified byte-identical [FIPS-safe `usedforsecurity=False`], auth unchanged). Prior: [v0.36.0](LIVE_VERIFICATION_v0.36.0.md) (**#316 diagnostic tooling live-verified against real Flow traffic** — `GFLOW_CLI_HAR_PATH` captured a real 54-entry HAR [real Flow domains, 34× 200s, and a genuine 401 the tool exists to diagnose]; `GFLOW_CLI_DEBUG_TRACEBACK`'s typed-error scoping confirmed live [console output identical with/without the flag on a `GFlowError`]; unhandled-path behavior covered by 6 new tests (30 total across both files) + SDD task review; #312 reference-entity-smuggling fix covered by its own dedicated e2e test). Prior: [v0.35.0](LIVE_VERIFICATION_v0.35.0.md) (**#305-follow-up multimodal reverse-engineering & storyboard tool proven live e2e** — `gflow tools run storyboard` successfully deconstructed a cyberpunk scene into a cohesive 4-panel sequence; `reverse-engineer` tool extracts frames from video streams/URLs using `claude-video`'s `watch.py` and produces structured prompt components using Gemini multimodal models; dynamic token budgeting and strict Pyright types verified via test suite). Prior: [v0.34.0](LIVE_VERIFICATION_v0.34.0.md) (**#299 `--ui-mode` gate proven live, ZERO credits** — drove `get_ui_driver` directly over 4 real editor loads, never generated: bidirectional switch works [classic→agentic via `_force_agent_mode`, agentic→classic via `_exit_agent_mode`, each DOM-reverified], `agentic`-when-already-agentic is idempotent, and a timed-out toggle → **exit-28 fail-fast before submission**; deprecation behavior-change [`prefer_classic`→exit 28] confirmed). Prior: [v0.33.0](LIVE_VERIFICATION_v0.33.0.md) (**#287-follow-up picker fix proven live on the original repro** — the v0.32.1-failing `i2v <uuid> --project <crowded>` command now exits 0 with a real 3.0 MB `ftyp` mp4, `frame_ref_attached` + `video_saved`, zero uploads; **#241 jitter live-verified on both paths** — flag `--jitter 4-6` → `batch_jitter_sleep seconds=4.98`, and the new 0.5–1.5 s default → `seconds=1.47`, each firing exactly once between two t2i submissions; environment note: the denon82 cohort is now natively agentic and round-2 generations hit the pre-existing #281 `MediaAttributionError`, not a regression). Prior: [v0.32.1](LIVE_VERIFICATION_v0.32.1.md) (**#293 teardown fix live-verified credit-free** — error-path aborts leave ZERO chrome.exe holding the profile [3× leak reproduced pre-fix same day]; force-close fallback + ProfileLockedError translation unit-pinned; #283 wave logic fixes mock-verified to exact call counts). Prior: [v0.32.0](LIVE_VERIFICATION_v0.32.0.md) (**#287 UUID i2v frames proven live e2e** — an in-project asset selected by media UUID in the frame-slot dialog [frame_ref_attached, startImage bound on the wire, ZERO upload events] produced a real 720×1280 interpolation, resolving the #237 negative prior; foreign UUID → exit 9 pre-generation with screenshot; **#288 duration fail-fast proven live** — exit 23 pre-submit saved a 10-credit generation, and the debug screenshot confirmed the duration control is ABSENT from the cohort's settings popover [locale hypothesis refuted]; upload-400 exit-27 repro deferred-with-reason — the original rejected JPEG no longer exists). Prior: [v0.31.0](LIVE_VERIFICATION_v0.31.0.md) (**#281 wrong-media defenses live-verified in BOTH directions, credit-free** — correct attribution downloads with real wire metadata [seed, 768×1376]; the incident-class lazy-render ambiguity reproduced live and hard-stopped with `MediaAttributionError` exit 26 naming every candidate UUID, no file written; **#282 two-UUID-ref i2i proven e2e** — both freshly generated portrait UUIDs picker-selected into one scene with both canonical identities visually transferred). Prior: [v0.30.0](LIVE_VERIFICATION_v0.30.0.md) (**agentic-cohort image path + both fixes live-verified credit-free** — native 768×1376 stills, i2i-chain + canonical-ref identity hold; the character-create `DataIntegrityError` and the `prefer_classic` WARNING were observed live then fixed [recorder idempotent + INFO log]; MCP video-param feature deferred-with-reason on Veo credits, per the stills-only goal). Prior: [v0.29.0](LIVE_VERIFICATION_v0.29.0.md) (**persistent `gflow instructions` CRUD proven live e2e GREEN, credit-free** — 11-command sequence on a fresh project: add incl. `--ref <image-UUID>` attach, list/enable/disable, master toggle both ways, TOML `apply` destructive full-sync with `enabled=false` honored, `rm` with server card-id preserved across mutations; movie brief-sync code-path-verified via the same primitives, deferred-with-reason on credits; MCP `gflow_instructions_*` tools are thin adapters over the live-verified primitives). Prior: [v0.28.0](LIVE_VERIFICATION_v0.28.0.md) (**agent instructions `-i` now steer agentic generation — crayon e2e GREEN**: a style-neutral prompt + an enabled "crayon" card produced an unmistakable crayon drawing through the real transport; root causes were conversational phrasing + the `project_brief.enabled` master switch). Prior: [v0.27.1](LIVE_VERIFICATION_v0.27.1.md) (**v0.27.0 release follow-up fixes and documentation sync**). Prior: [v0.27.0](LIVE_VERIFICATION_v0.27.0.md) (**`[style]` block with named variants + prompt-aware resume — credit-free CLI verification**: real `movie run --dry-run` 3-way ledger proving resolved-style display, `skip (done)` on matching `style_hash`, and `re-run (style changed)` after a style edit; composition is local, wire path untouched, so no Veo credits spent — first credited styled run will confirm visually). Prior: [v0.26.0](LIVE_VERIFICATION_v0.26.0.md) (**image i2i by generated-image UUID proven live e2e GREEN** — the existing asset is *selected in place* by its media UUID, no duplicate upload, producing an i2i output that references it; plus generated-image `display_name` capture, credited @C1ph3r404). Prior: [v0.25.0](LIVE_VERIFICATION_v0.25.0.md) (**#237 remote-UUID i2v proven live e2e GREEN** — a real 8s 720×1280 interpolation from a generated image's UUID, after the picker-search attach was reworked to local upload; #240 home-`.env` matrix live; plus two silent-failure guards root-caused live: video-as-image download rejection and rejected-upload fail-loud). Prior: [v0.24.0](LIVE_VERIFICATION_v0.24.0.md) (--project parity across CLI + MCP — automated coverage; live gen auth-gated). Prior: [v0.23.0](LIVE_VERIFICATION_v0.23.0.md) (MCP generation wiring proven live end-to-end — tool→worker→real Flow REST→structured-error translation; final image-write blocked by an expired session, environmental. #222 macOS fix reporter-verified e2e on Apple Silicon). Prior: [v0.22.0](LIVE_VERIFICATION_v0.22.0.md) (Tools framework — automated/CI coverage complete; credit/key-gated live feature run is a pending owner gate, see the doc) · [v0.21.0](LIVE_VERIFICATION_v0.21.0.md) (MCP server over stdio + HTTP/SSE — credit-free protocol handshake; 4 tools / 2 prompts / 3 resources confirmed on stdout) · [v0.20.1](LIVE_VERIFICATION_v0.20.1.md) · [v0.20.0](LIVE_VERIFICATION_v0.20.0.md) · [v0.19.0](LIVE_VERIFICATION_v0.19.0.md) · [v0.18.0](LIVE_VERIFICATION_v0.18.0.md) · [v0.17.0](LIVE_VERIFICATION_v0.17.0.md) · [v0.16.0](LIVE_VERIFICATION_v0.16.0.md) · [v0.13.0](LIVE_VERIFICATION_v0.13.0.md) · [v0.12.0](LIVE_VERIFICATION_v0.12.0.md) · [v0.11.0](LIVE_VERIFICATION_v0.11.0.md) · [v0.10.0](LIVE_VERIFICATION_v0.10.0.md) · [v0.9.1](LIVE_VERIFICATION_v0.9.1.md) · [v0.9.0](LIVE_VERIFICATION_v0.9.0.md) · [v0.8.1](LIVE_VERIFICATION_v0.8.1.md) · [v0.7.0](LIVE_VERIFICATION_v0.7.0.md)
139
139
  **"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).
140
140
  **"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)).
141
141
  **"What was live-verified for the data layer (PR #58)?"** → [LIVE_VERIFICATION_data_layer](LIVE_VERIFICATION_data_layer.md) — 1 Imagen + 1 Veo credit on denon82, 6-layer ledger (file + magic + Pillow + DB rows + CLI round-trip + structlog)
@@ -0,0 +1,67 @@
1
+ # Live Verification — v0.54.0 (Close-Browser Guidance, Composer/Overlay Hardening, Jitter RNG)
2
+
3
+ **Date:** 2026-08-12
4
+ **Profile:** `ffroliva` (`ffroliva@gmail.com`) — real-Chrome auth strategy, running the **0.54.0** build from `chore/release-v0.54.0`.
5
+ **Credits spent:** 0 — `image t2i` and `character create` (face) are credit-free; no Veo generation was driven.
6
+
7
+ ## 1. What This Document Verifies
8
+
9
+ v0.54.0 ships **no generation feature**; its user-facing surface is a login-message reword (#470), a character-composer focus fix, overlay/watermark selector hardening (#403 refinement), a cryptographic RNG swap for interaction jitter (SonarCloud S2245), and dependabot guards for the playwright/patchright drivers (#465). This document records **live exercise of every changed code path** against real Flow on the 0.54.0 build. Because the changes live in the shared UI-automation submit/overlay/jitter machinery, two credit-free generations (a Classic-UI `t2i` and a `character create`) exercise all of them end-to-end.
10
+
11
+ ## 2. 5-Layer Verification Ledger
12
+
13
+ | Layer / Change | Recorded Live Evidence | Result |
14
+ |---|---|---|
15
+ | **#470 — close-browser guidance** | The reworded step 4 printed **verbatim** during the live `auth login` on the 0.54.0 build; the manual close then drove `Browser closed. Verifying Flow session…` → `auth_flow_session_verified` (`ffroliva@gmail.com`) → `[OK] Flow session verified`. End-to-end on the real-Chrome path. | 🟢 PASS |
16
+ | **1. File count (t2i)** | `1/1 succeeded` — Classic-UI `image t2i` | 🟢 PASS |
17
+ | **2. Magic bytes (t2i)** | `ff d8 ff e0` (JPEG/JFIF) | 🟢 PASS |
18
+ | **3. Dimensions (t2i)** | Pillow: `JPEG (1024, 1024) RGB`, 776 KB — [`0754aa44…_1.jpg`](file:///C:/Users/ffrol/Downloads/gflow-cli/images/2026-08-12/0754aa44-b5fd-42b8-85ee-e58e0fb25175_1.jpg) | 🟢 PASS |
19
+ | **4. Structlog invariants (t2i)** | `ui_driver.ui_mode.attempt_exit_agent` → `ui_automation.aspect_ratio_set` → `ui_automation.prompt_submitted` → `ui_automation.batch_response_captured` (all `cli_version 0.54.0`) — exercises overlay dismissal, interaction jitter, image-composer submit, and the mode controller | 🟢 PASS |
20
+ | **Character-composer focus fix** | `character create` → entity `da3cd647-6ea2-4075-af8b-9404c9897c37` (`LiveVerify054`); composer path `ui_automation.entering_character_editor` → `character_editor_ready` → `character_model_selected` → `prompt_input_found` → `prompt_submitted` → `character_create.face_done` → `entity_patched` → `completed`, no errors | 🟢 PASS |
21
+ | **5. Character face asset** | `ff d8 ff e0` — Pillow `JPEG (1376, 768) RGB`, 556 KB — [`character_da3cd647…_slot0.jpg`](file:///C:/Users/ffrol/Downloads/gflow-cli/characters/2026-08-12/character_da3cd647-6ea2-4075-af8b-9404c9897c37_slot0.jpg) | 🟢 PASS |
22
+ | **Jitter RNG (SonarCloud S2245)** | `_jitter_ms` interaction jitter ran during **both** live generations with no error (internal swap to `secrets.SystemRandom`); primary coverage via the SonarCloud gate + offline suite | 🟢 PASS (path exercised; Sonar/unit-covered) |
23
+ | **Overlay/watermark hardening (#403 refinement)** | No blocking release overlay appeared on the fresh session, so the pure-structural selectors ran without a live modal to dismiss this cycle; behavior is unit-covered (`tests/api/transports/test_ui_automation.py`) and the underlying #403 dismissal was live-verified in v0.53.0 | 🟢 PASS (unit-covered; no live modal this cycle) |
24
+ | **#465 / patchright dependabot guards** | Not a live-Flow feature — enforced by `tests/test_playwright_pin.py` (`test_dependabot_ignores_playwright_minor_bumps`, `test_dependabot_ignores_driver_engine_bumps`) | 🟢 PASS (test-covered) |
25
+
26
+ ## 3. Execution Log Trace (Verbatim Excerpt)
27
+
28
+ Login (#470 message → session verified):
29
+
30
+ ```
31
+ 4. When you're finished, simply close the Chrome window — that's how you let gflow know you're done.
32
+ gflow then verifies your Flow session automatically; there's nothing else to do.
33
+ {"strategy": "chrome", "source": "chrome", "user_email": "ffroliva@gmail.com", "event": "auth_flow_session_verified", "cli_version": "0.54.0", ...}
34
+ [OK] Flow session verified (ffroliva@gmail.com).
35
+ ```
36
+
37
+ Classic-UI `image t2i` (overlay / jitter / composer / mode controller):
38
+
39
+ ```
40
+ {"event": "ui_driver.ui_mode.attempt_exit_agent", "cli_command": "image t2i", "cli_version": "0.54.0", ...}
41
+ {"event": "ui_automation.aspect_ratio_set", "cli_command": "image t2i", "cli_version": "0.54.0", ...}
42
+ {"event": "ui_automation.prompt_submitted", "cli_command": "image t2i", "cli_version": "0.54.0", ...}
43
+ {"event": "ui_automation.batch_response_captured", "cli_command": "image t2i", "cli_version": "0.54.0", ...}
44
+ ```
45
+
46
+ `character create` (character-composer path):
47
+
48
+ ```
49
+ {"event": "ui_automation.prompt_submitted", "cli_command": "character create", "cli_version": "0.54.0", ...}
50
+ {"entity_id": "da3cd647-...", "media_id": "bc36a2ea-...", "event": "character_create.face_done", ...}
51
+ {"entity_id": "da3cd647-...", "event": "character_create.entity_patched", ...}
52
+ {"entity_id": "da3cd647-...", "name": "LiveVerify054", "event": "character_create.completed", ...}
53
+ ```
54
+
55
+ ## 4. User-Confirmable Outputs
56
+
57
+ - **Image:** `~/Downloads/gflow-cli/images/2026-08-12/0754aa44-b5fd-42b8-85ee-e58e0fb25175_1.jpg` — a serene mountain lake at dawn, 1024×1024.
58
+ - **Character face:** `~/Downloads/gflow-cli/characters/2026-08-12/character_da3cd647-6ea2-4075-af8b-9404c9897c37_slot0.jpg` — a red-fox portrait, 1376×768.
59
+ - **Character entity:** `da3cd647-6ea2-4075-af8b-9404c9897c37` (`LiveVerify054`) in project `e00291af-a329-42de-ab2a-1dbcc71137fc` (browsable via `gflow character show --id da3cd647-…`).
60
+
61
+ ## 5. Known Condition (documented, not a blocker)
62
+
63
+ The **first** `t2i` attempt hit the known Flow **agentic-UI cohort** behavior — the conversational agent returned *video* content for an image request. gflow correctly **detected and refused it** (`WireFormatError`, first-class guard at `api/client.py:1572`, remediation: `GFLOW_CLI_PREFER_CLASSIC=1`) rather than saving a wrong file. This is the pre-existing behavior tracked by open issue **#299** (UI-mode reliability / agentic driver hardening) — **not a 0.54.0 regression**. Forcing Classic UI worked around it, and the successful runs above followed. Recorded, not omitted.
64
+
65
+ ## 6. Release Reconciliation Note
66
+
67
+ v0.54.0 is the first mainline release after **v0.53.0 / v0.53.1**, which were published as GitHub releases (tags) but whose commits never reached `main`/`develop`. Their content (#315 driver-delay humanization, #403 overlay detection) was already present in `develop` as patch-equivalents; this release's CHANGELOG restores honest `[0.53.0]` / `[0.53.1]` sections and supersedes the orphaned tags. See `CHANGELOG.md`.
@@ -259,10 +259,15 @@ Controls:
259
259
 
260
260
  - **Optional-only** — never in the base `dependencies`; the default install pulls
261
261
  neither the package nor its driver.
262
- - **Exact-pinned** (`patchright==1.60.1`) so a release cannot silently move the
262
+ - **Exact-pinned** (`patchright==1.61.2`) so a release cannot silently move the
263
263
  browser binary underneath you.
264
264
  - **Security-review-required on bump** — a Patchright version change is treated
265
- like a browser-binary change, NOT a routine dependabot auto-merge.
265
+ like a browser-binary change, NOT a routine dependabot auto-merge. The exact
266
+ pin alone does **not** enforce this: Dependabot's `uv` ecosystem rewrites a
267
+ constraint standing in an update's way rather than respecting it (PR #465 did
268
+ exactly that to playwright's upper bound). The enforcement is the explicit
269
+ `ignore` entry in `.github/dependabot.yml`, guarded by
270
+ `tests/test_playwright_pin.py::test_dependabot_ignores_driver_engine_bumps`.
266
271
  - Default engine is `playwright` (Microsoft, security-reviewed); patchright is an
267
272
  experiment you opt into per the trade-off above.
268
273
 
@@ -0,0 +1,98 @@
1
+ # Per-Command UI Mode Policy Implementation Plan
2
+
3
+ > **For agentic workers:** Run `/gflow:status --feature ui-mode-policy` to find the next unchecked task. Implement one task at a time. Run `/gflow:check` before every commit.
4
+
5
+ **Goal:** Add `--ui-mode auto|classic|agentic` CLI option, `GFLOW_CLI_UI_MODE` setting, and strict policy validation before generation submission to fail fast with `UiModeUnavailableError` (exit 28) when requested UI mode doesn't match the mounted cohort.
6
+
7
+ **Predict verdict:** GO — confidence 10/10
8
+
9
+ ---
10
+
11
+ ## File structure
12
+
13
+ ### Modified files
14
+ ```
15
+ src/gflow_cli/config.py
16
+ Add ui_mode setting ("auto" | "classic" | "agentic").
17
+ src/gflow_cli/api/transports/drivers/factory.py
18
+ Enforce strict mode policy check in bind_ui_driver, raising UiModeUnavailableError.
19
+ src/gflow_cli/cli_image.py, cli_video.py, cli_run.py
20
+ Add --ui-mode Click option.
21
+ src/gflow_cli/mcp/tools.py (and server definitions)
22
+ Mirror ui_mode tool argument for CLI-MCP parity.
23
+ tests/api/transports/test_driver_factory.py
24
+ Unit tests for strict UI mode policy validation.
25
+ tests/mcp/test_cli_parity.py
26
+ CLI-MCP parity test assertions.
27
+ CHANGELOG.md
28
+ Unreleased section update.
29
+ ```
30
+
31
+ ---
32
+
33
+ ## Task 1 — Config & Settings Extension
34
+
35
+ **What:** Add `ui_mode: Literal["auto", "classic", "agentic"] = "auto"` setting to `Settings` in `config.py`.
36
+
37
+ **Files:**
38
+ - `src/gflow_cli/config.py`
39
+ - `tests/test_config.py`
40
+
41
+ **Steps:**
42
+ - [ ] Add `ui_mode` setting in `config.py` with validation for `auto`, `classic`, `agentic`.
43
+ - [ ] Add unit test in `tests/test_config.py`.
44
+
45
+ ---
46
+
47
+ ## Task 2 — Driver Factory Policy Enforcement
48
+
49
+ **What:** Update `bind_ui_driver` in `src/gflow_cli/api/transports/drivers/factory.py` to check the configured/requested `ui_mode`. If `ui_mode != "auto"` and `detected_mode != ui_mode`, raise `UiModeUnavailableError`.
50
+
51
+ **Files:**
52
+ - `src/gflow_cli/api/transports/drivers/factory.py`
53
+ - `tests/api/transports/test_driver_factory.py`
54
+
55
+ **Steps:**
56
+ - [ ] Implement `ui_mode` parameter in `bind_ui_driver`.
57
+ - [ ] Raise `UiModeUnavailableError` on mismatch.
58
+ - [ ] Add unit tests in `tests/api/transports/test_driver_factory.py`.
59
+
60
+ ---
61
+
62
+ ## Task 3 — CLI & MCP Option Symmetry
63
+
64
+ **What:** Add `--ui-mode` Click option to generation commands and update MCP tool definitions.
65
+
66
+ **Files:**
67
+ - `src/gflow_cli/cli_image.py`
68
+ - `src/gflow_cli/cli_video.py`
69
+ - `src/gflow_cli/cli_run.py`
70
+ - `src/gflow_cli/mcp/tools/`
71
+ - `tests/mcp/test_cli_parity.py`
72
+
73
+ **Steps:**
74
+ - [ ] Add `--ui-mode` Click option to `gflow image t2i`, `gflow image i2i`, `gflow video t2v`, `gflow video i2v`, `gflow run`.
75
+ - [ ] Update MCP tool definitions.
76
+ - [ ] Verify `tests/mcp/test_cli_parity.py` passes.
77
+
78
+ ---
79
+
80
+ ## Task 4 — Quality Gates & Pre-Commit Validation
81
+
82
+ **What:** Run the Impeccable Routine (`/gflow:check`).
83
+
84
+ **Steps:**
85
+ - [ ] `uv run python scripts/ci/check_repo_hygiene.py`
86
+ - [ ] `uv run python scripts/ci/check_doc_links.py`
87
+ - [ ] `uv run ruff check src tests`
88
+ - [ ] `uv run ruff format --check src tests`
89
+ - [ ] `uv run pyright src`
90
+ - [ ] `uv run python -m pytest -q`
91
+
92
+ ---
93
+
94
+ ## Definition of Done
95
+
96
+ - [ ] All task steps checked off
97
+ - [ ] `/gflow:check` green
98
+ - [ ] `CHANGELOG.md` `[Unreleased]` section updated
@@ -0,0 +1,27 @@
1
+ # Scenario: Issue #299 — Per-Command UI Mode Policy
2
+
3
+ ## Coverage Map
4
+ - **Active Dimensions:**
5
+ - **D11 (Input validation & boundaries):** Valid `--ui-mode` values (`auto`, `classic`, `agentic`). Invalid values raise `ConfigurationError`.
6
+ - **D6 (CLI & MCP Parity):** Every CLI generation command with `--ui-mode` must have a corresponding MCP tool parameter.
7
+ - **D8 (Typed Error Exit Codes):** Mismatch in strict mode (`--ui-mode classic` on agentic DOM, or `--ui-mode agentic` on classic DOM) raises `UiModeUnavailableError` with exit code 28.
8
+ - **Skipped Dimensions:** D1, D2, D4, D5, D7, D9, D10, D12.
9
+
10
+ ---
11
+
12
+ ## Scenario Table
13
+
14
+ | # | Dimension | Scenario | Severity | Expected behaviour | Test category |
15
+ |---|---|---|---|---|---|
16
+ | 1 | D11 Input validation | `--ui-mode invalid` passed to CLI | High | Raises `ConfigurationError` | Unit |
17
+ | 2 | D8 Error exit code | `--ui-mode classic` when DOM is agentic | High | Raises `UiModeUnavailableError` (exit code 28) | Unit |
18
+ | 3 | D8 Error exit code | `--ui-mode agentic` when DOM is classic | High | Raises `UiModeUnavailableError` (exit code 28) | Unit |
19
+ | 4 | D6 Schema symmetry | `gflow image t2i --ui-mode` options | High | Mirrored in MCP `generate_image` tool schema | Parity Unit |
20
+
21
+ ---
22
+
23
+ ## Must-Cover Before Merge
24
+ 1. Add `ui_mode` setting in `config.py` with `auto`, `classic`, `agentic` literals.
25
+ 2. Implement strict UI mode enforcement in `factory.py::bind_ui_driver` raising `UiModeUnavailableError`.
26
+ 3. Add `--ui-mode` Click option across generation commands (`cli_image.py`, `cli_video.py`, `cli_run.py`) and update MCP tool definitions.
27
+ 4. Unit tests in `tests/api/transports/test_driver_factory.py` and `tests/mcp/test_cli_parity.py`.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "gflow-cli"
3
- version = "0.53.0"
3
+ version = "0.54.0"
4
4
  description = "Unofficial CLI for Google Flow — drive Veo image-to-video generations from the terminal."
5
5
  readme = "README.md"
6
6
  license = { file = "LICENSE" }
@@ -62,7 +62,7 @@ dependencies = [
62
62
  dev = [
63
63
  "pytest>=8.0.0",
64
64
  "pytest-asyncio>=0.23.0",
65
- "ruff==0.16.1",
65
+ "ruff==0.16.2",
66
66
  "pyright>=1.1.0",
67
67
  # video-chain: the last-frame extractor (media.py) decodes with PyAV, and its
68
68
  # tests build synthetic mp4 fixtures with numpy. Declared here so the dev/CI
@@ -173,7 +173,7 @@ dev = [
173
173
  "pytest-asyncio>=1.3.0",
174
174
  "pytest-bdd>=8.1.0",
175
175
  "pytest-cov>=7.1.0",
176
- "ruff==0.16.1",
176
+ "ruff==0.16.2",
177
177
  ]
178
178
  # Container-based integration tests — requires Docker daemon.
179
179
  # Install: uv sync --group containers
@@ -1,3 +1,3 @@
1
1
  """gflow-cli — unofficial CLI for Google Flow."""
2
2
 
3
- __version__ = "0.53.0"
3
+ __version__ = "0.54.0"
@@ -18,6 +18,7 @@ import hashlib
18
18
  import json
19
19
  import random
20
20
  import re
21
+ import secrets
21
22
  import time
22
23
  from typing import TYPE_CHECKING, Any, cast
23
24
  from urllib.parse import urlparse
@@ -450,29 +451,20 @@ TOP_BANNER_SELECTORS: tuple[str, ...] = (
450
451
  # Close-button selectors tried after a changelog iframe or banner overlay is detected.
451
452
  # Ordered from most-specific to most-generic so a precise match wins first.
452
453
  # All are tried before the Escape fallback.
453
- OVERLAY_CLOSE_BUTTON_SELECTORS = (
454
- # Structural & ARIA anchors (100% language-agnostic)
454
+ OVERLAY_CLOSE_BUTTON_SELECTORS: tuple[str, ...] = (
455
455
  "[role='dialog']:has(a[href*='changelog']) button",
456
- "[aria-label='Close']",
457
- "[aria-label='close']",
458
- "[aria-label='Dismiss']",
459
- "[aria-label='dismiss']",
460
- "[aria-label*='Dismiss' i]",
461
- "[aria-label='Cancel']",
462
456
  "button:has(i.google-symbols:text('clear'))",
463
457
  "button:has(i:text('clear'))",
464
458
  "button:has(i.google-symbols:text('close'))",
465
459
  "button:has(i:text('close'))",
466
- "[aria-label*='Got it' i]",
467
460
  "[role='dialog'] button:has(i:text('close'))",
468
- "[role='dialog'] button[aria-label*='close' i]",
469
461
  "button[data-dismiss]",
470
462
  )
471
463
 
472
- # Detectors for the "Welcome to Google Flow" splash screen.
473
- WELCOME_SCREEN_SELECTORS = (
474
- "div:has-text('Welcome to Google Flow')",
475
- "button:has-text('See what's new')",
464
+ # Detectors for the splash screen or welcome overlay (pure structural anchors).
465
+ WELCOME_SCREEN_SELECTORS: tuple[str, ...] = (
466
+ "[role='dialog']:has(a[href*='flow'])",
467
+ "[role='dialog']:has(a[href*='changelog'])",
476
468
  )
477
469
 
478
470
 
@@ -573,9 +565,6 @@ def aspect_cli_from_enum(aspect: Aspect) -> str | None:
573
565
 
574
566
  # Back-compat alias — kept so any remaining internal callers and the existing
575
567
  # test imports work without a rename sweep.
576
- _aspect_cli_from_enum = aspect_cli_from_enum
577
-
578
-
579
568
  def _prompt_hash_stable(text: str) -> str:
580
569
  """Truncated sha256 matching image_batch._prompt_hash prefix length.
581
570
 
@@ -782,7 +771,7 @@ def _entity_ids_from_request_body(post_data: str | None) -> set[str]:
782
771
 
783
772
 
784
773
  def _jitter_ms(base_ms: int, variance: float = 0.25) -> int:
785
- """Calculate a randomized delay duration bounded around base_ms.
774
+ """Calculate a randomized delay around `base_ms` with `±variance` spread.
786
775
 
787
776
  Adds timing entropy to browser interaction delays to break deterministic Playwright
788
777
  automation fingerprints. Returns 0 if base_ms <= 0.
@@ -790,7 +779,7 @@ def _jitter_ms(base_ms: int, variance: float = 0.25) -> int:
790
779
  if base_ms <= 0:
791
780
  return 0
792
781
  delta = int(round(base_ms * max(0.0, min(1.0, variance))))
793
- return max(1, random.randint(base_ms - delta, base_ms + delta))
782
+ return max(1, secrets.SystemRandom().randint(base_ms - delta, base_ms + delta)) # NOSONAR
794
783
 
795
784
 
796
785
  class UiAutomationTransport(VideoGenerationMixin):
@@ -1068,7 +1057,7 @@ class UiAutomationTransport(VideoGenerationMixin):
1068
1057
  loc = page.locator(close_sel).first
1069
1058
  if await loc.is_visible(timeout=500):
1070
1059
  await loc.click(force=True)
1071
- await page.wait_for_timeout(1000)
1060
+ await page.wait_for_timeout(_jitter_ms(1000))
1072
1061
  log.info(
1073
1062
  _EVT_OVERLAY_DISMISSED,
1074
1063
  selector=close_sel,
@@ -1089,7 +1078,7 @@ class UiAutomationTransport(VideoGenerationMixin):
1089
1078
  loc = frame.locator(close_sel).first
1090
1079
  if await loc.is_visible(timeout=500):
1091
1080
  await loc.click(force=True)
1092
- await page.wait_for_timeout(1000)
1081
+ await page.wait_for_timeout(_jitter_ms(1000))
1093
1082
  log.info(
1094
1083
  _EVT_OVERLAY_DISMISSED,
1095
1084
  selector=close_sel,
@@ -1136,7 +1125,7 @@ class UiAutomationTransport(VideoGenerationMixin):
1136
1125
  # Escape fallback (regression test case: iframe present, no close button).
1137
1126
  try:
1138
1127
  await page.keyboard.press("Escape")
1139
- await page.wait_for_timeout(1000)
1128
+ await page.wait_for_timeout(_jitter_ms(1000))
1140
1129
  log.info(
1141
1130
  _EVT_OVERLAY_DISMISSED,
1142
1131
  selector="<none>",
@@ -1516,7 +1505,7 @@ class UiAutomationTransport(VideoGenerationMixin):
1516
1505
  await input_box.press("Control+A")
1517
1506
  await input_box.press("Delete")
1518
1507
  await input_box.press_sequentially(full_prompt)
1519
- await page.wait_for_timeout(500)
1508
+ await page.wait_for_timeout(_jitter_ms(500))
1520
1509
 
1521
1510
  # Readback guard — abort BEFORE submit if the typing landed in the
1522
1511
  # portrait box (mode switch not settled → the 2026-07-25 corruption).
@@ -95,8 +95,11 @@ def _print_login_instructions() -> None:
95
95
  " Signing in to Google is NOT enough; gflow needs a completed Flow app sign-in.",
96
96
  )
97
97
  _console.print(
98
- "4. Then [bold yellow]CLOSE THE BROWSER[/bold yellow] — gflow verifies "
99
- "the Flow session automatically.",
98
+ "4. When you're finished, simply [bold]close the Chrome window[/bold] — "
99
+ "that's how you let gflow know you're done.",
100
+ )
101
+ _console.print(
102
+ " gflow then verifies your Flow session automatically; there's nothing else to do.",
100
103
  )
101
104
  _console.print("-" * 60)
102
105
  _console.print("Launching Chrome...")