gflow-cli 0.63.0__tar.gz → 0.64.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 (860) hide show
  1. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.codex-plugin/plugin.json +1 -1
  2. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/AGENTS.md +29 -1
  3. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/CHANGELOG.md +57 -1
  4. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/PKG-INFO +1 -1
  5. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/INDEX.md +1 -1
  6. gflow_cli-0.64.0/docs/LIVE_VERIFICATION_v0.64.0.md +112 -0
  7. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/MCP.md +1 -1
  8. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/PROJECT_STATUS.md +46 -0
  9. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/USAGE.md +14 -9
  10. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/pyproject.toml +1 -1
  11. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/skills/check/SKILL.md +77 -0
  12. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/skills/doc-review/SKILL.md +16 -0
  13. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/skills/issue-assessment/SKILL.md +9 -0
  14. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/skills/live-verify/SKILL.md +8 -0
  15. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/skills/plan/SKILL.md +9 -4
  16. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/skills/pr-council-review/SKILL.md +11 -0
  17. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/skills/predict/SKILL.md +3 -2
  18. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/skills/scenario/SKILL.md +16 -5
  19. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/__init__.py +1 -1
  20. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/api/transports/ui_automation_video.py +85 -52
  21. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/api/video.py +4 -27
  22. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/chain.py +7 -4
  23. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/cli_video.py +12 -21
  24. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/errors.py +19 -14
  25. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/mcp/tools.py +4 -3
  26. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_video.py +11 -20
  27. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/transports/test_ui_automation_video.py +116 -36
  28. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/cli/test_cli_video.py +51 -36
  29. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/uv.lock +1 -1
  30. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/website/docs/MCP.md +1 -1
  31. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/website/docs/USAGE.md +14 -9
  32. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.agents/plugins/marketplace.json +0 -0
  33. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.claude/README.md +0 -0
  34. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.claude/commands/gflow/active.md +0 -0
  35. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.claude/commands/gflow/branch-review.md +0 -0
  36. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.claude/commands/gflow/changelog.md +0 -0
  37. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.claude/commands/gflow/check.md +0 -0
  38. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.claude/commands/gflow/doc-review.md +0 -0
  39. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.claude/commands/gflow/issue-assessment.md +0 -0
  40. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.claude/commands/gflow/issue-resolve.md +0 -0
  41. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.claude/commands/gflow/known-issues.md +0 -0
  42. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.claude/commands/gflow/live-verify.md +0 -0
  43. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.claude/commands/gflow/llm-council.md +0 -0
  44. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.claude/commands/gflow/next.md +0 -0
  45. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.claude/commands/gflow/plan.md +0 -0
  46. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.claude/commands/gflow/pr-council-review.md +0 -0
  47. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.claude/commands/gflow/predict.md +0 -0
  48. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.claude/commands/gflow/release.md +0 -0
  49. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.claude/commands/gflow/scenario.md +0 -0
  50. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.claude/commands/gflow/sonar.md +0 -0
  51. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.claude/commands/gflow/status.md +0 -0
  52. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.env.template +0 -0
  53. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.gitattributes +0 -0
  54. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.github/CODEOWNERS +0 -0
  55. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.github/FUNDING.yml +0 -0
  56. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  57. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.github/copilot-instructions.md +0 -0
  58. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.github/dependabot.yml +0 -0
  59. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.github/workflows/ci.yml +0 -0
  60. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.github/workflows/deps-watch.yml +0 -0
  61. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.github/workflows/external-pr-triage.yml +0 -0
  62. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.github/workflows/governance-advisory.yml +0 -0
  63. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.github/workflows/governance-benchmark.yml +0 -0
  64. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.github/workflows/labels.yml +0 -0
  65. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.github/workflows/main-base-guard.yml +0 -0
  66. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.github/workflows/pages.yml +0 -0
  67. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.github/workflows/release.yml +0 -0
  68. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.github/workflows/scorecard.yml +0 -0
  69. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.github/workflows/selector-probe.yml +0 -0
  70. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.gitignore +0 -0
  71. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.gitleaks.toml +0 -0
  72. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.pre-commit-config.yaml +0 -0
  73. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/.secrets.baseline +0 -0
  74. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/CLAUDE.md +0 -0
  75. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/CONFIGURATION.md +0 -0
  76. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/CONTRIBUTING.md +0 -0
  77. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/DISCLAIMER.md +0 -0
  78. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/KNOWN_ISSUES.md +0 -0
  79. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/LICENSE +0 -0
  80. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/PLAN.md +0 -0
  81. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/README.md +0 -0
  82. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/RELEASE.md +0 -0
  83. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/ROADMAP.md +0 -0
  84. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/conftest.py +0 -0
  85. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/deploy/PR-TRIAGE-AUTOPILOT-OPS.md +0 -0
  86. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/deploy/logrotate-pr-triage +0 -0
  87. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docker-compose.yml +0 -0
  88. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/ACCOUNT_SAFETY.md +0 -0
  89. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/AGENT_GUIDE.md +0 -0
  90. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/AGENT_UI_E2E.md +0 -0
  91. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/AGENT_UI_RECON.md +0 -0
  92. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/ARCHITECTURE.md +0 -0
  93. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/ASSET_TAGGING_RECON.md +0 -0
  94. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/AUTHENTICATION.md +0 -0
  95. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/CHARACTER.md +0 -0
  96. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/CHARACTER_RECON.md +0 -0
  97. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/CONFIGURATION.md +0 -0
  98. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/DATA_LAYER.md +0 -0
  99. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/DEBUGGING.md +0 -0
  100. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/DEMOS.md +0 -0
  101. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/DEVELOPMENT.md +0 -0
  102. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/E2E_TESTING.md +0 -0
  103. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/EXTERNAL_STORAGE.md +0 -0
  104. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/GITHUB.md +0 -0
  105. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
  106. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
  107. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/INSTRUCTIONS.md +0 -0
  108. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
  109. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
  110. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_playwright_1.61.md +0 -0
  111. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
  112. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
  113. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
  114. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
  115. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
  116. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
  117. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
  118. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
  119. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
  120. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
  121. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.21.0.md +0 -0
  122. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.22.0.md +0 -0
  123. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.23.0.md +0 -0
  124. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.24.0.md +0 -0
  125. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.25.0.md +0 -0
  126. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.26.0.md +0 -0
  127. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.27.0.md +0 -0
  128. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.27.1.md +0 -0
  129. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.28.0.md +0 -0
  130. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.29.0.md +0 -0
  131. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.30.0.md +0 -0
  132. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.31.0.md +0 -0
  133. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.32.0.md +0 -0
  134. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.32.1.md +0 -0
  135. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.33.0.md +0 -0
  136. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.34.0.md +0 -0
  137. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.35.0.md +0 -0
  138. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.36.0.md +0 -0
  139. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.37.0.md +0 -0
  140. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.38.0.md +0 -0
  141. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.38.1.md +0 -0
  142. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.39.0.md +0 -0
  143. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.40.0-production-readiness.md +0 -0
  144. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.40.0.md +0 -0
  145. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.41.0.md +0 -0
  146. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.42.0.md +0 -0
  147. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.43.0.md +0 -0
  148. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.44.0.md +0 -0
  149. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.45.0.md +0 -0
  150. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.46.0.md +0 -0
  151. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.46.1.md +0 -0
  152. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.47.0.md +0 -0
  153. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.48.0.md +0 -0
  154. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.49.0.md +0 -0
  155. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.50.0.md +0 -0
  156. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.51.0.md +0 -0
  157. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.52.0.md +0 -0
  158. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.54.0.md +0 -0
  159. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.55.0.md +0 -0
  160. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.56.0.md +0 -0
  161. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.57.0.md +0 -0
  162. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.57.1.md +0 -0
  163. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.58.0.md +0 -0
  164. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.59.0.md +0 -0
  165. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.60.0.md +0 -0
  166. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.61.0.md +0 -0
  167. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.62.0.md +0 -0
  168. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.62.1.md +0 -0
  169. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.63.0.md +0 -0
  170. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
  171. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
  172. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
  173. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
  174. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
  175. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/MEDIA_LIBRARY.md +0 -0
  176. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/MOVIE.md +0 -0
  177. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/PROMPT_EXPANSION.md +0 -0
  178. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/REFERENCE_STRATEGIES.md +0 -0
  179. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/SECURITY.md +0 -0
  180. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/TOOLS.md +0 -0
  181. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/USER_GUIDE.md +0 -0
  182. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/assets/demo-split-pf.gif +0 -0
  183. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/assets/example-run.gif +0 -0
  184. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/assets/examples.webp +0 -0
  185. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/medium_tutorial.md +0 -0
  186. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/schemas/movie-handoff.schema.json +0 -0
  187. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/sonar-cleanup-tracker.md +0 -0
  188. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
  189. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +0 -0
  190. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +0 -0
  191. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +0 -0
  192. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +0 -0
  193. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +0 -0
  194. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +0 -0
  195. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +0 -0
  196. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +0 -0
  197. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +0 -0
  198. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-07-08-pr-triage-autopilot/PLAN.md +0 -0
  199. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-07-09-camoufox-adoption/PLAN.md +0 -0
  200. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-07-14-storyboarding-and-visual-curation/PLAN.md +0 -0
  201. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-07-18-asset-tagging/PLAN.md +0 -0
  202. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-07-19-live-verify/PLAN.md +0 -0
  203. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-07-19-production-readiness-browser-lifecycle.md +0 -0
  204. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-07-19-production-readiness-driver-cdp-verification.md +0 -0
  205. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-07-19-production-readiness-public-truth.md +0 -0
  206. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-07-19-production-readiness-queue-safety.md +0 -0
  207. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-07-26-character-prompt-polishing/PLAN.md +0 -0
  208. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-07-26-project-name-management/PLAN.md +0 -0
  209. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-07-26-self-documenting-errors/PLAN.md +0 -0
  210. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-07-27-overlay-banner-dismissal/PLAN.md +0 -0
  211. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/PLAN.md +0 -0
  212. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/SCENARIO.md +0 -0
  213. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-08-04-mcp-tasks/PLAN.md +0 -0
  214. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-08-04-output-hardening/PLAN.md +0 -0
  215. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-08-05-issue-317-intra-batch-references/PLAN.md +0 -0
  216. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-08-05-issue-317-intra-batch-references/SCENARIO.md +0 -0
  217. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-08-05-issue-402-entity-provenance/PLAN.md +0 -0
  218. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-08-05-issue-402-entity-provenance/SCENARIO.md +0 -0
  219. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-08-05-issue-451-duration-tab-drift/PLAN.md +0 -0
  220. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-08-05-issue-451-duration-tab-drift/SCENARIO.md +0 -0
  221. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-08-06-driver-delay-jittering/PLAN.md +0 -0
  222. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-08-06-driver-delay-jittering/SCENARIO.md +0 -0
  223. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-08-06-overlay-changelog-watermark/PLAN.md +0 -0
  224. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-08-06-overlay-changelog-watermark/SCENARIO.md +0 -0
  225. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-08-06-ui-mode-policy/PLAN.md +0 -0
  226. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-08-06-ui-mode-policy/SCENARIO.md +0 -0
  227. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-08-14-video-ui-mode-policy/PLAN.md +0 -0
  228. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-08-14-video-ui-mode-policy/SCENARIO.md +0 -0
  229. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-08-21-selector-registry.md +0 -0
  230. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-08-25-workflow-hardening-gaps.md +0 -0
  231. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/plans/2026-09-01-video-extend/PLAN.md +0 -0
  232. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/research/2026-06-27-tool-abstraction-evaluation.md +0 -0
  233. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/specs/2026-06-29-issue-assessment-workflow-design.md +0 -0
  234. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/specs/2026-07-04-pr-triage-autopilot-design.md +0 -0
  235. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/specs/2026-07-18-asset-tagging-design.md +0 -0
  236. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/specs/2026-07-19-live-verify-design.md +0 -0
  237. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/specs/2026-07-19-production-readiness-hardening-design.md +0 -0
  238. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/specs/2026-08-21-selector-registry-design.md +0 -0
  239. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/specs/2026-08-26-model-attribution-provenance.md +0 -0
  240. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/specs/2026-08-26-model-cost-quota-catalog.md +0 -0
  241. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/specs/2026-08-27-changelog-modal-precondition-design.md +0 -0
  242. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/spikes/2026-07-09-camoufox-waf-403.md +0 -0
  243. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/spikes/2026-07-12-ui-cohort-backend-config.md +0 -0
  244. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/spikes/2026-07-17-production-readiness-assessment.md +0 -0
  245. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/spikes/2026-08-01-mcp-2026-07-28-spec-impact.md +0 -0
  246. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/spikes/2026-08-14-video-model-capability-matrix.md +0 -0
  247. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/spikes/2026-08-15-picker-tile-alt-text.md +0 -0
  248. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/docs/superpowers/spikes/2026-08-31-veo-extend-route-recon.md +0 -0
  249. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/eval/pr_triage_eval.py +0 -0
  250. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/eval/pr_triage_fixtures.json +0 -0
  251. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/examples/README.md +0 -0
  252. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/examples/batch_from_config.py +0 -0
  253. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/examples/multi_prompt_t2i.py +0 -0
  254. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/examples/sample_config.json +0 -0
  255. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/examples/sample_prompts.txt +0 -0
  256. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/examples/single_image_t2i.py +0 -0
  257. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/examples/workflow_chain.py +0 -0
  258. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/index.html +0 -0
  259. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/llms.txt +0 -0
  260. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/samples/README.md +0 -0
  261. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/samples/captured/01_upload_image.json +0 -0
  262. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
  263. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
  264. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/samples/captured/04_archive_workflow.json +0 -0
  265. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/samples/captured/05_createProject.json +0 -0
  266. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/samples/captured/06_batchGenerateImages.json +0 -0
  267. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
  268. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
  269. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
  270. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
  271. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
  272. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/samples/captured/12_create_scene.json +0 -0
  273. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
  274. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/samples/captured/14_get_scene_workflows.json +0 -0
  275. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
  276. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/autopilot/Dockerfile.triage +0 -0
  277. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/autopilot/entrypoint.sh +0 -0
  278. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/autopilot/package-lock.json +0 -0
  279. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/autopilot/package.json +0 -0
  280. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/autopilot/pr_triage_autopilot.py +0 -0
  281. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/autopilot/pr_triage_gate.py +0 -0
  282. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/autopilot/run_sandboxed_review.sh +0 -0
  283. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/canary/register_task.ps1 +0 -0
  284. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/canary/run_canary.py +0 -0
  285. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/ci/check_doc_links.py +0 -0
  286. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/ci/check_materiality.py +0 -0
  287. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/ci/check_release_artifacts.py +0 -0
  288. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/ci/check_repo_hygiene.py +0 -0
  289. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/ci/check_test_count.py +0 -0
  290. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/ci/check_website_docs_pii.py +0 -0
  291. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/ci/generate_website_docs.py +0 -0
  292. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/debug_editor.py +0 -0
  293. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/debug_gen_settings.py +0 -0
  294. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/debug_settings.py +0 -0
  295. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/_recording_client.py +0 -0
  296. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/_spike_common.py +0 -0
  297. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/active_plan.py +0 -0
  298. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/analyze_agent_ui_capture.py +0 -0
  299. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/capture_frames_mode_trigger_ligature.py +0 -0
  300. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
  301. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
  302. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
  303. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
  304. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
  305. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/capture_locale_invariants.py +0 -0
  306. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/capture_lower_priority_model_cost.py +0 -0
  307. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/capture_project_listing.py +0 -0
  308. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/capture_r2v_ingredient_lifecycle.py +0 -0
  309. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/capture_sidebar_state_dom.py +0 -0
  310. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/capture_video_model_capability_matrix.py +0 -0
  311. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
  312. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/character_create_spike.py +0 -0
  313. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/character_create_spike_v2.py +0 -0
  314. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/dump_character_selectors.js +0 -0
  315. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/incident_bundle_quality.py +0 -0
  316. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/live_verify_mcp_tasks.py +0 -0
  317. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/live_verify_policy_400_v060.py +0 -0
  318. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/live_verify_video_model_select.py +0 -0
  319. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/make_project.py +0 -0
  320. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/materiality_backtest.py +0 -0
  321. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/measure_locale_probe.py +0 -0
  322. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/patch_character.py +0 -0
  323. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/skillopt/README.md +0 -0
  324. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/skillopt/harness.py +0 -0
  325. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/skillopt/tasks.json +0 -0
  326. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/sonar-local-scan.sh +0 -0
  327. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/sonar-pre-push-gate.sh +0 -0
  328. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/spike_changelog_capture.py +0 -0
  329. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/spike_char_editor_dom.py +0 -0
  330. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/spike_char_gen_capture.py +0 -0
  331. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/spike_character_prompt_format.py +0 -0
  332. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/spike_extend_model_recon.py +0 -0
  333. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/spike_extend_ourstack_verify.py +0 -0
  334. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/spike_extend_route_capture.py +0 -0
  335. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/spike_extend_submit_capture.py +0 -0
  336. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/spike_extend_ui_recon.py +0 -0
  337. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
  338. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
  339. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
  340. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
  341. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/spike_incident_live.py +0 -0
  342. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
  343. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
  344. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/spike_issue313_agent_mode_controls.py +0 -0
  345. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/spike_issue314_picker_filename_search.py +0 -0
  346. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/spike_issue404_count_tabs_recon.py +0 -0
  347. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/spike_locale_poison.py +0 -0
  348. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/spike_mode_roundtrip.py +0 -0
  349. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/spike_mode_switch_agentic_to_classic.py +0 -0
  350. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/spike_model_inventory.py +0 -0
  351. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
  352. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
  353. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
  354. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/spike_movie_picker_select.py +0 -0
  355. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/spike_movie_voice_list.py +0 -0
  356. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/spike_omni_flash_i2v_ui_recon.py +0 -0
  357. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/spike_patch_entity.py +0 -0
  358. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/spike_patchright.py +0 -0
  359. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/spike_trpc_origin_referer_401.py +0 -0
  360. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/spike_video_tab_dom.py +0 -0
  361. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/verify_language_agnostic.py +0 -0
  362. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/verify_locale_navigation_race.py +0 -0
  363. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/dev/verify_model_attribution.py +0 -0
  364. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/diag/README.md +0 -0
  365. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/diag/capture_flow_traffic.py +0 -0
  366. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/diag/diag_aisandbox_bearer.py +0 -0
  367. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/diag/memory_profile.py +0 -0
  368. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/diag/recaptcha_mint.py +0 -0
  369. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/diag/spike_387_openai_compat.py +0 -0
  370. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
  371. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/e2e/capture_agent_toggle.py +0 -0
  372. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/probe/run_probe.py +0 -0
  373. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/probe/spike_auth_matrix.py +0 -0
  374. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/record_demo.ps1 +0 -0
  375. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/smoke_image.py +0 -0
  376. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/smoke_video_editor.py +0 -0
  377. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/smoke_worker_style.py +0 -0
  378. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/spike_waf_camoufox.py +0 -0
  379. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/scripts/verify_chrome_auth_viability.py +0 -0
  380. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/skills/README.md +0 -0
  381. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/skills/changelog/SKILL.md +0 -0
  382. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/skills/gflow-cli/SKILL.md +0 -0
  383. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/skills/issue-resolve/SKILL.md +0 -0
  384. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/skills/known-issues/SKILL.md +0 -0
  385. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/skills/llm-council/SKILL.md +0 -0
  386. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/skills/release/SKILL.md +0 -0
  387. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/skills/sonar/SKILL.md +0 -0
  388. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/skills/status/SKILL.md +0 -0
  389. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/sonar-project.properties +0 -0
  390. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/__main__.py +0 -0
  391. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/_cli_helpers.py +0 -0
  392. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/api/__init__.py +0 -0
  393. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/api/_engine.py +0 -0
  394. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/api/_retry.py +0 -0
  395. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
  396. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/api/character.py +0 -0
  397. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/api/client.py +0 -0
  398. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/api/dto.py +0 -0
  399. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/api/extend_chain.py +0 -0
  400. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/api/image.py +0 -0
  401. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/api/image_upscale.py +0 -0
  402. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/api/recaptcha.py +0 -0
  403. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/api/routes.py +0 -0
  404. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/api/scene.py +0 -0
  405. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/api/transports/__init__.py +0 -0
  406. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/api/transports/_common.py +0 -0
  407. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
  408. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/api/transports/base.py +0 -0
  409. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
  410. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/api/transports/drivers/agentic.py +0 -0
  411. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/api/transports/drivers/base.py +0 -0
  412. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/api/transports/drivers/classic.py +0 -0
  413. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/api/transports/drivers/factory.py +0 -0
  414. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
  415. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
  416. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
  417. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
  418. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/api/transports/mode_control.py +0 -0
  419. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/api/transports/ui_automation.py +0 -0
  420. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/api/video_extend.py +0 -0
  421. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/auth/__init__.py +0 -0
  422. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/auth/base.py +0 -0
  423. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/auth/cookies.py +0 -0
  424. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/auth/factory.py +0 -0
  425. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
  426. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/auth/real_chrome.py +0 -0
  427. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/auth/strategies.py +0 -0
  428. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/auth/verification.py +0 -0
  429. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/browser_manager.py +0 -0
  430. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/chain_manifest.py +0 -0
  431. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/cli.py +0 -0
  432. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/cli_character.py +0 -0
  433. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/cli_data.py +0 -0
  434. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/cli_doctor.py +0 -0
  435. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/cli_image.py +0 -0
  436. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/cli_instructions.py +0 -0
  437. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/cli_models.py +0 -0
  438. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/cli_movie.py +0 -0
  439. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/cli_project.py +0 -0
  440. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/cli_run.py +0 -0
  441. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/cli_scene.py +0 -0
  442. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/cli_tools.py +0 -0
  443. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/composition.py +0 -0
  444. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/config.py +0 -0
  445. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/data/__init__.py +0 -0
  446. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/data/chain_repo.py +0 -0
  447. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
  448. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
  449. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
  450. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
  451. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
  452. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
  453. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/data/migrations/0007_queue.sql +0 -0
  454. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/data/migrations/0008_add_operation_expanded_prompt.sql +0 -0
  455. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/data/migrations/0009_queue_claims.sql +0 -0
  456. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
  457. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/data/models.py +0 -0
  458. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/data/queries.py +0 -0
  459. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/data/recorder.py +0 -0
  460. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/data/redaction.py +0 -0
  461. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/data/repository.py +0 -0
  462. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/data/store.py +0 -0
  463. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/diagnostics.py +0 -0
  464. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/exceptions.py +0 -0
  465. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/file_integrity.py +0 -0
  466. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/flow_selectors/__init__.py +0 -0
  467. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/flow_selectors/grading.py +0 -0
  468. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/flow_selectors/model.py +0 -0
  469. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/flow_selectors/registry.py +0 -0
  470. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/image_batch.py +0 -0
  471. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/json_output.py +0 -0
  472. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/mcp/__init__.py +0 -0
  473. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/mcp/prompts.py +0 -0
  474. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/mcp/resources.py +0 -0
  475. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/mcp/server.py +0 -0
  476. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/mcp/setup.py +0 -0
  477. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/mcp/tasks_extension.py +0 -0
  478. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/media.py +0 -0
  479. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/movie_manifest.py +0 -0
  480. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/observability.py +0 -0
  481. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/paths.py +0 -0
  482. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/profile_lease.py +0 -0
  483. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/profile_store.py +0 -0
  484. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/redaction.py +0 -0
  485. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/services/__init__.py +0 -0
  486. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/services/catalog_sync.py +0 -0
  487. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/services/character_create.py +0 -0
  488. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/services/doctor.py +0 -0
  489. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/services/mentions.py +0 -0
  490. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/storage.py +0 -0
  491. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/tools/__init__.py +0 -0
  492. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/tools/banned.py +0 -0
  493. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/tools/builtin/__init__.py +0 -0
  494. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/tools/builtin/creative-director.toml +0 -0
  495. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/tools/builtin/reverse-engineer.toml +0 -0
  496. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/tools/builtin/storyboard.toml +0 -0
  497. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/tools/expander.py +0 -0
  498. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/tools/invocation.py +0 -0
  499. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/tools/loader.py +0 -0
  500. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/tools/registry.py +0 -0
  501. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/tools/runtime.py +0 -0
  502. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/tools/spec.py +0 -0
  503. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/ui/app.py +0 -0
  504. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/ui/server.py +0 -0
  505. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/update_check.py +0 -0
  506. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/winsec.py +0 -0
  507. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/worker/codec.py +0 -0
  508. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/worker/daemon.py +0 -0
  509. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/src/gflow_cli/worker/queue.py +0 -0
  510. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tasks/lessons.md +0 -0
  511. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/test_assets/sample_batch.json +0 -0
  512. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/test_assets/sample_batch.tsv +0 -0
  513. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/test_assets/sample_batch_invalid.tsv +0 -0
  514. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/__init__.py +0 -0
  515. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/__init__.py +0 -0
  516. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/fixtures/character_gen_response.json +0 -0
  517. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/fixtures/patch_entity_response.json +0 -0
  518. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/fixtures/project_initial_data_extend_models.json +0 -0
  519. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_aisandbox_auth_error.py +0 -0
  520. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
  521. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_bearer_redaction.py +0 -0
  522. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_character.py +0 -0
  523. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_client.py +0 -0
  524. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_client_character.py +0 -0
  525. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_client_delete_characters.py +0 -0
  526. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_client_errors.py +0 -0
  527. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_client_extend.py +0 -0
  528. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_client_generate_character.py +0 -0
  529. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_client_image.py +0 -0
  530. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_client_incidents.py +0 -0
  531. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_client_launch_kwargs.py +0 -0
  532. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_client_locale_cache.py +0 -0
  533. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_client_patch_entity.py +0 -0
  534. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_client_scene.py +0 -0
  535. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_client_upscale.py +0 -0
  536. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_concurrency.py +0 -0
  537. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_dto.py +0 -0
  538. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_engine.py +0 -0
  539. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_extend_chain.py +0 -0
  540. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_image.py +0 -0
  541. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_image_dto.py +0 -0
  542. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_image_upscale.py +0 -0
  543. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_post_json_aisandbox_auth.py +0 -0
  544. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_recaptcha.py +0 -0
  545. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_retry.py +0 -0
  546. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_routes.py +0 -0
  547. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_routes_character.py +0 -0
  548. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_routes_locale.py +0 -0
  549. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_routes_scene.py +0 -0
  550. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_sapisidhash_helper.py +0 -0
  551. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_scene_models.py +0 -0
  552. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_video_extend.py +0 -0
  553. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_video_request.py +0 -0
  554. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/test_video_status_poll.py +0 -0
  555. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/transports/__init__.py +0 -0
  556. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/transports/conftest.py +0 -0
  557. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/transports/drivers/__init__.py +0 -0
  558. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/transports/drivers/test_agentic.py +0 -0
  559. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/transports/drivers/test_classic.py +0 -0
  560. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/transports/drivers/test_factory.py +0 -0
  561. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/transports/drivers/test_ui_mode.py +0 -0
  562. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/transports/test_agentic_cohort_detection.py +0 -0
  563. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/transports/test_base.py +0 -0
  564. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/transports/test_bearer.py +0 -0
  565. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/transports/test_common.py +0 -0
  566. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
  567. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/transports/test_factory.py +0 -0
  568. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/transports/test_fingerprint.py +0 -0
  569. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/transports/test_locale_navigation.py +0 -0
  570. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/transports/test_mode_control.py +0 -0
  571. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/transports/test_model_selection_loud.py +0 -0
  572. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/transports/test_navigation_settled.py +0 -0
  573. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/transports/test_overlay_precondition.py +0 -0
  574. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/transports/test_policy_400.py +0 -0
  575. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/transports/test_sapisidhash.py +0 -0
  576. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/transports/test_selector_symmetry.py +0 -0
  577. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/transports/test_transport_timeout.py +0 -0
  578. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/transports/test_ui_automation.py +0 -0
  579. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/transports/test_ui_automation_batch.py +0 -0
  580. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
  581. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/transports/test_ui_character_editor.py +0 -0
  582. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/api/transports/test_video_model_selection_loud.py +0 -0
  583. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/auth/strategies/test_factory.py +0 -0
  584. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/auth/strategies/test_strategies.py +0 -0
  585. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/auth/test_cookies.py +0 -0
  586. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/auth/test_real_chrome.py +0 -0
  587. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/auth/test_verification.py +0 -0
  588. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/auth/test_windows_acl.py +0 -0
  589. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/autopilot/test_pr_triage_autopilot.py +0 -0
  590. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/cli/__init__.py +0 -0
  591. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/cli/test_auth_status.py +0 -0
  592. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/cli/test_cli_auth_list.py +0 -0
  593. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/cli/test_cli_character.py +0 -0
  594. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/cli/test_cli_character_create.py +0 -0
  595. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/cli/test_cli_data.py +0 -0
  596. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/cli/test_cli_data_errors.py +0 -0
  597. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/cli/test_cli_data_errors_retention.py +0 -0
  598. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/cli/test_cli_data_sync.py +0 -0
  599. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/cli/test_cli_doctor.py +0 -0
  600. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/cli/test_cli_image.py +0 -0
  601. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
  602. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/cli/test_cli_image_selector_drift.py +0 -0
  603. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/cli/test_cli_image_upscale.py +0 -0
  604. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/cli/test_cli_image_uuid_ref_enrichment.py +0 -0
  605. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/cli/test_cli_instructions.py +0 -0
  606. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/cli/test_cli_models.py +0 -0
  607. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/cli/test_cli_movie.py +0 -0
  608. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/cli/test_cli_run.py +0 -0
  609. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/cli/test_cli_scene.py +0 -0
  610. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/cli/test_cli_tools.py +0 -0
  611. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/cli/test_cli_video_chain.py +0 -0
  612. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/cli/test_cli_video_extend.py +0 -0
  613. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/cli/test_error_handling.py +0 -0
  614. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/cli/test_failure_funnel.py +0 -0
  615. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/cli/test_helpers.py +0 -0
  616. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/cli/test_incident_output.py +0 -0
  617. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/cli/test_movie_manifest.py +0 -0
  618. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/cli/test_movie_manifest_style_variants.py +0 -0
  619. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/cli/test_predictable_output.py +0 -0
  620. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/cli/test_run_with_handlers_interrupt.py +0 -0
  621. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/cli/test_settings_validation.py +0 -0
  622. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
  623. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/composition/test_character.py +0 -0
  624. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/composition/test_compose_prompt.py +0 -0
  625. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/composition/test_handoff.py +0 -0
  626. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/composition/test_style_variants.py +0 -0
  627. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/composition/test_style_variants_e2e.py +0 -0
  628. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/conftest.py +0 -0
  629. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/data/__init__.py +0 -0
  630. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/data/test_chain_repo.py +0 -0
  631. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/data/test_failure_recording.py +0 -0
  632. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/data/test_find_incomplete_character.py +0 -0
  633. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/data/test_models.py +0 -0
  634. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/data/test_null_columns_stay_null.py +0 -0
  635. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/data/test_packaging.py +0 -0
  636. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/data/test_recorder.py +0 -0
  637. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/data/test_recorder_character.py +0 -0
  638. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/data/test_redaction.py +0 -0
  639. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/data/test_repository.py +0 -0
  640. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/data/test_scene_persistence.py +0 -0
  641. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/data/test_settings_and_errors.py +0 -0
  642. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/data/test_store.py +0 -0
  643. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/data/test_store_migrations.py +0 -0
  644. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/dev/test_recording_client.py +0 -0
  645. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/e2e/__init__.py +0 -0
  646. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/e2e/conftest.py +0 -0
  647. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/e2e/test_agentic_count_enforcement_e2e.py +0 -0
  648. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
  649. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/e2e/test_asset_tagging_e2e.py +0 -0
  650. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
  651. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/e2e/test_cancellation_e2e.py +0 -0
  652. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/e2e/test_chain_e2e.py +0 -0
  653. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/e2e/test_character_create_e2e.py +0 -0
  654. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/e2e/test_classic_count_setter_e2e.py +0 -0
  655. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/e2e/test_crash_recovery_e2e.py +0 -0
  656. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/e2e/test_daemon_e2e.py +0 -0
  657. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/e2e/test_data_layer_e2e.py +0 -0
  658. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/e2e/test_data_sync_names_e2e.py +0 -0
  659. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/e2e/test_entity_provenance_e2e.py +0 -0
  660. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/e2e/test_entity_smuggling_e2e.py +0 -0
  661. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/e2e/test_i2v_flags_e2e.py +0 -0
  662. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/e2e/test_image_batch_e2e.py +0 -0
  663. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
  664. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/e2e/test_image_uuid_ref_e2e.py +0 -0
  665. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/e2e/test_incident_quality_e2e.py +0 -0
  666. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/e2e/test_json_output_e2e.py +0 -0
  667. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/e2e/test_live_agentic_instructions.py +0 -0
  668. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
  669. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/e2e/test_project_naming_e2e.py +0 -0
  670. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/e2e/test_refresh_on_miss_e2e.py +0 -0
  671. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/e2e/test_scene_compose_live.py +0 -0
  672. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/e2e/test_sidebar_recovery_e2e.py +0 -0
  673. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/e2e/test_tools_e2e.py +0 -0
  674. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/e2e/test_transports_e2e.py +0 -0
  675. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
  676. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/e2e/test_video_r2v_uuid_name_e2e.py +0 -0
  677. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
  678. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/__init__.py +0 -0
  679. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/asset_tagging.feature +0 -0
  680. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/auth.feature +0 -0
  681. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/auth_login.feature +0 -0
  682. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/character_create.feature +0 -0
  683. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/character_read.feature +0 -0
  684. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/conftest.py +0 -0
  685. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/duration_tab_drift.feature +0 -0
  686. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/entity_provenance.feature +0 -0
  687. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/image.feature +0 -0
  688. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/image_batch_references.feature +0 -0
  689. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/image_upscale.feature +0 -0
  690. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/incident_diagnostics.feature +0 -0
  691. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/instructions.feature +0 -0
  692. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/locale_picker_include.feature +0 -0
  693. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/mcp_tasks.feature +0 -0
  694. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/media_picker_tiers.feature +0 -0
  695. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/output_hardening.feature +0 -0
  696. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/test_asset_tagging_steps.py +0 -0
  697. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/test_auth_login_steps.py +0 -0
  698. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/test_auth_steps.py +0 -0
  699. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/test_character_create_steps.py +0 -0
  700. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/test_character_read_steps.py +0 -0
  701. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/test_image_steps.py +0 -0
  702. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/test_image_upscale_steps.py +0 -0
  703. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/test_incident_diagnostics_steps.py +0 -0
  704. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/test_instructions_steps.py +0 -0
  705. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/test_locale_picker_include_steps.py +0 -0
  706. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/test_mcp_tasks_steps.py +0 -0
  707. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/test_media_picker_tiers_steps.py +0 -0
  708. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/test_output_hardening_steps.py +0 -0
  709. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/test_step_collision_guard.py +0 -0
  710. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/test_video_agent_ui_steps.py +0 -0
  711. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/test_video_chain_steps.py +0 -0
  712. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/video_agent_ui.feature +0 -0
  713. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/features/video_chain.feature +0 -0
  714. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/fixtures/__init__.py +0 -0
  715. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/fixtures/changelog_modal_page.html +0 -0
  716. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/fixtures/doctor_env.py +0 -0
  717. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/fixtures/flow_model_inventory.json +0 -0
  718. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/fixtures/flow_project_listing_media.json +0 -0
  719. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/fixtures/listing_payload.py +0 -0
  720. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/fixtures/seeded_catalog.py +0 -0
  721. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/flow_selectors/__init__.py +0 -0
  722. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/flow_selectors/test_grading.py +0 -0
  723. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/flow_selectors/test_model.py +0 -0
  724. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/flow_selectors/test_model_governance.py +0 -0
  725. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/flow_selectors/test_registry.py +0 -0
  726. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/flow_selectors/test_report.py +0 -0
  727. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/image_batch/__init__.py +0 -0
  728. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/image_batch/test_image_manifest.py +0 -0
  729. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/image_batch/test_jitter_config.py +0 -0
  730. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/image_batch/test_observability_events.py +0 -0
  731. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/integration/__init__.py +0 -0
  732. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/integration/conftest.py +0 -0
  733. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/integration/constants.py +0 -0
  734. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/integration/test_expander_gateway.py +0 -0
  735. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/integration/test_storage_gcs.py +0 -0
  736. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/integration/test_storage_s3.py +0 -0
  737. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/mcp/__init__.py +0 -0
  738. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/mcp/conftest.py +0 -0
  739. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/mcp/test_auth_status_tool.py +0 -0
  740. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/mcp/test_cli_parity.py +0 -0
  741. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/mcp/test_error_funnel.py +0 -0
  742. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/mcp/test_http_transport.py +0 -0
  743. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/mcp/test_known_issues_resource.py +0 -0
  744. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/mcp/test_no_spend.py +0 -0
  745. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/mcp/test_rate_limit_envelope.py +0 -0
  746. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/mcp/test_resources.py +0 -0
  747. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/mcp/test_server.py +0 -0
  748. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/mcp/test_setup.py +0 -0
  749. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/mcp/test_stdio_transport.py +0 -0
  750. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/mcp/test_tasks_extension.py +0 -0
  751. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/mcp/test_tools_helpers.py +0 -0
  752. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/mcp/test_tools_instructions.py +0 -0
  753. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/mcp/test_tools_wired.py +0 -0
  754. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
  755. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/scripts/test_canary_classify.py +0 -0
  756. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/scripts/test_canary_reexec.py +0 -0
  757. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
  758. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/scripts/test_check_materiality.py +0 -0
  759. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/scripts/test_check_release_artifacts.py +0 -0
  760. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/scripts/test_check_repo_hygiene.py +0 -0
  761. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/scripts/test_check_test_count.py +0 -0
  762. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/scripts/test_check_website_docs_pii.py +0 -0
  763. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/scripts/test_codex_plugin.py +0 -0
  764. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/scripts/test_generate_website_docs.py +0 -0
  765. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/scripts/test_incident_bundle_quality.py +0 -0
  766. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/scripts/test_materiality_backtest.py +0 -0
  767. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/scripts/test_workflow_hardening.py +0 -0
  768. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/services/__init__.py +0 -0
  769. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/services/test_catalog_sync.py +0 -0
  770. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/services/test_character_create_redaction.py +0 -0
  771. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/services/test_character_create_saga.py +0 -0
  772. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
  773. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/services/test_doctor.py +0 -0
  774. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/services/test_media_attribution.py +0 -0
  775. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/services/test_mentions_observability.py +0 -0
  776. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/services/test_mentions_parse.py +0 -0
  777. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/services/test_mentions_resolve.py +0 -0
  778. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/services/test_resolve_and_apply.py +0 -0
  779. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/smoke/__init__.py +0 -0
  780. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/smoke/test_profile_account_smoke.py +0 -0
  781. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/smoke/test_real_flow.py +0 -0
  782. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_auth.py +0 -0
  783. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_browser_manager.py +0 -0
  784. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_chain.py +0 -0
  785. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_chain_manifest.py +0 -0
  786. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_cli_data.py +0 -0
  787. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_cli_project.py +0 -0
  788. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_config.py +0 -0
  789. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_conftest_isolation.py +0 -0
  790. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_data_queries.py +0 -0
  791. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_diagnostics_bundle.py +0 -0
  792. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_diagnostics_events.py +0 -0
  793. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_diagnostics_journal.py +0 -0
  794. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_diagnostics_recorder.py +0 -0
  795. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_diagnostics_retention.py +0 -0
  796. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_diagnostics_sanitize.py +0 -0
  797. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_documentation_gate.py +0 -0
  798. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_duration_tab_drift.py +0 -0
  799. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_entity_provenance.py +0 -0
  800. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_errors.py +0 -0
  801. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_errors_classification.py +0 -0
  802. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_image_batch_references.py +0 -0
  803. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_incident_generation_requests.py +0 -0
  804. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_json_output.py +0 -0
  805. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_marker_registry.py +0 -0
  806. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_media.py +0 -0
  807. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_observability.py +0 -0
  808. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_overlay_banner_dismissal.py +0 -0
  809. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_paths.py +0 -0
  810. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_playwright_pin.py +0 -0
  811. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_profile_lease.py +0 -0
  812. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_profile_lease_subprocess.py +0 -0
  813. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_profile_store.py +0 -0
  814. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_profile_store_locale.py +0 -0
  815. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_project_list_urls.py +0 -0
  816. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_self_documenting_errors.py +0 -0
  817. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_smoke.py +0 -0
  818. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/test_update_check.py +0 -0
  819. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/tools/__init__.py +0 -0
  820. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/tools/test_banned.py +0 -0
  821. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/tools/test_expander.py +0 -0
  822. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/tools/test_invocation.py +0 -0
  823. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/tools/test_loader.py +0 -0
  824. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/tools/test_registry.py +0 -0
  825. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/tools/test_runtime.py +0 -0
  826. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/tools/test_spec.py +0 -0
  827. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/ui/test_app.py +0 -0
  828. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/worker/test_codec.py +0 -0
  829. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/worker/test_daemon.py +0 -0
  830. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/worker/test_mcp_daemon_race.py +0 -0
  831. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/worker/test_queue.py +0 -0
  832. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/worker/test_queue_multiprocess.py +0 -0
  833. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/tests/worker/test_queue_reconciliation.py +0 -0
  834. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/website/docs/ACCOUNT_SAFETY.md +0 -0
  835. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/website/docs/ARCHITECTURE.md +0 -0
  836. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/website/docs/AUTHENTICATION.md +0 -0
  837. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/website/docs/CHARACTER.md +0 -0
  838. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/website/docs/CONFIGURATION.md +0 -0
  839. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/website/docs/DATA_LAYER.md +0 -0
  840. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/website/docs/DEBUGGING.md +0 -0
  841. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/website/docs/DEVELOPMENT.md +0 -0
  842. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/website/docs/E2E_TESTING.md +0 -0
  843. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/website/docs/EXTERNAL_STORAGE.md +0 -0
  844. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/website/docs/INSTRUCTIONS.md +0 -0
  845. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/website/docs/KNOWN_ISSUES.md +0 -0
  846. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/website/docs/MEDIA_LIBRARY.md +0 -0
  847. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/website/docs/MOVIE.md +0 -0
  848. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/website/docs/PROMPT_EXPANSION.md +0 -0
  849. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/website/docs/SECURITY.md +0 -0
  850. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/website/docs/TOOLS.md +0 -0
  851. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/website/docs/USER_GUIDE.md +0 -0
  852. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/website/docs/agents.md +0 -0
  853. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/website/docs/index.md +0 -0
  854. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/website/docs/installation.md +0 -0
  855. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/website/docs/onboarding-mockup.html +0 -0
  856. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/website/docs/onboarding.md +0 -0
  857. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/website/docs/stylesheets/extra.css +0 -0
  858. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/website/mkdocs.yml +0 -0
  859. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/website/requirements.in +0 -0
  860. {gflow_cli-0.63.0 → gflow_cli-0.64.0}/website/requirements.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gflow",
3
- "version": "0.63.0",
3
+ "version": "0.64.0",
4
4
  "description": "Reusable development and operations workflows for gflow-cli",
5
5
  "author": {
6
6
  "name": "Flavio Oliva",
@@ -75,13 +75,21 @@ $env:PYTHONUTF8=1
75
75
  uv run python scripts/ci/check_repo_hygiene.py
76
76
  uv run python scripts/ci/check_doc_links.py
77
77
  uv run python scripts/ci/check_website_docs_pii.py
78
+ uv run python scripts/ci/generate_website_docs.py --check
78
79
  uv run ruff check src tests
79
80
  uv run ruff format --check src tests
80
81
  uv run pyright src
81
82
  uv run python -m pytest -q --cov=gflow_cli
82
83
  ```
83
84
 
84
- Or invoke the wrapper: `/gflow:check`.
85
+ Or invoke the wrapper: `/gflow:check` — **prefer it.** This list is the mechanical subset;
86
+ the skill additionally carries the **step 1b surface blast-radius sweep** (MCP↔CLI parity and
87
+ the five other mirror axes), which no command here can check and no CI gate can see.
88
+
89
+ > **Do not trim this list again.** It previously omitted
90
+ > `generate_website_docs.py --check`, so an agent following AGENTS.md instead of the skill
91
+ > shipped a stale `website/docs/` mirror to a green local run and a red CI (#626 session,
92
+ > 2026-09-02). Two lists that disagree means the shorter one is silently wrong.
85
93
 
86
94
  - Use `pytest -m "not live and not e2e and not smoke"` locally; full suite OOMs on small dev machines. Scope to changed dirs; trust CI for the full sweep.
87
95
  - TDD is non-negotiable. Coverage floor: 80% overall.
@@ -97,6 +105,26 @@ Or invoke the wrapper: `/gflow:check`.
97
105
  - 100-char line length, `ruff` configured. Imports sorted by `ruff` (isort rules).
98
106
  - **YAGNI / least-code**: prefer the smallest change that works. No speculative abstractions (interface/factory with one implementation), no config or flags nobody sets, no dead constants/helpers, no reinventing the stdlib. Review carries this as its own lens — the **D14 over-engineering** dimension of [`pr-council-review`](skills/pr-council-review/SKILL.md) (baseline, always runs). Its rubric is portable; the `ponytail` plugin (see CONTRIBUTING) is an optional accelerant, not a dependency.
99
107
  - **MCP & CLI Schema Symmetry**: Any updates or additions to user-facing CLI command parameters (e.g., `gflow image t2i`, `gflow video`) must be mirrored in the corresponding MCP tool definitions. Never add option/argument fields to Click commands without updating the MCP server implementation. This symmetry is enforced programmatically in CI via `tests/mcp/test_cli_parity.py` (every CLI leaf command needs a mapped MCP tool or an explicit, reasoned exemption) plus the schema checks in `tests/mcp/test_server.py`.
108
+
109
+ **That CI gate is command-level only** — it fires on a new *leaf*, and stays green while an
110
+ option goes unmirrored, a queued-payload key goes unread, or a tool docstring asserts a
111
+ restriction the CLI no longer has. So MCP is a responsibility of **every phase**, not a
112
+ post-hoc checklist item. Each skill owns its slice:
113
+
114
+ | Phase | Skill | Its MCP duty |
115
+ |---|---|---|
116
+ | 1 Triage | `issue-assessment` | Name which surfaces reproduce it — CLI, MCP, or both |
117
+ | 2 Pre-impl | `predict` | Persona 4 scopes the MCP blast radius before code exists |
118
+ | 3 BDD | `scenario` | **D13** — enumerate the MCP twin of every edge case |
119
+ | 4 Plan | `plan` | **Task 6 is not optional when task 5 exists** |
120
+ | 5 Review | `pr-council-review` | **D15** — surface parity, incl. the payload-key round trip |
121
+ | 7 Check | `check` | **Step 1b** — the canonical six mirror axes |
122
+ | 8 Live-verify | `live-verify` | The MCP queued path is *different code*; decide if it needs its own run |
123
+ | 10 Release | `doc-review` | Grade `docs/MCP.md` + tool docstrings; a **false** claim blocks |
124
+
125
+ The six mirror axes are written out **once**, in [`skills/check/SKILL.md`](skills/check/SKILL.md)
126
+ step 1b. Every other skill cites them. Do not copy the table around — a duplicated checklist
127
+ drifts, which is the exact failure this row exists to prevent.
100
128
  - **Locale-Invariance Discipline for UI Automation**: **Never** write text-label string selectors (`has-text(...)` or multi-locale text lists) for DOM elements, overlays, announcements, menus, tabs, or buttons. All DOM selectors in `src/gflow_cli/api/transports/` must be 100% language-agnostic, anchoring exclusively on structural properties: **Tier 1 Anchors** — e.g. hyperlinks (`a[href*='changelog']`), icon ligatures (`button:has(i.google-symbols:text('close'))`), ARIA roles (`[role='banner']`, `button[data-dismiss]`), and hierarchical DOM relationships (`[role='dialog']:has(a[href*='changelog']) button`). Relying on translated display labels or maintaining multi-locale text cascades is strictly forbidden as an anti-pattern hack.
101
129
 
102
130
  ## PR instructions
@@ -7,6 +7,61 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.64.0] — 2026-09-02
11
+
12
+ ### Added
13
+
14
+ - **`gflow video i2v --model omni-flash --end-frame` now works** ([#626](https://github.com/ffroliva/gflow-cli/issues/626)).
15
+ Google shipped first-and-last-frame generation for Omni 1.1 Flash, so the
16
+ guard that rejected that combination with exit 17 is gone:
17
+
18
+ ```bash
19
+ gflow video i2v ./start.png "she turns toward the window" \
20
+ --model omni-flash --end-frame ./end.png --duration 10
21
+ ```
22
+
23
+ omni-flash is the only model that also exposes `--duration`, so this is the
24
+ one route to a 10-second first+last interpolation.
25
+
26
+ ### Changed
27
+
28
+ - **i2v end-frame safety moved from a static table to a post-submit route
29
+ check.** gflow used to decide which models could carry an end frame from a
30
+ hardcoded capability list, which silently went stale when Google shipped the
31
+ feature. It now verifies the route Flow *actually* used: a run that carried an
32
+ end frame but came back on `batchAsyncGenerateVideoStartImage` — Flow dropping
33
+ the frame at submit and billing a clip that was never interpolated — fails
34
+ with `WireFormatError` instead of being reported as a success. This also
35
+ catches a partial or staged rollback on any account, which the old table
36
+ could not.
37
+
38
+ **Breaking for scripts** that branched on exit 17 for `omni-flash` +
39
+ `--end-frame`: that combination now succeeds. Exit 17 is unchanged for
40
+ `gflow video chain --model omni-flash`, which is still rejected (chain-scale
41
+ seeded i2v remains unverified).
42
+
43
+ - **MCP↔CLI parity is now a duty of every pipeline phase** (contributor-facing).
44
+ `tests/mcp/test_cli_parity.py` is command-level: it fires when a new CLI *leaf*
45
+ lacks a mapped MCP tool, and stays green while an option goes unmirrored, a
46
+ queued-payload key goes unread, or a tool docstring asserts a restriction the
47
+ CLI no longer has. #626 shipped exactly that third case — `mcp/tools.py` and
48
+ `docs/MCP.md` kept telling agents `omni_flash` was rejected for i2v-with-frames
49
+ through a fully green pipeline. Each skill now owns a slice: `issue-assessment`
50
+ names affected surfaces, `predict` scopes the MCP blast radius, `scenario` adds
51
+ **D13**, `plan` makes the MCP mirror **task 6** (not optional when task 5
52
+ exists), `pr-council-review` adds **D15**, `check` adds **step 1b** (the
53
+ canonical six mirror axes), `live-verify` treats the MCP queued path as
54
+ separate code, and `doc-review` grades a *false* MCP claim as release-blocking.
55
+ Automating the mechanically checkable part is tracked in
56
+ [#628](https://github.com/ffroliva/gflow-cli/issues/628).
57
+
58
+ ### Fixed
59
+
60
+ - **`AGENTS.md`'s Impeccable Routine was missing `generate_website_docs.py --check`**,
61
+ which `skills/check` already ran. Following the shorter list produced a green
62
+ local run against a stale `website/docs/` mirror and a red CI. The two lists now
63
+ agree.
64
+
10
65
  ## [0.63.0] — 2026-09-01
11
66
 
12
67
  ### Added
@@ -3515,7 +3570,8 @@ shell-script template that branches on these codes.
3515
3570
 
3516
3571
  First skeleton. Not functional end-to-end yet.
3517
3572
 
3518
- [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.63.0...HEAD
3573
+ [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.64.0...HEAD
3574
+ [0.64.0]: https://github.com/ffroliva/gflow-cli/compare/v0.63.0...v0.64.0
3519
3575
  [0.63.0]: https://github.com/ffroliva/gflow-cli/compare/v0.62.1...v0.63.0
3520
3576
  [0.62.1]: https://github.com/ffroliva/gflow-cli/compare/v0.62.0...v0.62.1
3521
3577
  [0.62.0]: https://github.com/ffroliva/gflow-cli/compare/v0.61.0...v0.62.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: gflow-cli
3
- Version: 0.63.0
3
+ Version: 0.64.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
@@ -155,7 +155,7 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
155
155
  **"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)
156
156
  **"Flow's UI broke a selector — how do I diagnose it?"** → [DEBUGGING § Inspecting Flow's live UI](DEBUGGING.md#inspecting-flows-live-ui)
157
157
  **"What does each `ui_automation.*` log event mean?"** → [DEBUGGING § Listener & HTTP-layer debugging](DEBUGGING.md#listener--http-layer-debugging)
158
- **What was actually live-verified for the latest release?** → latest: [LIVE_VERIFICATION_v0.63.0](LIVE_VERIFICATION_v0.63.0.md) (**`gflow video extend` — continuing a clip past Flow's 8s ceiling, verified 2026-09-01 on profile `ffroliva`, 20 Veo credits.** The decisive observation is that segment 2's `source_media_id` **is** segment 1's `media_id` (`0c9364f3…` seeded from `b9458021…`, then `648f9291…` seeded from `0c9364f3…`) — tail-only chaining, which no mock can establish; had it re-seeded from the source, the output would have been two divergent continuations of the same moment instead of one continuous shot. `extend_model_resolved` logged `candidate_count=99` against `SERVICE_TIER_INTERMEDIATE`, proving the key came from the live capability listing rather than a constant, and plan cost matched actual spend (`20 credits total, balance 875` → `Extended — 2/2 segment(s), 20 credits`). Render: 23.02s / 1280×720 / 24fps / h264+aac. **The run found a defect the offline suite is structurally incapable of seeing:** an extend segment carries **7.000000s** of content, not the 8 Flow advertises and bills, so server-side concat pads every internal seam with a frozen frame and digital silence (15s at −75.1 dB against −29 neighbours, reproduced on a second independent render) — filed in KNOWN_ISSUES with the three questions that must be answered before any clamp, and the reason `--extend N` on t2v/i2v was deliberately NOT shipped. Seven items are recorded as NOT verified rather than omitted: portrait `9:16`, `--aspect` against a mismatched source, chains longer than 2 segments, `--resume-from` against a live partial scene, the insufficient-credits refusal, a live Ctrl+C, and `OperationKind.EXTEND` rows.) · previous: [LIVE_VERIFICATION_v0.62.1](LIVE_VERIFICATION_v0.62.1.md) (**#604 `--model omni-flash` selects again after Flow's `Omni Flash` → `Omni 1.1 Flash` rename, verified 2026-08-30 on profile `ffroliva` at ZERO Veo credits.** The production `_select_video_model` was driven against the real picker: the shipped selector resolves verbatim — `model_selected model=omni_flash via="[role='menuitem']:has-text('Omni'):has-text('Flash'):not(:has-text('[Lower Priority]'))"` — and all six cases came back as expected: the four offered tiers SELECT, a tier Flow does not offer REFUSES, and a deliberately ambiguous selector REFUSES rather than resolving `.first`. Selection happens before submit, so the whole matrix is free. The transport's own refusal diagnostic read the live menu back as `Omni 1.1 Flash / Veo 3.1 - Lite / Fast / Quality`, independently corroborating the fixture. Four items are recorded as NOT verified rather than omitted: the rename *direction* [the `Omni Flash` baseline is a different account, locale and date], an actual `Omni ... [Lower Priority]` entry [Flow has never offered one], a full credit-spending generation on omni-flash, and #539's absence question, which stays open.) · previous: [LIVE_VERIFICATION_v0.62.0](LIVE_VERIFICATION_v0.62.0.md) (**#595 `auto` ≡ `classic` for images, verified 2026-08-28 on profile `ci-probe` — an account Flow had moved to the agentic cohort the day before — at ZERO Veo credits.** With no flags and no env vars the run logged `ui_driver.ui_mode.attempt_exit_agent` → `ui_driver.bound mode=classic ui_mode=classic` and generated a real 768x1376 JPEG (exit 0); the day before, the identical command on the same account bound `auto`→`agentic` and failed. The same log independently closed **#183**: `mode_switch_trigger` and `image_mode_tab`, the selectors it reported as unfindable, both matched. #591 was proven against the real 500-row catalog — **0** occurrences of the string `"None"`, 31 proper JSON `null`s, over a catalog holding 119 NULL-bearing rows. #592 shows exactly one `client.account_locale_cached` per command. Three items are recorded as NOT verified rather than omitted: the exit-28 abort on a *pinned* agentic account, the #597 batch inter-prompt guard, and any fresh announcement modal — the last two because all three accounts have already acked the current changelog, so no modal can be raised until Google ships the next one.) · previous: [LIVE_VERIFICATION_v0.61.0](LIVE_VERIFICATION_v0.61.0.md) (**#539 video-model refusal + #586 image-model refusal and server-side attribution, verified 2026-08-26/27 on profile `denon82`, ONE Veo generation total** — the video fix was proven by a **zero-credit A/B against the stashed pre-fix source running on live Flow**: the old code returned SELECTED for `veo-lite-lp`, a model Flow does not offer to this account, and for a deliberately ambiguous selector matching 3 entries; the new code refuses both with exit 18 naming what Flow offered. Model selection happens before submit, so refusals cost nothing and the A/B was free. The happy path still generates: `--model omni-flash` → exit 0, a real 2.2 MB `ftypisom` mp4, catalog recording `omni_flash`. Two items are recorded as NOT verified rather than omitted: three of #584's four navigation-settle sites were never exercised [no bearer refresh occurred in these runs], and #582's canary self-re-exec has its first real exercise tonight. Also falsified: #539's recorded note that the video picker uses a different trigger — the two constants are byte-identical strings, and the repeated empty menu captures were the capture's own fault.) · previous: [LIVE_VERIFICATION_v0.60.0](LIVE_VERIFICATION_v0.60.0.md)
158
+ **What was actually live-verified for the latest release?** → latest: [LIVE_VERIFICATION_v0.64.0](LIVE_VERIFICATION_v0.64.0.md) (**#626 `--model omni-flash --end-frame` — first+last interpolation on Omni 1.1 Flash, verified 2026-09-02.** The guard this release removes was evidence-gated, so it was retired on evidence: a route-aborted submit capture on **two distinct Google accounts** (`ffroliva`, `denon82`) fired `video:batchAsyncGenerateVideoStartAndEndImage` with `startImage` AND `endImage` non-null at **zero credits**, ruling out a single-account artifact. The decisive layer is semantic, not structural: the paid 4s generation's **last frame IS the supplied end image** and its first frame is the start image — two visibly different subjects — which is the only check that distinguishes "Flow bound the end frame" from "Flow accepted and ignored it", and which layers 1–4 would pass either way. Render: 4.01s / 720×1280 / h264+aac / 2.4 MB, `MEDIA_GENERATION_STATUS_SUCCESSFUL`. The static capability table is **deleted**, not corrected — it went stale silently once and would again; a post-submit route check (`_assert_i2v_route`) now fails a run whose end frame Flow dropped back to the `StartImage` route, catching a rollback on any account without anyone re-reading a support page. One item is recorded as NOT verified rather than omitted: `--duration 10` + end frame is **submit-verified only** (`duration_set seconds=10` on the correct route with both images bound), because the status poll returned HTTP 401 mid-run and a retry 401'd at `project.create` before submitting — [#561](https://github.com/ffroliva/gflow-cli/issues/561), pre-existing, so verification was stopped rather than spending further credits on an environmental fault.) · previous: [LIVE_VERIFICATION_v0.63.0](LIVE_VERIFICATION_v0.63.0.md) (**`gflow video extend` — continuing a clip past Flow's 8s ceiling, verified 2026-09-01 on profile `ffroliva`, 20 Veo credits.** The decisive observation is that segment 2's `source_media_id` **is** segment 1's `media_id` (`0c9364f3…` seeded from `b9458021…`, then `648f9291…` seeded from `0c9364f3…`) — tail-only chaining, which no mock can establish; had it re-seeded from the source, the output would have been two divergent continuations of the same moment instead of one continuous shot. `extend_model_resolved` logged `candidate_count=99` against `SERVICE_TIER_INTERMEDIATE`, proving the key came from the live capability listing rather than a constant, and plan cost matched actual spend (`20 credits total, balance 875` → `Extended — 2/2 segment(s), 20 credits`). Render: 23.02s / 1280×720 / 24fps / h264+aac. **The run found a defect the offline suite is structurally incapable of seeing:** an extend segment carries **7.000000s** of content, not the 8 Flow advertises and bills, so server-side concat pads every internal seam with a frozen frame and digital silence (15s at −75.1 dB against −29 neighbours, reproduced on a second independent render) — filed in KNOWN_ISSUES with the three questions that must be answered before any clamp, and the reason `--extend N` on t2v/i2v was deliberately NOT shipped. Seven items are recorded as NOT verified rather than omitted: portrait `9:16`, `--aspect` against a mismatched source, chains longer than 2 segments, `--resume-from` against a live partial scene, the insufficient-credits refusal, a live Ctrl+C, and `OperationKind.EXTEND` rows.) · previous: [LIVE_VERIFICATION_v0.62.1](LIVE_VERIFICATION_v0.62.1.md) (**#604 `--model omni-flash` selects again after Flow's `Omni Flash` → `Omni 1.1 Flash` rename, verified 2026-08-30 on profile `ffroliva` at ZERO Veo credits.** The production `_select_video_model` was driven against the real picker: the shipped selector resolves verbatim — `model_selected model=omni_flash via="[role='menuitem']:has-text('Omni'):has-text('Flash'):not(:has-text('[Lower Priority]'))"` — and all six cases came back as expected: the four offered tiers SELECT, a tier Flow does not offer REFUSES, and a deliberately ambiguous selector REFUSES rather than resolving `.first`. Selection happens before submit, so the whole matrix is free. The transport's own refusal diagnostic read the live menu back as `Omni 1.1 Flash / Veo 3.1 - Lite / Fast / Quality`, independently corroborating the fixture. Four items are recorded as NOT verified rather than omitted: the rename *direction* [the `Omni Flash` baseline is a different account, locale and date], an actual `Omni ... [Lower Priority]` entry [Flow has never offered one], a full credit-spending generation on omni-flash, and #539's absence question, which stays open.) · previous: [LIVE_VERIFICATION_v0.62.0](LIVE_VERIFICATION_v0.62.0.md) (**#595 `auto` ≡ `classic` for images, verified 2026-08-28 on profile `ci-probe` — an account Flow had moved to the agentic cohort the day before — at ZERO Veo credits.** With no flags and no env vars the run logged `ui_driver.ui_mode.attempt_exit_agent` → `ui_driver.bound mode=classic ui_mode=classic` and generated a real 768x1376 JPEG (exit 0); the day before, the identical command on the same account bound `auto`→`agentic` and failed. The same log independently closed **#183**: `mode_switch_trigger` and `image_mode_tab`, the selectors it reported as unfindable, both matched. #591 was proven against the real 500-row catalog — **0** occurrences of the string `"None"`, 31 proper JSON `null`s, over a catalog holding 119 NULL-bearing rows. #592 shows exactly one `client.account_locale_cached` per command. Three items are recorded as NOT verified rather than omitted: the exit-28 abort on a *pinned* agentic account, the #597 batch inter-prompt guard, and any fresh announcement modal — the last two because all three accounts have already acked the current changelog, so no modal can be raised until Google ships the next one.) · previous: [LIVE_VERIFICATION_v0.61.0](LIVE_VERIFICATION_v0.61.0.md) (**#539 video-model refusal + #586 image-model refusal and server-side attribution, verified 2026-08-26/27 on profile `denon82`, ONE Veo generation total** — the video fix was proven by a **zero-credit A/B against the stashed pre-fix source running on live Flow**: the old code returned SELECTED for `veo-lite-lp`, a model Flow does not offer to this account, and for a deliberately ambiguous selector matching 3 entries; the new code refuses both with exit 18 naming what Flow offered. Model selection happens before submit, so refusals cost nothing and the A/B was free. The happy path still generates: `--model omni-flash` → exit 0, a real 2.2 MB `ftypisom` mp4, catalog recording `omni_flash`. Two items are recorded as NOT verified rather than omitted: three of #584's four navigation-settle sites were never exercised [no bearer refresh occurred in these runs], and #582's canary self-re-exec has its first real exercise tonight. Also falsified: #539's recorded note that the video picker uses a different trigger — the two constants are byte-identical strings, and the repeated empty menu captures were the capture's own fault.) · previous: [LIVE_VERIFICATION_v0.60.0](LIVE_VERIFICATION_v0.60.0.md)
159
159
  **"Was the playwright upper bound raised, and on what evidence?"** → [LIVE_VERIFICATION_playwright_1.61](LIVE_VERIFICATION_playwright_1.61.md) (**`>=1.59.0,<1.60.0` → `>=1.61.0,<1.62.0` verified 2026-08-05, 1 Imagen + 1 Veo credit** — the 2026-08-03 regression that motivated the bound does NOT reproduce on 1.61.0: a live `i2v` drove the full chain with `image_uploaded status=200` → `frame_attached` → `generate_captured status=200` with `startImage` parsed, where **1.62.0 hung silently at exactly that upload step**; live `i2i` local-ref attach passed outright [96.7s]. **1.62.0 stays excluded** — never root-caused. Also found, A/B-proven pre-existing on BOTH 1.59.0 and 1.61.0: Flow dropped the duration-tab UI, so **`--duration` is currently broken for i2v** — `UiSelectorDriftError` fires correctly [refusing rather than silently accepting Flow's default, #288] but the selector needs re-deriving; that is why the i2v proof was driven via the CLI without `--duration`, and Flow's own server-side `PUBLIC_ERROR_VIDEO_GENERATION_TIMED_OUT` means no finished mp4 is claimed).
160
160
  **"Where is the reverse-engineered wire protocol for a feature?"** → the `*_RECON.md` design docs: [CHARACTER_RECON](CHARACTER_RECON.md) (Flow character entity protocol), [IMAGE_UPSCALE_RECON](IMAGE_UPSCALE_RECON.md) (`/v1/flow/upsampleImage` wire). Naming convention: one `<FEATURE>_RECON.md` per reverse-engineered surface, kept as the durable spec after the feature ships. Pre-capture research recons: [ASSET_TAGGING_RECON](ASSET_TAGGING_RECON.md) (`@`-mention asset tagging — shipped in v0.40.0, see [LIVE_VERIFICATION_v0.40.0](LIVE_VERIFICATION_v0.40.0.md)).
161
161
  **"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,112 @@
1
+ # Live verification — v0.64.0
2
+
3
+ > Evidence for [#626](https://github.com/ffroliva/gflow-cli/issues/626): lifting the
4
+ > `omni-flash` i2v END-frame guard. The paid surface under test is
5
+ > `gflow video i2v START PROMPT --model omni-flash --end-frame END`, which was rejected
6
+ > pre-submit with exit 17 before this release.
7
+
8
+ ## Environment
9
+
10
+ - Date: 2026-09-02
11
+ - gflow-cli version: 0.63.0 → 0.64.0 (branch `feature/omni-flash-end-frame-626`)
12
+ - Python: 3.13 local; CI matrix 3.11 / 3.12 / 3.13
13
+ - Chrome: headed, real-Chrome strategy (`--browser chrome` profile)
14
+ - OS: Windows 11
15
+ - Profiles: `ffroliva`, `denon82` (two distinct Google accounts)
16
+
17
+ ---
18
+
19
+ ## Part A — Credit-free wire evidence (route-abort)
20
+
21
+ `scripts/dev/capture_i2v_intercept_submit.py` binds Start + End through the production
22
+ helpers, installs `page.route(..., abort)` on the submit XHR, clicks submit, and inspects the
23
+ request the browser *tried* to send. The request never reaches Veo, so **zero credits**.
24
+
25
+ | # | Profile | Account | Captured route | startImage | endImage |
26
+ |---|---|---|---|---|---|
27
+ | A1 | `ffroliva` | A | `video:batchAsyncGenerateVideoStartAndEndImage` | `35104644` | `1160c1c5` |
28
+ | A2 | `denon82` | B | `video:batchAsyncGenerateVideoStartAndEndImage` | `3dbe6f2f` | `d8fa8761` |
29
+
30
+ Two distinct Google accounts produced the identical route with both images non-null, which
31
+ rules out a single-account artifact and a visibly staged rollout. This is the same probe and
32
+ methodology that re-enabled omni-flash START-frame i2v on 2026-08-03.
33
+
34
+ Artifacts: `tmp/i2v_626/evidence.json`, `tmp/i2v_626_denon82/evidence.json`.
35
+
36
+ ---
37
+
38
+ ## Part B — Paid live generations
39
+
40
+ ### B1 — omni-flash + start + end frame, `--duration 4` — ✅ VERIFIED
41
+
42
+ ```bash
43
+ gflow video i2v <start>.jpg "she rises from the chair and turns toward the window, \
44
+ warm afternoon light" --model omni-flash --end-frame <end>.jpg \
45
+ --duration 4 --aspect 9:16 --profile ffroliva
46
+ ```
47
+
48
+ Five-layer verification ledger:
49
+
50
+ | Layer | Evidence |
51
+ |---|---|
52
+ | 1 · Exit code | `0` |
53
+ | 2 · Wire route | `POST .../video:batchAsyncGenerateVideoStartAndEndImage` → HTTP 200, `startImage=a49791a4`, `endImage=06373fa6`, `referenceCount=0` |
54
+ | 3 · Flow status | `MEDIA_GENERATION_STATUS_SUCCESSFUL` (`poll_terminal`), media `2dba1401-f2e0-48da-917c-5189b1aa42b2` |
55
+ | 4 · Artifact | 2 465 096 B mp4; `ffprobe`: h264 + aac, 720×1280 (9:16 portrait), **duration 4.01 s** — matches `--duration 4` |
56
+ | 5 · Semantic | **First frame of the output is the start image; last frame is the END image.** Extracted with `ffmpeg -sseof -0.1`; visually confirmed as two different subjects. This is the layer that proves the end frame was *used*, not merely accepted. |
57
+
58
+ Layer 5 is the one that matters for this change. A run that bound the end frame but ignored it
59
+ would still pass layers 1–4.
60
+
61
+ The new post-submit route backstop (`_assert_i2v_route`) ran on this generation and correctly
62
+ did **not** fire — the route matched the frames the request carried.
63
+
64
+ ### B2 — omni-flash + start + end frame, `--duration 10` — ⚠️ SUBMIT VERIFIED, RENDER UNCONFIRMED
65
+
66
+ Same command with `--duration 10`. This is the largest-payload combination and had never been
67
+ exercised end-to-end on this model.
68
+
69
+ | Layer | Evidence |
70
+ |---|---|
71
+ | 1 · Duration selection | `duration_tab` matched `[role='tab']:text-is('10s')`; `duration_set seconds=10` |
72
+ | 2 · Wire route | `POST .../video:batchAsyncGenerateVideoStartAndEndImage` → HTTP 200, `startImage=76f57d19`, `endImage=eb7d1627` |
73
+ | 3 · Flow status | ❌ **not obtained** — `batchCheckAsyncVideoGenerationStatus` returned HTTP 401 mid-poll (`AuthExpiredError`) |
74
+ | 4–5 | not reached |
75
+
76
+ A single retry failed earlier still, at `project.create` with HTTP 401, before any submit — so
77
+ no second credit was spent. `gflow auth status` verified the Flow session as valid
78
+ immediately before and after both attempts.
79
+
80
+ **This is [#561](https://github.com/ffroliva/gflow-cli/issues/561)**, a pre-existing defect
81
+ (browser-context 401 while the on-disk Flow session is valid), not a regression from this
82
+ change. Verification was stopped rather than spending further credits chasing an environmental
83
+ fault.
84
+
85
+ **Honest status:** `--duration 10` + end frame is verified as far as *submit* — Flow accepted
86
+ the 10-second first+last request on the correct route with both images bound. Whether the
87
+ render completes is **unconfirmed**. Per the project's rule, that is LIKELY, not CONFIRMED.
88
+ It carries low residual risk: B1 proved the render path for this model/route, and duration
89
+ selection is an independent, already-verified control (`supports_duration`, #451/#288).
90
+
91
+ ---
92
+
93
+ ## Offline gates (same tree)
94
+
95
+ | Gate | Result |
96
+ |---|---|
97
+ | `check_repo_hygiene.py` | 858 files, no violations |
98
+ | `check_doc_links.py` | all links resolved across 29 files |
99
+ | `check_website_docs_pii.py` | no private identifiers, 25 files |
100
+ | `generate_website_docs.py --check` | mirror in sync (20 files), nav complete |
101
+ | `ruff check src tests` | all checks passed |
102
+ | `ruff format --check src tests` | 414 files already formatted |
103
+ | `pyright src` | 78 errors — **byte-identical count on clean `develop`**; local stub skew, zero new |
104
+ | `pytest` (api/cli/mcp/chain/errors) | 2065 passed, 3 skipped |
105
+
106
+ ---
107
+
108
+ ## Verdict
109
+
110
+ The feature is **live-verified** for the case the issue reported and for the case a user is
111
+ most likely to hit. The 10-second variant is submit-verified with its render unconfirmed for
112
+ an unrelated, already-tracked auth defect — recorded here rather than papered over.
@@ -83,7 +83,7 @@ The server registers three protocol surfaces:
83
83
 
84
84
  ### Tools (Executable actions)
85
85
  * `gflow_generate_image(prompt, model, aspect, count, seed, reference_images, tools, profile, project, project_name, instructions, ui_mode, output, wait)`: Triggers text-to-image / image-to-image (Imagen / Nano Banana). `instructions` is an optional list of ephemeral agent-instruction strings (agentic cohort only). `reference_images` switches to i2i and accepts **either a local file path or a generated image's Flow media UUID**. A UUID reference is attached by **selecting the already-existing asset in Flow's reference picker — no duplicate copy is uploaded** (locating the tile by the media id in its thumbnail URL, and searching the recorded display name to surface it when needed); gflow falls back to uploading the asset's on-disk local file only when it can't be located in place (e.g. it lives in a different project's picker). `project` generates into an existing Flow project id (mirrors CLI `--project`) — pass the reference's project to keep it selectable in place. `ui_mode` selects the Flow UI arm (`auto`/`classic`/`agentic`, mirroring CLI `--ui-mode`, matched case-insensitively). Since [#595](https://github.com/ffroliva/gflow-cli/issues/595) `auto` means "no arm was asked for" and **resolves to `classic`** — the arm that can satisfy an image request — so an account in Flow's agentic cohort aborts pre-submit (exit-28 equivalent envelope, zero credits) instead of failing mid-run with selector drift or video bytes; the agentic arm is bound only when named. Passing `instructions` forces `agentic` automatically, so `ui_mode="classic"` + `instructions` is a hard conflict rather than a silent drop. An unknown value returns a 400 problem-details envelope. See [CONFIGURATION § GFLOW_CLI_UI_MODE](CONFIGURATION.md#gflow_cli_ui_mode).
86
- * `gflow_generate_video(prompt, mode, aspect, initial_frame, end_frame, reference_images, model, duration, count, tools, profile, project, project_name, ui_mode, output, wait)`: Triggers vertical or landscape video generation (Veo). `mode` is `t2v`/`i2v`/`r2v`; `model` (`veo_lite`/`veo_fast`/`veo_quality`/`omni_flash`, aliases accepted), `duration` (seconds), and `count` mirror the CLI `gflow video` flags — an omitted `model` lets the transport apply its i2v veo-lite default (issue #125), and `omni_flash` is rejected for i2v-with-frames; `i2v` requires `initial_frame`, `r2v` requires `reference_images`; `project` generates into an existing Flow project id (mirrors CLI `--project`). `initial_frame`, `end_frame`, and `reference_images` each accept **either a local file path or the Flow image UUID of a generated asset** — pass a generated image's id straight in to chain image→video, and gflow attaches it for you. Since v0.58.0 (#529) the CLI and MCP surfaces are unified for i2v frames: the UUID keeps its identity and is enriched with the catalog's recorded display name plus an integrity-verified local fallback, so the transport prefers **selecting the exact asset in the project's media picker** (no duplicate upload) and re-uploads the recorded local file only when the tile is unreachable — and only if its byte count/SHA-256 still match. A UUID that isn't in your local asset catalog is rejected up front with a clear "Reference Not Found" error; a catalogued asset with neither a display name nor a verified local file gives a "Reference Not Usable" error (re-generate it or pass a local path). `r2v` UUID refs are resolved to the recorded local file for upload. `ui_mode` selects the Flow UI arm (#299 PR-A, mirroring CLI `--ui-mode`) and **applies to every mode of this tool, including `r2v`** — unlike the CLI, where `video r2v`/`chain` have no flag and follow the env-only path. Video generation has **only a classic driver**, so `auto` ≡ `classic`: both verify the classic editor pre-submit and abort before spending credits if it is unreachable. `ui_mode="agentic"` is rejected with a 400 problem-details envelope, because no agentic video driver exists yet. Values are matched case-insensitively. (MCP tools return envelopes, never process exit codes — the CLI equivalents of these aborts are exit 28 and exit 2 respectively.) See [CONFIGURATION § GFLOW_CLI_UI_MODE](CONFIGURATION.md#gflow_cli_ui_mode).
86
+ * `gflow_generate_video(prompt, mode, aspect, initial_frame, end_frame, reference_images, model, duration, count, tools, profile, project, project_name, ui_mode, output, wait)`: Triggers vertical or landscape video generation (Veo). `mode` is `t2v`/`i2v`/`r2v`; `model` (`veo_lite`/`veo_fast`/`veo_quality`/`omni_flash`, aliases accepted), `duration` (seconds), and `count` mirror the CLI `gflow video` flags — an omitted `model` lets the transport apply its i2v veo-lite default (issue #125), and every model — `omni_flash` included — accepts i2v with a start frame and with an end frame (wire-verified 2026-09-02, issue #626); `i2v` requires `initial_frame`, `r2v` requires `reference_images`; `project` generates into an existing Flow project id (mirrors CLI `--project`). `initial_frame`, `end_frame`, and `reference_images` each accept **either a local file path or the Flow image UUID of a generated asset** — pass a generated image's id straight in to chain image→video, and gflow attaches it for you. Since v0.58.0 (#529) the CLI and MCP surfaces are unified for i2v frames: the UUID keeps its identity and is enriched with the catalog's recorded display name plus an integrity-verified local fallback, so the transport prefers **selecting the exact asset in the project's media picker** (no duplicate upload) and re-uploads the recorded local file only when the tile is unreachable — and only if its byte count/SHA-256 still match. A UUID that isn't in your local asset catalog is rejected up front with a clear "Reference Not Found" error; a catalogued asset with neither a display name nor a verified local file gives a "Reference Not Usable" error (re-generate it or pass a local path). `r2v` UUID refs are resolved to the recorded local file for upload. `ui_mode` selects the Flow UI arm (#299 PR-A, mirroring CLI `--ui-mode`) and **applies to every mode of this tool, including `r2v`** — unlike the CLI, where `video r2v`/`chain` have no flag and follow the env-only path. Video generation has **only a classic driver**, so `auto` ≡ `classic`: both verify the classic editor pre-submit and abort before spending credits if it is unreachable. `ui_mode="agentic"` is rejected with a 400 problem-details envelope, because no agentic video driver exists yet. Values are matched case-insensitively. (MCP tools return envelopes, never process exit codes — the CLI equivalents of these aborts are exit 28 and exit 2 respectively.) See [CONFIGURATION § GFLOW_CLI_UI_MODE](CONFIGURATION.md#gflow_cli_ui_mode).
87
87
  * `gflow_auth_status(profile)`: Credit-free, non-interactive Flow session probe (#497) — wraps the same fail-closed `verify_flow_profile` check as `gflow auth status`. Returns `{"status": "authenticated", "profile", "user_email"}` or a problem-details error with a `remediation_hint`; a `verification_error` outcome means a network/endpoint problem, which re-login does not fix. Call it before a generation tool to fail fast on dead auth (the queue is async — without it, an auth failure surfaces only later from the daemon). Login/logout remain CLI-only (genuinely interactive).
88
88
  * `gflow_list_projects(profile, limit, offset)`: Queries the SQLite catalog for recent generation folders, paginated — the response carries `count` (rows in this page), `offset`, `has_more`, and `next_offset` (pass it back as `offset` for the next page; `null` on the last page).
89
89
  * `gflow_list_tools()`: Lists the prompt tools (name/title/description/category) accepted by the generate tools' `tools` param.
@@ -4,6 +4,49 @@
4
4
 
5
5
  ## Current release
6
6
 
7
+ **v0.64.0 — alpha.** **`gflow video i2v --model omni-flash --end-frame` — first+last
8
+ interpolation on Omni 1.1 Flash ([#626](https://github.com/ffroliva/gflow-cli/issues/626)).**
9
+ Google shipped first-and-last-frame generation for Omni 1.1 Flash, so the guard that
10
+ rejected that combination with exit 17 was enforcing a fact that had expired. omni-flash is
11
+ also the only model exposing `--duration`, so this is the one route to a 10-second first+last
12
+ interpolation.
13
+
14
+ The interesting part is what replaced the guard. gflow used to decide which models could
15
+ carry an end frame from a hand-maintained mirror of Google's support matrix — which went
16
+ stale silently, and could have gone stale in the permissive direction just as easily. That
17
+ table is **deleted**, not corrected. gflow now checks the route Flow *actually* used after
18
+ submit: a run carrying an end frame that comes back on `batchAsyncGenerateVideoStartImage` —
19
+ Flow dropping the frame and billing a clip that was never interpolated — fails with
20
+ `WireFormatError` rather than being reported as success. That catches a partial or staged
21
+ rollback on any account, at any time, with nobody re-reading a support page. It also closes a
22
+ narrower hole the old backstop had: it only fired when Flow dropped *every* frame to the T2V
23
+ route.
24
+
25
+ **Live-verified on two accounts at zero credits plus one paid render.** The route-abort probe
26
+ fired `batchAsyncGenerateVideoStartAndEndImage` with both images non-null on two distinct
27
+ Google accounts, ruling out a staged rollout. The decisive layer is semantic, not structural:
28
+ the paid 4s clip's **last frame is the supplied end image** and its first frame is the start
29
+ image — the only check that distinguishes "Flow used the end frame" from "Flow accepted and
30
+ ignored it", since exit code, HTTP status and file properties pass either way. Recorded as
31
+ *not* verified rather than omitted: `--duration 10` + end frame is submit-verified only, its
32
+ status poll having hit the pre-existing 401 of
33
+ [#561](https://github.com/ffroliva/gflow-cli/issues/561). See
34
+ [LIVE_VERIFICATION_v0.64.0.md](LIVE_VERIFICATION_v0.64.0.md).
35
+
36
+ **Breaking:** scripts branching on exit 17 for `omni-flash` + `--end-frame` now see success.
37
+ Exit 17 is unchanged for `gflow video chain --model omni-flash`, still rejected because
38
+ chain-scale seeded i2v remains unverified.
39
+
40
+ Also in this release, contributor-facing: **MCP↔CLI parity became a duty of every pipeline
41
+ phase.** This very change drifted — `mcp/tools.py` and `docs/MCP.md` went on telling agents
42
+ `omni_flash` was rejected for i2v-with-frames — through green lint, types, the full suite and
43
+ `test_cli_parity.py`, which is command-level and cannot see a docstring that lies. Each skill
44
+ now owns a slice (`scenario` D13, `plan` task 6, `pr-council-review` D15, `check` step 1b,
45
+ `doc-review` blocking on a *false* MCP claim); automating the mechanically checkable part is
46
+ tracked in [#628](https://github.com/ffroliva/gflow-cli/issues/628).
47
+
48
+ <details><summary>v0.63.0 — <code>gflow video extend</code>, past Flow's 8-second ceiling</summary>
49
+
7
50
  **v0.63.0 — alpha.** **`gflow video extend` — continue a clip past Flow's 8-second ceiling.**
8
51
  Veo caps a single generation at 8 seconds. `extend` chains server-side
9
52
  continuations: each segment is seeded from the *previous segment's* media rather
@@ -34,6 +77,8 @@ Also in this release: `CLAUDE.md` now `@`-imports `AGENTS.md` so the project's
34
77
  agent rules load rather than being politely requested, and `AGENTS.md` opens with
35
78
  a Skill Routing table making the `/gflow:` lifecycle the default workflow.
36
79
 
80
+ </details>
81
+
37
82
  > **Releases v0.60.0 – v0.62.1 are not expanded below.** This file drifted for
38
83
  > five releases; rather than reconstruct their summaries after the fact, they are
39
84
  > recorded accurately in [CHANGELOG.md](../CHANGELOG.md) and in their own
@@ -398,6 +443,7 @@ reporter-verified e2e on macOS).
398
443
  | `gflow scene` — Add Clip / Scenes compose + credit-free server-side extended video (`runVideoFxConcatenation`) | ✅ done (v0.12.0) |
399
444
  | `gflow video chain` — last-frame I2V chaining from a JSONL manifest (`--dry-run`/`--max-links`/`--resume-from`) | ✅ done (v0.12.0) |
400
445
  | `gflow video extend` — chained server-side Veo continuations past the 8s ceiling (tier-resolved model, whole-run balance pre-flight, resumable) | ✅ done (v0.63.0) |
446
+ | `i2v --model omni-flash --end-frame` — first+last interpolation on Omni 1.1 Flash; static capability table replaced by a post-submit route check that fails a dropped end frame (#626) | ✅ done (v0.64.0) |
401
447
  | Create-project generation works under Flow's Agent docked chat panel | ✅ done (v0.12.0) |
402
448
  | Video status poll raises `AuthExpiredError` (exit 3) on mid-workflow 401 (#156) + Docker `/dev/shm` hardening | ✅ done (v0.15.1) |
403
449
  | Locale-free resource-picker include selectors — entity attach works on every account language (#170) | ✅ done (v0.16.0) |
@@ -514,20 +514,25 @@ All prompts in a batch share one Flow project. The editor is opened once and sta
514
514
  > `t2v` and `i2v` (not `r2v`) additionally take `-o, --output PATH` (explicit file destination).
515
515
  > The mp4 lands at `<output_file>` or `<out-dir>/<media_id>.mp4`.
516
516
  >
517
- > **`i2v` model rules (issue #125, re-verified 2026-08-03):** every model —
518
- > `omni-flash` included — supports **start-frame** i2v; the **default is
519
- > `veo-lite`** (not Flow's UI default). `--model omni-flash` unlocks
520
- > `--duration 10` for i2v. The **end frame is narrower**: `--end-frame`
521
- > (first+last interpolation) requires a Veo 3.1 model — Flow's official
522
- > support matrix lists first+last as "coming soon" for Omni Flash, and gflow
523
- > rejects that combination up front (exit 17).
517
+ > **`i2v` model rules (issues #125 / #626):** every model — `omni-flash`
518
+ > included — supports i2v with a **start frame** and with an **end frame**
519
+ > (`--end-frame`, first+last interpolation). The **default is `veo-lite`** (not
520
+ > Flow's UI default) because it is the cheapest, not because of any capability
521
+ > edge. `--model omni-flash` additionally unlocks `--duration 10` for i2v.
524
522
  > History: omni-flash was excluded from i2v entirely after a 2026-05-30 wire
525
523
  > capture showed Flow silently dropping the frames and billing the run as
526
524
  > text-to-video. A 2026-08-03 route-aborted re-capture
527
525
  > (`scripts/dev/capture_i2v_intercept_submit.py --model omni-flash
528
526
  > --start-only`) proved Flow now routes omni + start frame to
529
527
  > `batchAsyncGenerateVideoStartImage` with the frame bound, and a live x1
530
- > 10s generation confirmed the output interpolates from the start frame.
528
+ > 10s generation confirmed the output interpolates from the start frame. The
529
+ > end frame followed once Flow shipped first+last for Omni 1.1 Flash: on
530
+ > 2026-09-02 the same probe without `--start-only` captured
531
+ > `batchAsyncGenerateVideoStartAndEndImage` with both `startImage` and
532
+ > `endImage` non-null, reproduced on two accounts at zero credits (#626).
533
+ > Instead of a static per-model table, gflow now checks the route Flow
534
+ > **actually used** after submit: a run whose end frame was silently dropped
535
+ > fails loudly rather than reporting a clip that ignored it as a success.
531
536
 
532
537
  ## `gflow video t2v`
533
538
 
@@ -1603,7 +1608,7 @@ shell scripts can branch on the failure mode without parsing stderr.
1603
1608
  | `14` | `AuthBrowserRejectedError` | Google rejected the login browser | `gflow auth login --browser chrome` |
1604
1609
  | `15` | `BrowserSessionClosedError` | The automation browser window was closed mid-operation | Re-run; keep the browser window open until the command finishes |
1605
1610
  | `16` | `DataStoreError` | Local database cannot be opened, a migration failed, or the DB schema is newer than the installed gflow-cli | See below |
1606
- | `17` | `ModelModeIncompatibilityError` | The chosen video model can't do the requested mode (e.g. `--model omni-flash` with `--end-frame`, or `omni-flash` for `chain` — issue #125) | omni-flash does start-frame `i2v` only: drop `--end-frame`, or use a Veo 3.1 model (`veo-lite` / `veo-fast` / `veo-quality` / `veo-lite-lp`) for first+last and for `chain` |
1611
+ | `17` | `ModelModeIncompatibilityError` | The chosen video model can't do the requested mode — today that is `omni-flash` for `chain` (issues #125, #626) | Use a Veo 3.1 model (`veo-lite` / `veo-fast` / `veo-quality` / `veo-lite-lp`) for `chain`. Single-clip `i2v` with omni-flash, `--end-frame` included, is accepted |
1607
1612
  | `18` | `VideoModelSelectionError` | gflow could not select the requested video model in Flow's editor for an `i2v` run (model-picker option not found) | Usually transient — retry; if it persists, Flow's model-picker UI changed (report referencing #125) |
1608
1613
  | `19` | `SceneConcatError` | Server-side scene render/concat failed (`gflow scene --output`) | Retry; the recorded compose survives, so re-render is safe |
1609
1614
  | `20` | `FrameExtractionError` | Could not extract the last frame for a video chain link | Check the source video downloaded intact; retry the link |
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "gflow-cli"
3
- version = "0.63.0"
3
+ version = "0.64.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" }
@@ -31,6 +31,82 @@ The last check fails on either half of the published-site contract:
31
31
  `website/mkdocs.yml` points at it, so it is live but unreachable. Add the
32
32
  entry under the right nav section.
33
33
 
34
+ **1b. Surface blast radius — MCP↔CLI parity and the other mirrors** (read-only; MANDATORY whenever the change touches a CLI command, option, flag help text, exit code, or user-facing error string)
35
+
36
+ `tests/mcp/test_cli_parity.py` is a **command-level** gate only: it asserts every CLI *leaf*
37
+ has a mapped MCP tool or a stated exemption. It is green while a new `--option` goes
38
+ unmirrored, and green while an MCP docstring asserts a restriction the CLI no longer has.
39
+ That semantic drift is invisible to every automated gate in this file, so it is checked here
40
+ by hand — deliberately, because the alternative is shipping it.
41
+
42
+ ```bash
43
+ PYTHONUTF8=1 uv run python -m pytest -q tests/mcp/test_cli_parity.py tests/mcp/test_server.py
44
+ ```
45
+
46
+ Then enumerate the blast radius. For the CLI symbol(s) you changed (option name, model
47
+ alias, exit code, capability), grep the whole repo and confirm **every** hit is either
48
+ updated or still true:
49
+
50
+ ```bash
51
+ # substitute the flag / alias / capability word you changed
52
+ grep -rn --exclude-dir=.git --exclude-dir=__pycache__ --exclude-dir=tmp "<your-symbol>" \
53
+ src/gflow_cli/mcp/ docs/ website/docs/ README.md KNOWN_ISSUES.md CHANGELOG.md skills/
54
+ ```
55
+
56
+ Six axes, in blast-radius order. Tick each or state why it does not apply — "I did not touch
57
+ a CLI surface" is a valid answer for the whole step; silence is not.
58
+
59
+ **A. Execution paths — a request is built in THREE places, not one.**
60
+
61
+ | Hop | File | Fails as |
62
+ |---|---|---|
63
+ | CLI | `cli_video.py` / `cli_image.py` dataclass → request | option parsed but never passed |
64
+ | MCP direct | `mcp/tools.py` tool signature → payload dict | param accepted, dropped before the queue |
65
+ | MCP queued | `mcp/tools.py` payload keys → `worker/codec.py` decode → request | **silent no-op** — accepted, queued, never read |
66
+
67
+ The third hop is the dangerous one: the payload key the tool writes and the key the codec
68
+ reads are matched by string, so a mismatch type-checks, lints, and passes tests while doing
69
+ nothing. This has shipped before — a dead `output` param the queue never read survived until
70
+ a pre-release audit (#495). Verify the key names literally line up end to end:
71
+
72
+ ```bash
73
+ grep -n "<param>" src/gflow_cli/mcp/tools.py src/gflow_cli/worker/codec.py
74
+ ```
75
+
76
+ **B. MCP surface truth** — `mcp/tools.py` tool signature **and** every behavioural claim in
77
+ its docstring; `docs/MCP.md` parameter prose. `tests/mcp/test_cli_parity.py`'s
78
+ `CLI_TO_MCP` / `_MCP_EXEMPT` only when adding a NEW leaf.
79
+
80
+ **C. Agent-facing surfaces** — read by Codex / Cursor / Aider, not just by us, and covered by
81
+ no test at all: `skills/gflow-cli/SKILL.md`, the `AGENTS.md` "Command surface" bullet,
82
+ `README.md`, `docs/INDEX.md`.
83
+
84
+ **D. Error and exit-code surface** — `errors.py` `_default_remediation` **and** the class
85
+ docstring, `EXIT_CODE_MAP`, and the exit-code table in `docs/USAGE.md`. When a raise site is
86
+ deleted, re-derive what the remaining sites are: a remediation string that still describes a
87
+ removed case actively misleads.
88
+
89
+ ```bash
90
+ grep -rn "raise <ErrorClass>" src/gflow_cli/ # must match what the docs table claims
91
+ ```
92
+
93
+ **E. Declarative / template surfaces** — defaults baked into files users copy:
94
+ `cli_movie.py`'s manifest template, `movie_manifest.py`, `chain_manifest.py`,
95
+ `.env.template` for any env var, and the capability-reporting commands `gflow models` and
96
+ `gflow doctor`.
97
+
98
+ **F. Docs + published mirror** — `docs/USAGE.md` command section, `website/docs/`
99
+ (regenerate; step 1 catches staleness but never wrongness), `KNOWN_ISSUES.md` claims about
100
+ the surface, `CHANGELOG.md` under `### Changed` whenever behaviour a script could branch on
101
+ moves.
102
+
103
+ **Why this step exists.** In #626 the CLI stopped rejecting `omni-flash --end-frame` while
104
+ `mcp/tools.py` and `docs/MCP.md` went on telling agents the combination was rejected. Lint,
105
+ types, the full 2065-test suite, and the parity gate were green throughout, because none of
106
+ them can see a docstring that lies. The AGENTS.md prose saying "keep them in sync" had been
107
+ there the whole time and did not fire — the project's own lesson, again: wire the rule, or it
108
+ is a wish.
109
+
34
110
  **2. Auto-fix lint and formatting** (rewrites files in place)
35
111
 
36
112
  ```bash
@@ -82,6 +158,7 @@ uv run python -m pytest -q --cov=gflow_cli --cov-fail-under=80
82
158
  ## Output
83
159
 
84
160
  - List files changed by the fix pass (empty = nothing needed fixing)
161
+ - **Step 1b blast radius — the mirror table, each row ticked or explicitly marked N/A. "I did not touch a CLI surface" is a valid answer; silence is not.**
85
162
  - **Step 4 verify result — `ruff check` + `ruff format --check` both clean (this is the CI gate; a non-zero here is a blocking finding, not a warning)**
86
163
  - All pyright errors with `file:line` references
87
164
  - Pytest summary line and coverage percentage
@@ -175,6 +175,22 @@ assign a coverage grade: **D0** (nothing) · **D1** (docstrings only) · **D2**
175
175
  be **D3+**; a new env var or command at **D0/D1** is a release-blocking finding.
176
176
  List every surface below D3 with its grade and the doc it needs.
177
177
 
178
+ **Every CLI surface in that list has an MCP twin — grade both.** `docs/MCP.md` and the
179
+ `mcp/tools.py` docstrings are documentation for an *agent* audience, and they rot the same
180
+ way, silently, with a green test suite. Two failure shapes, both release-blocking:
181
+
182
+ - **Absent:** a CLI flag shipped and mirrored in code, but `docs/MCP.md` never mentions the
183
+ MCP parameter. The D0–D4 grading above applies unchanged.
184
+ - **False:** the tool docstring or `docs/MCP.md` still asserts a restriction the code dropped.
185
+ This is worse than absent — it tells agents not to attempt something that now works, and no
186
+ link check, lint, or parity test can see it. Grade a false claim as a blocker regardless of
187
+ how well-documented the surface otherwise is.
188
+
189
+ ```bash
190
+ # Cross-check every behavioural claim about models/flags in the MCP surface against the code.
191
+ grep -rn "rejected\|not supported\|requires a\|only\|coming soon" src/gflow_cli/mcp/tools.py docs/MCP.md
192
+ ```
193
+
178
194
  ---
179
195
 
180
196
  ## 5 · Skill files (`skills/` + `.claude/commands/gflow/`)
@@ -65,6 +65,15 @@ Disprove parts of the reporter's framing where the code says otherwise (e.g.
65
65
  `browser_engine: playwright` is the engine axis, not the channel) — a precise
66
66
  correction is more useful than agreement.
67
67
 
68
+ **Name the affected SURFACES, not just the affected code.** A reporter hits one
69
+ surface; the defect usually spans both. gflow ships most capabilities twice — CLI
70
+ command and MCP tool — so state explicitly whether the issue reproduces on the CLI,
71
+ on the MCP tool, or on both, and whether a fix in one automatically fixes the other
72
+ (it does when both route through the same transport; it does not when the MCP path
73
+ carries its own params through `worker/codec.py`). Getting this wrong scopes the
74
+ whole downstream fix wrong: a "CLI bug" that is really a shared-transport bug leaves
75
+ MCP users broken after the issue is closed.
76
+
68
77
  ### 3. Classify — exactly one verdict
69
78
 
70
79
  | Verdict | Meaning |
@@ -73,6 +73,14 @@ path is default-in-scope; skipping this gate requires a named reason, not silenc
73
73
  - Which command(s) does the change touch?
74
74
  - Which variations actually exercise it? (E.g. for a mention-resolution fix: a character
75
75
  mention, a media mention, an ambiguous-name case, an unresolvable name.)
76
+ - **Which surface(s)?** A capability that ships as both a CLI command and an MCP tool has
77
+ **two live paths, not one** — and the MCP queued path runs different code
78
+ (`mcp/tools.py` → queue payload → `worker/codec.py` → request → daemon owns download and
79
+ recording). A CLI run does not exercise it. Decide per change whether the MCP path needs
80
+ its own live run, and if you skip it, say so with a reason. The cheap version is usually
81
+ enough: one queued MCP call on a credit-free operation proves the payload keys round-trip,
82
+ which is the hop that silently no-ops (#495). Offline parity tests cannot see this —
83
+ they never build a real payload and decode it.
76
84
 
77
85
  **2. Check the cost tier for each variation — the tier follows the operation, not the
78
86
  command family:**
@@ -91,10 +91,15 @@ Skip any question already answered by predict/scenario output or the feature des
91
91
  | 3 | Core implementation | Domain objects / value types / parsers. |
92
92
  | 4 | Transport / API layer | `FlowApiClient` or `UiAutomationTransport` changes. |
93
93
  | 5 | CLI surface | `cli_*.py` + Click commands + `--help` text. |
94
- | 6 | Docs update | `USAGE.md`, `CONFIGURATION.md` (new env vars), `KNOWN_ISSUES.md` if relevant. |
95
- | 7 | Full gates + release prep | `/gflow:check` green; CHANGELOG updated. |
96
-
97
- Adjust: not every task applies to every feature. Merge or split tasks as the scope demands.
94
+ | 6 | **MCP surface mirror** | **Never optional when task 5 exists.** `mcp/tools.py` signature + docstring claims, the queued-path payload keys in `worker/codec.py`, `tests/mcp/test_cli_parity.py` for a new leaf. |
95
+ | 7 | Docs update | `USAGE.md`, `CONFIGURATION.md` (new env vars), `docs/MCP.md`, `KNOWN_ISSUES.md` if relevant. |
96
+ | 8 | Full gates + release prep | `/gflow:check` green; CHANGELOG updated. |
97
+
98
+ Adjust: not every task applies to every feature. Merge or split tasks as the scope demands —
99
+ **except task 6.** If the plan has a task 5, it has a task 6, because gflow ships every
100
+ capability twice and the automated gates cannot see the two drifting apart. A plan that
101
+ touches the CLI and has no MCP task is incomplete, not lean. The mirror axes are enumerated
102
+ once, in `skills/check/SKILL.md` step 1b; cite them, do not copy them.
98
103
 
99
104
  ### Phase 4 — Draft the plan and show it to the user
100
105