gflow-cli 0.46.0__tar.gz → 0.48.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 (691) hide show
  1. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.codex-plugin/plugin.json +1 -1
  2. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.github/workflows/ci.yml +62 -0
  3. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/AGENTS.md +1 -1
  4. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/CHANGELOG.md +84 -1
  5. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/KNOWN_ISSUES.md +9 -4
  6. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/PKG-INFO +2 -2
  7. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/DATA_LAYER.md +30 -1
  8. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/E2E_TESTING.md +1 -0
  9. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/INDEX.md +2 -2
  10. gflow_cli-0.48.0/docs/LIVE_VERIFICATION_v0.46.1.md +78 -0
  11. gflow_cli-0.48.0/docs/LIVE_VERIFICATION_v0.47.0.md +45 -0
  12. gflow_cli-0.48.0/docs/LIVE_VERIFICATION_v0.48.0.md +38 -0
  13. {gflow_cli-0.46.0/website → gflow_cli-0.48.0}/docs/MCP.md +59 -6
  14. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/PROJECT_STATUS.md +31 -1
  15. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/USAGE.md +14 -5
  16. gflow_cli-0.48.0/docs/superpowers/spikes/2026-08-01-mcp-2026-07-28-spec-impact.md +349 -0
  17. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/llms.txt +1 -1
  18. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/pyproject.toml +9 -3
  19. gflow_cli-0.48.0/scripts/dev/spike_issue404_count_tabs_recon.py +283 -0
  20. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/skills/check/SKILL.md +16 -0
  21. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/skills/gflow-cli/SKILL.md +2 -2
  22. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/__init__.py +1 -1
  23. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/api/transports/drivers/agentic.py +2 -1
  24. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/api/transports/ui_automation.py +58 -36
  25. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/api/transports/ui_automation_video.py +9 -5
  26. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/cli.py +29 -7
  27. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/cli_image.py +87 -29
  28. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/cli_video.py +81 -65
  29. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/data/recorder.py +43 -12
  30. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/mcp/__init__.py +1 -1
  31. gflow_cli-0.48.0/src/gflow_cli/mcp/server.py +248 -0
  32. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/mcp/tools.py +45 -25
  33. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/ui/app.py +47 -6
  34. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/transports/test_ui_automation.py +249 -205
  35. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/transports/test_ui_automation_batch.py +47 -31
  36. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/transports/test_ui_automation_video.py +9 -0
  37. gflow_cli-0.48.0/tests/cli/test_predictable_output.py +270 -0
  38. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/data/test_failure_recording.py +28 -0
  39. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/data/test_recorder.py +173 -0
  40. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/e2e/test_agentic_count_enforcement_e2e.py +30 -5
  41. gflow_cli-0.48.0/tests/e2e/test_classic_count_setter_e2e.py +89 -0
  42. gflow_cli-0.48.0/tests/e2e/test_entity_provenance_e2e.py +345 -0
  43. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/features/test_image_steps.py +1 -0
  44. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/integration/test_storage_s3.py +50 -0
  45. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/mcp/conftest.py +1 -1
  46. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/mcp/test_cli_parity.py +8 -1
  47. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/mcp/test_server.py +137 -9
  48. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/mcp/test_stdio_transport.py +2 -2
  49. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/ui/test_app.py +33 -1
  50. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/uv.lock +66 -12
  51. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/website/docs/DATA_LAYER.md +30 -1
  52. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/website/docs/E2E_TESTING.md +1 -0
  53. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/website/docs/KNOWN_ISSUES.md +9 -4
  54. {gflow_cli-0.46.0 → gflow_cli-0.48.0/website}/docs/MCP.md +59 -6
  55. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/website/docs/USAGE.md +14 -5
  56. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/website/docs/agents.md +1 -1
  57. gflow_cli-0.46.0/src/gflow_cli/mcp/server.py +0 -161
  58. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.agents/plugins/marketplace.json +0 -0
  59. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.claude/README.md +0 -0
  60. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.claude/commands/gflow/active.md +0 -0
  61. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.claude/commands/gflow/branch-review.md +0 -0
  62. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.claude/commands/gflow/changelog.md +0 -0
  63. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.claude/commands/gflow/check.md +0 -0
  64. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.claude/commands/gflow/doc-review.md +0 -0
  65. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.claude/commands/gflow/issue-assessment.md +0 -0
  66. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.claude/commands/gflow/issue-resolve.md +0 -0
  67. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.claude/commands/gflow/known-issues.md +0 -0
  68. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.claude/commands/gflow/live-verify.md +0 -0
  69. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.claude/commands/gflow/llm-council.md +0 -0
  70. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.claude/commands/gflow/next.md +0 -0
  71. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.claude/commands/gflow/plan.md +0 -0
  72. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.claude/commands/gflow/pr-council-review.md +0 -0
  73. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.claude/commands/gflow/predict.md +0 -0
  74. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.claude/commands/gflow/release.md +0 -0
  75. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.claude/commands/gflow/scenario.md +0 -0
  76. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.claude/commands/gflow/sonar.md +0 -0
  77. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.claude/commands/gflow/status.md +0 -0
  78. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.env.template +0 -0
  79. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.gitattributes +0 -0
  80. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.github/CODEOWNERS +0 -0
  81. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  82. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.github/copilot-instructions.md +0 -0
  83. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.github/dependabot.yml +0 -0
  84. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.github/workflows/external-pr-triage.yml +0 -0
  85. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.github/workflows/governance-advisory.yml +0 -0
  86. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.github/workflows/governance-benchmark.yml +0 -0
  87. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.github/workflows/main-base-guard.yml +0 -0
  88. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.github/workflows/pages.yml +0 -0
  89. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.github/workflows/release.yml +0 -0
  90. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.gitignore +0 -0
  91. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.gitleaks.toml +0 -0
  92. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.pre-commit-config.yaml +0 -0
  93. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/.secrets.baseline +0 -0
  94. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/CLAUDE.md +0 -0
  95. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/CONFIGURATION.md +0 -0
  96. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/CONTRIBUTING.md +0 -0
  97. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/DISCLAIMER.md +0 -0
  98. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/LICENSE +0 -0
  99. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/PLAN.md +0 -0
  100. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/README.md +0 -0
  101. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/RELEASE.md +0 -0
  102. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/ROADMAP.md +0 -0
  103. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/conftest.py +0 -0
  104. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/deploy/PR-TRIAGE-AUTOPILOT-OPS.md +0 -0
  105. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docker-compose.yml +0 -0
  106. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/AGENT_GUIDE.md +0 -0
  107. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/AGENT_UI_E2E.md +0 -0
  108. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/AGENT_UI_RECON.md +0 -0
  109. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/ARCHITECTURE.md +0 -0
  110. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/ASSET_TAGGING_RECON.md +0 -0
  111. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/AUTHENTICATION.md +0 -0
  112. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/CHARACTER.md +0 -0
  113. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/CHARACTER_RECON.md +0 -0
  114. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/CONFIGURATION.md +0 -0
  115. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/DEBUGGING.md +0 -0
  116. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/DEMOS.md +0 -0
  117. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/DEVELOPMENT.md +0 -0
  118. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/EXTERNAL_STORAGE.md +0 -0
  119. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/GITHUB.md +0 -0
  120. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
  121. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
  122. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/INSTRUCTIONS.md +0 -0
  123. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
  124. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
  125. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
  126. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
  127. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
  128. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
  129. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
  130. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
  131. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
  132. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
  133. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
  134. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
  135. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.21.0.md +0 -0
  136. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.22.0.md +0 -0
  137. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.23.0.md +0 -0
  138. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.24.0.md +0 -0
  139. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.25.0.md +0 -0
  140. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.26.0.md +0 -0
  141. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.27.0.md +0 -0
  142. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.27.1.md +0 -0
  143. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.28.0.md +0 -0
  144. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.29.0.md +0 -0
  145. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.30.0.md +0 -0
  146. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.31.0.md +0 -0
  147. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.32.0.md +0 -0
  148. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.32.1.md +0 -0
  149. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.33.0.md +0 -0
  150. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.34.0.md +0 -0
  151. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.35.0.md +0 -0
  152. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.36.0.md +0 -0
  153. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.37.0.md +0 -0
  154. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.38.0.md +0 -0
  155. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.38.1.md +0 -0
  156. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.39.0.md +0 -0
  157. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.40.0-production-readiness.md +0 -0
  158. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.40.0.md +0 -0
  159. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.41.0.md +0 -0
  160. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.42.0.md +0 -0
  161. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.43.0.md +0 -0
  162. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.44.0.md +0 -0
  163. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.45.0.md +0 -0
  164. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.46.0.md +0 -0
  165. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
  166. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
  167. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
  168. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
  169. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
  170. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/MOVIE.md +0 -0
  171. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/PROMPT_EXPANSION.md +0 -0
  172. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/REFERENCE_STRATEGIES.md +0 -0
  173. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/SECURITY.md +0 -0
  174. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/TOOLS.md +0 -0
  175. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/USER_GUIDE.md +0 -0
  176. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/assets/demo-split-pf.gif +0 -0
  177. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/assets/example-run.gif +0 -0
  178. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/assets/examples.webp +0 -0
  179. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/medium_tutorial.md +0 -0
  180. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/schemas/movie-handoff.schema.json +0 -0
  181. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/sonar-cleanup-tracker.md +0 -0
  182. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
  183. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +0 -0
  184. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +0 -0
  185. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +0 -0
  186. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +0 -0
  187. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +0 -0
  188. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +0 -0
  189. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +0 -0
  190. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +0 -0
  191. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +0 -0
  192. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/superpowers/plans/2026-07-08-pr-triage-autopilot/PLAN.md +0 -0
  193. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/superpowers/plans/2026-07-09-camoufox-adoption/PLAN.md +0 -0
  194. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/superpowers/plans/2026-07-14-storyboarding-and-visual-curation/PLAN.md +0 -0
  195. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/superpowers/plans/2026-07-18-asset-tagging/PLAN.md +0 -0
  196. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/superpowers/plans/2026-07-19-live-verify/PLAN.md +0 -0
  197. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/superpowers/plans/2026-07-19-production-readiness-browser-lifecycle.md +0 -0
  198. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/superpowers/plans/2026-07-19-production-readiness-driver-cdp-verification.md +0 -0
  199. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/superpowers/plans/2026-07-19-production-readiness-public-truth.md +0 -0
  200. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/superpowers/plans/2026-07-19-production-readiness-queue-safety.md +0 -0
  201. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/superpowers/plans/2026-07-26-character-prompt-polishing/PLAN.md +0 -0
  202. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/superpowers/plans/2026-07-26-project-name-management/PLAN.md +0 -0
  203. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/superpowers/plans/2026-07-26-self-documenting-errors/PLAN.md +0 -0
  204. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/superpowers/plans/2026-07-27-overlay-banner-dismissal/PLAN.md +0 -0
  205. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/PLAN.md +0 -0
  206. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/SCENARIO.md +0 -0
  207. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/superpowers/research/2026-06-27-tool-abstraction-evaluation.md +0 -0
  208. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/superpowers/specs/2026-06-29-issue-assessment-workflow-design.md +0 -0
  209. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/superpowers/specs/2026-07-04-pr-triage-autopilot-design.md +0 -0
  210. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/superpowers/specs/2026-07-18-asset-tagging-design.md +0 -0
  211. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/superpowers/specs/2026-07-19-live-verify-design.md +0 -0
  212. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/superpowers/specs/2026-07-19-production-readiness-hardening-design.md +0 -0
  213. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/superpowers/spikes/2026-07-09-camoufox-waf-403.md +0 -0
  214. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/superpowers/spikes/2026-07-12-ui-cohort-backend-config.md +0 -0
  215. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/docs/superpowers/spikes/2026-07-17-production-readiness-assessment.md +0 -0
  216. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/eval/pr_triage_eval.py +0 -0
  217. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/eval/pr_triage_fixtures.json +0 -0
  218. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/examples/README.md +0 -0
  219. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/examples/batch_from_config.py +0 -0
  220. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/examples/multi_prompt_t2i.py +0 -0
  221. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/examples/sample_config.json +0 -0
  222. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/examples/sample_prompts.txt +0 -0
  223. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/examples/single_image_t2i.py +0 -0
  224. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/examples/workflow_chain.py +0 -0
  225. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/index.html +0 -0
  226. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/samples/README.md +0 -0
  227. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/samples/captured/01_upload_image.json +0 -0
  228. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
  229. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
  230. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/samples/captured/04_archive_workflow.json +0 -0
  231. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/samples/captured/05_createProject.json +0 -0
  232. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/samples/captured/06_batchGenerateImages.json +0 -0
  233. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
  234. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
  235. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
  236. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
  237. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
  238. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/samples/captured/12_create_scene.json +0 -0
  239. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
  240. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/samples/captured/14_get_scene_workflows.json +0 -0
  241. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
  242. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/autopilot/Dockerfile.triage +0 -0
  243. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/autopilot/entrypoint.sh +0 -0
  244. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/autopilot/pr_triage_autopilot.py +0 -0
  245. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/autopilot/pr_triage_gate.py +0 -0
  246. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/autopilot/run_sandboxed_review.sh +0 -0
  247. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/ci/check_doc_links.py +0 -0
  248. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/ci/check_materiality.py +0 -0
  249. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/ci/check_release_artifacts.py +0 -0
  250. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/ci/check_repo_hygiene.py +0 -0
  251. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/ci/check_website_docs_pii.py +0 -0
  252. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/ci/generate_website_docs.py +0 -0
  253. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/debug_editor.py +0 -0
  254. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/debug_gen_settings.py +0 -0
  255. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/debug_settings.py +0 -0
  256. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/_recording_client.py +0 -0
  257. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/_spike_common.py +0 -0
  258. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/active_plan.py +0 -0
  259. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/analyze_agent_ui_capture.py +0 -0
  260. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
  261. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
  262. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
  263. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
  264. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
  265. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/capture_locale_invariants.py +0 -0
  266. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
  267. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/character_create_spike.py +0 -0
  268. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/character_create_spike_v2.py +0 -0
  269. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/dump_character_selectors.js +0 -0
  270. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/incident_bundle_quality.py +0 -0
  271. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/make_project.py +0 -0
  272. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/materiality_backtest.py +0 -0
  273. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/monitor_pr_38.py +0 -0
  274. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/patch_character.py +0 -0
  275. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/skillopt/README.md +0 -0
  276. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/skillopt/harness.py +0 -0
  277. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/skillopt/tasks.json +0 -0
  278. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/sonar-local-scan.sh +0 -0
  279. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/sonar-pre-push-gate.sh +0 -0
  280. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/spike_char_editor_dom.py +0 -0
  281. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/spike_char_gen_capture.py +0 -0
  282. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/spike_character_prompt_format.py +0 -0
  283. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
  284. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
  285. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
  286. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
  287. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/spike_incident_live.py +0 -0
  288. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
  289. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
  290. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/spike_issue313_agent_mode_controls.py +0 -0
  291. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/spike_issue314_picker_filename_search.py +0 -0
  292. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/spike_mode_roundtrip.py +0 -0
  293. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/spike_mode_switch_agentic_to_classic.py +0 -0
  294. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
  295. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
  296. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
  297. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/spike_movie_picker_select.py +0 -0
  298. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/spike_movie_voice_list.py +0 -0
  299. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/spike_patch_entity.py +0 -0
  300. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/dev/spike_patchright.py +0 -0
  301. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/diag/README.md +0 -0
  302. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/diag/capture_flow_traffic.py +0 -0
  303. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/diag/memory_profile.py +0 -0
  304. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/diag/recaptcha_mint.py +0 -0
  305. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/diag/spike_387_openai_compat.py +0 -0
  306. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
  307. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/e2e/capture_agent_toggle.py +0 -0
  308. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/record_demo.ps1 +0 -0
  309. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/smoke_image.py +0 -0
  310. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/smoke_video_editor.py +0 -0
  311. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/smoke_worker_style.py +0 -0
  312. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/spike_waf_camoufox.py +0 -0
  313. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/scripts/verify_chrome_auth_viability.py +0 -0
  314. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/skills/README.md +0 -0
  315. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/skills/changelog/SKILL.md +0 -0
  316. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/skills/doc-review/SKILL.md +0 -0
  317. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/skills/issue-assessment/SKILL.md +0 -0
  318. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/skills/issue-resolve/SKILL.md +0 -0
  319. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/skills/known-issues/SKILL.md +0 -0
  320. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/skills/live-verify/SKILL.md +0 -0
  321. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/skills/llm-council/SKILL.md +0 -0
  322. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/skills/plan/SKILL.md +0 -0
  323. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/skills/pr-council-review/SKILL.md +0 -0
  324. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/skills/predict/SKILL.md +0 -0
  325. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/skills/release/SKILL.md +0 -0
  326. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/skills/scenario/SKILL.md +0 -0
  327. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/skills/sonar/SKILL.md +0 -0
  328. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/skills/status/SKILL.md +0 -0
  329. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/sonar-project.properties +0 -0
  330. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/__main__.py +0 -0
  331. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/_cli_helpers.py +0 -0
  332. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/api/__init__.py +0 -0
  333. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/api/_engine.py +0 -0
  334. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/api/_retry.py +0 -0
  335. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
  336. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/api/character.py +0 -0
  337. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/api/client.py +0 -0
  338. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/api/dto.py +0 -0
  339. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/api/image.py +0 -0
  340. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/api/image_upscale.py +0 -0
  341. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/api/recaptcha.py +0 -0
  342. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/api/routes.py +0 -0
  343. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/api/scene.py +0 -0
  344. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/api/transports/__init__.py +0 -0
  345. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/api/transports/_common.py +0 -0
  346. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
  347. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/api/transports/base.py +0 -0
  348. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
  349. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/api/transports/drivers/base.py +0 -0
  350. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/api/transports/drivers/classic.py +0 -0
  351. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/api/transports/drivers/factory.py +0 -0
  352. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
  353. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
  354. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
  355. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
  356. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/api/transports/mode_control.py +0 -0
  357. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/api/video.py +0 -0
  358. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/auth/__init__.py +0 -0
  359. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/auth/base.py +0 -0
  360. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/auth/cookies.py +0 -0
  361. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/auth/factory.py +0 -0
  362. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
  363. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/auth/real_chrome.py +0 -0
  364. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/auth/strategies.py +0 -0
  365. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/auth/verification.py +0 -0
  366. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/browser_manager.py +0 -0
  367. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/chain.py +0 -0
  368. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/chain_manifest.py +0 -0
  369. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/cli_character.py +0 -0
  370. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/cli_data.py +0 -0
  371. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/cli_instructions.py +0 -0
  372. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/cli_models.py +0 -0
  373. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/cli_movie.py +0 -0
  374. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/cli_project.py +0 -0
  375. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/cli_run.py +0 -0
  376. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/cli_scene.py +0 -0
  377. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/cli_tools.py +0 -0
  378. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/composition.py +0 -0
  379. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/config.py +0 -0
  380. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/data/__init__.py +0 -0
  381. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/data/chain_repo.py +0 -0
  382. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
  383. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
  384. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
  385. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
  386. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
  387. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
  388. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/data/migrations/0007_queue.sql +0 -0
  389. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/data/migrations/0008_add_operation_expanded_prompt.sql +0 -0
  390. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/data/migrations/0009_queue_claims.sql +0 -0
  391. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
  392. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/data/models.py +0 -0
  393. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/data/queries.py +0 -0
  394. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/data/redaction.py +0 -0
  395. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/data/repository.py +0 -0
  396. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/data/store.py +0 -0
  397. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/diagnostics.py +0 -0
  398. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/errors.py +0 -0
  399. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/exceptions.py +0 -0
  400. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/image_batch.py +0 -0
  401. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/json_output.py +0 -0
  402. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/mcp/prompts.py +0 -0
  403. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/mcp/resources.py +0 -0
  404. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/media.py +0 -0
  405. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/movie_manifest.py +0 -0
  406. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/observability.py +0 -0
  407. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/paths.py +0 -0
  408. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/profile_lease.py +0 -0
  409. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/profile_store.py +0 -0
  410. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/redaction.py +0 -0
  411. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/services/__init__.py +0 -0
  412. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/services/character_create.py +0 -0
  413. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/services/mentions.py +0 -0
  414. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/storage.py +0 -0
  415. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/tools/__init__.py +0 -0
  416. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/tools/banned.py +0 -0
  417. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/tools/builtin/__init__.py +0 -0
  418. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/tools/builtin/creative-director.toml +0 -0
  419. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/tools/builtin/reverse-engineer.toml +0 -0
  420. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/tools/builtin/storyboard.toml +0 -0
  421. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/tools/expander.py +0 -0
  422. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/tools/invocation.py +0 -0
  423. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/tools/loader.py +0 -0
  424. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/tools/registry.py +0 -0
  425. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/tools/runtime.py +0 -0
  426. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/tools/spec.py +0 -0
  427. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/ui/server.py +0 -0
  428. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/worker/codec.py +0 -0
  429. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/worker/daemon.py +0 -0
  430. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/src/gflow_cli/worker/queue.py +0 -0
  431. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tasks/lessons.md +0 -0
  432. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/test_assets/sample_batch.json +0 -0
  433. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/test_assets/sample_batch.tsv +0 -0
  434. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/test_assets/sample_batch_invalid.tsv +0 -0
  435. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/__init__.py +0 -0
  436. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/__init__.py +0 -0
  437. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/fixtures/character_gen_response.json +0 -0
  438. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/fixtures/patch_entity_response.json +0 -0
  439. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/test_aisandbox_auth_error.py +0 -0
  440. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
  441. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/test_bearer_redaction.py +0 -0
  442. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/test_character.py +0 -0
  443. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/test_client.py +0 -0
  444. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/test_client_character.py +0 -0
  445. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/test_client_delete_characters.py +0 -0
  446. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/test_client_errors.py +0 -0
  447. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/test_client_generate_character.py +0 -0
  448. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/test_client_image.py +0 -0
  449. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/test_client_incidents.py +0 -0
  450. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/test_client_launch_kwargs.py +0 -0
  451. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/test_client_patch_entity.py +0 -0
  452. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/test_client_scene.py +0 -0
  453. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/test_client_upscale.py +0 -0
  454. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/test_concurrency.py +0 -0
  455. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/test_dto.py +0 -0
  456. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/test_engine.py +0 -0
  457. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/test_image.py +0 -0
  458. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/test_image_dto.py +0 -0
  459. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/test_image_upscale.py +0 -0
  460. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/test_post_json_aisandbox_auth.py +0 -0
  461. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/test_recaptcha.py +0 -0
  462. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/test_retry.py +0 -0
  463. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/test_routes.py +0 -0
  464. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/test_routes_character.py +0 -0
  465. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/test_routes_scene.py +0 -0
  466. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/test_sapisidhash_helper.py +0 -0
  467. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/test_scene_models.py +0 -0
  468. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/test_video.py +0 -0
  469. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/test_video_request.py +0 -0
  470. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/transports/__init__.py +0 -0
  471. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/transports/conftest.py +0 -0
  472. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/transports/drivers/__init__.py +0 -0
  473. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/transports/drivers/test_agentic.py +0 -0
  474. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/transports/drivers/test_classic.py +0 -0
  475. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/transports/drivers/test_factory.py +0 -0
  476. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/transports/drivers/test_ui_mode.py +0 -0
  477. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/transports/test_agentic_cohort_detection.py +0 -0
  478. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/transports/test_base.py +0 -0
  479. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/transports/test_bearer.py +0 -0
  480. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/transports/test_common.py +0 -0
  481. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
  482. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/transports/test_factory.py +0 -0
  483. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/transports/test_fingerprint.py +0 -0
  484. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/transports/test_mode_control.py +0 -0
  485. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/transports/test_sapisidhash.py +0 -0
  486. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/transports/test_selector_symmetry.py +0 -0
  487. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/transports/test_transport_timeout.py +0 -0
  488. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
  489. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/api/transports/test_ui_character_editor.py +0 -0
  490. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/auth/strategies/test_factory.py +0 -0
  491. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/auth/strategies/test_strategies.py +0 -0
  492. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/auth/test_cookies.py +0 -0
  493. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/auth/test_real_chrome.py +0 -0
  494. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/auth/test_verification.py +0 -0
  495. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/autopilot/test_pr_triage_autopilot.py +0 -0
  496. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/cli/__init__.py +0 -0
  497. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/cli/test_cli_auth_list.py +0 -0
  498. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/cli/test_cli_character.py +0 -0
  499. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/cli/test_cli_character_create.py +0 -0
  500. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/cli/test_cli_data.py +0 -0
  501. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/cli/test_cli_data_errors.py +0 -0
  502. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/cli/test_cli_data_errors_retention.py +0 -0
  503. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/cli/test_cli_image.py +0 -0
  504. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
  505. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/cli/test_cli_image_selector_drift.py +0 -0
  506. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/cli/test_cli_image_upscale.py +0 -0
  507. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/cli/test_cli_image_uuid_ref_enrichment.py +0 -0
  508. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/cli/test_cli_instructions.py +0 -0
  509. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/cli/test_cli_models.py +0 -0
  510. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/cli/test_cli_movie.py +0 -0
  511. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/cli/test_cli_run.py +0 -0
  512. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/cli/test_cli_scene.py +0 -0
  513. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/cli/test_cli_tools.py +0 -0
  514. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/cli/test_cli_video.py +0 -0
  515. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/cli/test_cli_video_chain.py +0 -0
  516. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/cli/test_error_handling.py +0 -0
  517. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/cli/test_failure_funnel.py +0 -0
  518. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/cli/test_helpers.py +0 -0
  519. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/cli/test_incident_output.py +0 -0
  520. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/cli/test_movie_manifest.py +0 -0
  521. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/cli/test_movie_manifest_style_variants.py +0 -0
  522. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/cli/test_settings_validation.py +0 -0
  523. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
  524. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/composition/test_character.py +0 -0
  525. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/composition/test_compose_prompt.py +0 -0
  526. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/composition/test_handoff.py +0 -0
  527. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/composition/test_style_variants.py +0 -0
  528. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/composition/test_style_variants_e2e.py +0 -0
  529. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/conftest.py +0 -0
  530. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/data/__init__.py +0 -0
  531. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/data/test_chain_repo.py +0 -0
  532. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/data/test_find_incomplete_character.py +0 -0
  533. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/data/test_models.py +0 -0
  534. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/data/test_packaging.py +0 -0
  535. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/data/test_recorder_character.py +0 -0
  536. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/data/test_redaction.py +0 -0
  537. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/data/test_repository.py +0 -0
  538. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/data/test_scene_persistence.py +0 -0
  539. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/data/test_settings_and_errors.py +0 -0
  540. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/data/test_store_migrations.py +0 -0
  541. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/dev/test_recording_client.py +0 -0
  542. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/e2e/__init__.py +0 -0
  543. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/e2e/conftest.py +0 -0
  544. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
  545. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/e2e/test_asset_tagging_e2e.py +0 -0
  546. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
  547. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/e2e/test_cancellation_e2e.py +0 -0
  548. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/e2e/test_chain_e2e.py +0 -0
  549. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/e2e/test_character_create_e2e.py +0 -0
  550. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/e2e/test_crash_recovery_e2e.py +0 -0
  551. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/e2e/test_daemon_e2e.py +0 -0
  552. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/e2e/test_data_layer_e2e.py +0 -0
  553. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/e2e/test_entity_smuggling_e2e.py +0 -0
  554. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/e2e/test_i2v_flags_e2e.py +0 -0
  555. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/e2e/test_image_batch_e2e.py +0 -0
  556. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
  557. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/e2e/test_image_uuid_ref_e2e.py +0 -0
  558. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/e2e/test_incident_quality_e2e.py +0 -0
  559. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/e2e/test_json_output_e2e.py +0 -0
  560. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/e2e/test_live_agentic_instructions.py +0 -0
  561. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
  562. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/e2e/test_project_naming_e2e.py +0 -0
  563. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/e2e/test_scene_compose_live.py +0 -0
  564. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/e2e/test_tools_e2e.py +0 -0
  565. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/e2e/test_transports_e2e.py +0 -0
  566. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
  567. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
  568. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/features/__init__.py +0 -0
  569. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/features/asset_tagging.feature +0 -0
  570. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/features/auth.feature +0 -0
  571. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/features/auth_login.feature +0 -0
  572. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/features/character_create.feature +0 -0
  573. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/features/character_read.feature +0 -0
  574. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/features/conftest.py +0 -0
  575. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/features/image.feature +0 -0
  576. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/features/image_upscale.feature +0 -0
  577. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/features/incident_diagnostics.feature +0 -0
  578. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/features/instructions.feature +0 -0
  579. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/features/locale_picker_include.feature +0 -0
  580. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/features/test_asset_tagging_steps.py +0 -0
  581. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/features/test_auth_login_steps.py +0 -0
  582. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/features/test_auth_steps.py +0 -0
  583. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/features/test_character_create_steps.py +0 -0
  584. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/features/test_character_read_steps.py +0 -0
  585. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/features/test_image_upscale_steps.py +0 -0
  586. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/features/test_incident_diagnostics_steps.py +0 -0
  587. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/features/test_instructions_steps.py +0 -0
  588. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/features/test_locale_picker_include_steps.py +0 -0
  589. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/features/test_step_collision_guard.py +0 -0
  590. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/features/test_video_agent_ui_steps.py +0 -0
  591. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/features/test_video_chain_steps.py +0 -0
  592. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/features/video_agent_ui.feature +0 -0
  593. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/features/video_chain.feature +0 -0
  594. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/fixtures/__init__.py +0 -0
  595. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/fixtures/seeded_catalog.py +0 -0
  596. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/image_batch/__init__.py +0 -0
  597. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/image_batch/test_image_manifest.py +0 -0
  598. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/image_batch/test_jitter_config.py +0 -0
  599. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/image_batch/test_observability_events.py +0 -0
  600. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/integration/__init__.py +0 -0
  601. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/integration/conftest.py +0 -0
  602. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/integration/constants.py +0 -0
  603. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/integration/test_expander_gateway.py +0 -0
  604. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/integration/test_storage_gcs.py +0 -0
  605. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/mcp/__init__.py +0 -0
  606. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/mcp/test_tools_helpers.py +0 -0
  607. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/mcp/test_tools_instructions.py +0 -0
  608. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/mcp/test_tools_wired.py +0 -0
  609. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
  610. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
  611. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/scripts/test_check_materiality.py +0 -0
  612. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/scripts/test_check_release_artifacts.py +0 -0
  613. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/scripts/test_check_repo_hygiene.py +0 -0
  614. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/scripts/test_check_website_docs_pii.py +0 -0
  615. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/scripts/test_codex_plugin.py +0 -0
  616. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/scripts/test_generate_website_docs.py +0 -0
  617. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/scripts/test_incident_bundle_quality.py +0 -0
  618. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/scripts/test_materiality_backtest.py +0 -0
  619. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/services/__init__.py +0 -0
  620. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/services/test_character_create_redaction.py +0 -0
  621. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/services/test_character_create_saga.py +0 -0
  622. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
  623. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/services/test_mentions_observability.py +0 -0
  624. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/services/test_mentions_parse.py +0 -0
  625. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/services/test_mentions_resolve.py +0 -0
  626. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/services/test_resolve_and_apply.py +0 -0
  627. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/smoke/__init__.py +0 -0
  628. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/smoke/test_profile_account_smoke.py +0 -0
  629. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/smoke/test_real_flow.py +0 -0
  630. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/test_auth.py +0 -0
  631. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/test_browser_manager.py +0 -0
  632. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/test_chain.py +0 -0
  633. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/test_chain_manifest.py +0 -0
  634. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/test_cli_data.py +0 -0
  635. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/test_cli_project.py +0 -0
  636. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/test_config.py +0 -0
  637. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/test_conftest_isolation.py +0 -0
  638. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/test_data_queries.py +0 -0
  639. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/test_diagnostics_bundle.py +0 -0
  640. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/test_diagnostics_events.py +0 -0
  641. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/test_diagnostics_journal.py +0 -0
  642. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/test_diagnostics_recorder.py +0 -0
  643. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/test_diagnostics_retention.py +0 -0
  644. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/test_diagnostics_sanitize.py +0 -0
  645. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/test_documentation_gate.py +0 -0
  646. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/test_errors.py +0 -0
  647. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/test_errors_classification.py +0 -0
  648. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/test_json_output.py +0 -0
  649. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/test_marker_registry.py +0 -0
  650. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/test_media.py +0 -0
  651. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/test_observability.py +0 -0
  652. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/test_overlay_banner_dismissal.py +0 -0
  653. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/test_paths.py +0 -0
  654. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/test_profile_lease.py +0 -0
  655. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/test_profile_lease_subprocess.py +0 -0
  656. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/test_profile_store.py +0 -0
  657. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/test_self_documenting_errors.py +0 -0
  658. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/test_smoke.py +0 -0
  659. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/tools/__init__.py +0 -0
  660. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/tools/test_banned.py +0 -0
  661. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/tools/test_expander.py +0 -0
  662. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/tools/test_invocation.py +0 -0
  663. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/tools/test_loader.py +0 -0
  664. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/tools/test_registry.py +0 -0
  665. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/tools/test_runtime.py +0 -0
  666. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/tools/test_spec.py +0 -0
  667. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/worker/test_codec.py +0 -0
  668. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/worker/test_daemon.py +0 -0
  669. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/worker/test_mcp_daemon_race.py +0 -0
  670. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/worker/test_queue.py +0 -0
  671. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/worker/test_queue_multiprocess.py +0 -0
  672. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/tests/worker/test_queue_reconciliation.py +0 -0
  673. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/website/docs/ARCHITECTURE.md +0 -0
  674. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/website/docs/AUTHENTICATION.md +0 -0
  675. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/website/docs/CHARACTER.md +0 -0
  676. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/website/docs/CONFIGURATION.md +0 -0
  677. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/website/docs/DEBUGGING.md +0 -0
  678. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/website/docs/DEVELOPMENT.md +0 -0
  679. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/website/docs/EXTERNAL_STORAGE.md +0 -0
  680. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/website/docs/INSTRUCTIONS.md +0 -0
  681. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/website/docs/MOVIE.md +0 -0
  682. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/website/docs/PROMPT_EXPANSION.md +0 -0
  683. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/website/docs/SECURITY.md +0 -0
  684. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/website/docs/TOOLS.md +0 -0
  685. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/website/docs/USER_GUIDE.md +0 -0
  686. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/website/docs/index.md +0 -0
  687. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/website/docs/installation.md +0 -0
  688. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/website/docs/onboarding-mockup.html +0 -0
  689. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/website/docs/onboarding.md +0 -0
  690. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/website/docs/stylesheets/extra.css +0 -0
  691. {gflow_cli-0.46.0 → gflow_cli-0.48.0}/website/mkdocs.yml +0 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gflow",
3
- "version": "0.46.0",
3
+ "version": "0.48.0",
4
4
  "description": "Reusable development and operations workflows for gflow-cli",
5
5
  "author": {
6
6
  "name": "Flavio Oliva",
@@ -39,6 +39,68 @@ jobs:
39
39
  uv export --frozen --format requirements-txt --no-emit-project > requirements-audit.txt
40
40
  uvx pip-audit -r requirements-audit.txt
41
41
 
42
+ # ── Supply-chain gate: resolve WITHOUT the lockfile ───────────────────────
43
+ # Every other job installs via `uv sync`, which honours uv.lock. That means CI
44
+ # never exercises the version RANGES in pyproject.toml — the exact blind spot
45
+ # that let `mcp>=1.0.0` (unbounded) ship a broken MCP surface to every fresh
46
+ # `pip install gflow-cli` while CI stayed green: mcp 2.0.0 deleted
47
+ # `mcp.server.fastmcp`, which the server imports at module load.
48
+ #
49
+ # This job installs the way a USER does — from the declared ranges, newest
50
+ # compatible versions, no lockfile — and smoke-imports the surfaces that break
51
+ # first. It is what turns "a dependency published a major bump" from a user
52
+ # bug report into a CI failure.
53
+ resolve-drift:
54
+ name: Dependency resolution drift (no lockfile)
55
+ runs-on: ubuntu-latest
56
+ steps:
57
+ - uses: actions/checkout@v7
58
+
59
+ - name: Install uv
60
+ uses: astral-sh/setup-uv@v7
61
+
62
+ - name: Set up Python
63
+ run: uv python install 3.13
64
+
65
+ - name: Install from pyproject ranges (ignore uv.lock)
66
+ # --upgrade resolves to the newest versions the ranges allow, so a newly
67
+ # published major that our bounds do not exclude is caught here.
68
+ run: |
69
+ uv venv
70
+ uv pip install --upgrade .
71
+
72
+ - name: Smoke-import the MCP surface
73
+ # Import-time failures (deleted modules, moved symbols) surface here.
74
+ # Registration is a decorator side effect, so a successful import with a
75
+ # non-empty tool registry proves the whole surface still wires up.
76
+ run: |
77
+ uv run --no-sync python - <<'PY'
78
+ from gflow_cli.mcp.server import server, run_stdio, run_http, run_sse
79
+ from gflow_cli.mcp import prompts, resources, tools # noqa: F401
80
+
81
+ n_tools = len(server._tool_manager._tools)
82
+ n_resources = len(server._resource_manager._resources)
83
+ n_prompts = len(server._prompt_manager._prompts)
84
+ print(f"tools={n_tools} resources={n_resources} prompts={n_prompts}")
85
+ assert n_tools, "no MCP tools registered"
86
+ assert n_resources, "no MCP resources registered"
87
+ assert n_prompts, "no MCP prompts registered"
88
+
89
+ import mcp.types as t
90
+ print("negotiable protocol ceiling:", t.LATEST_PROTOCOL_VERSION)
91
+ PY
92
+
93
+ - name: Smoke-run the CLI entry points
94
+ run: |
95
+ uv run --no-sync gflow --version
96
+ uv run --no-sync gflow --help
97
+ uv run --no-sync gflow serve --help
98
+
99
+ - name: Report the resolved versions
100
+ # Printed unconditionally so a green run still records what was resolved.
101
+ if: always()
102
+ run: uv pip list
103
+
42
104
  # ── Main test matrix ──────────────────────────────────────────────────────
43
105
  test:
44
106
  runs-on: ubuntu-latest
@@ -9,7 +9,7 @@ Supported tools that auto-discover this file: Cursor, Codex, Aider, Antigravity
9
9
  - Unofficial Python CLI for [Google Flow](https://labs.google/fx/tools/flow) — drives Veo (image-to-video, text-to-video) and Imagen (text-to-image) generations from the terminal by reverse-engineering Flow's private REST API at `aisandbox-pa.googleapis.com`.
10
10
  - Python 3.11+ · `uv`-managed · `hatchling` builds · Playwright Chromium transport · `pyright` strict · `ruff` · `pytest`.
11
11
  - Single-package modular monolith. Top-level modules under `src/gflow_cli/`: `api/`, `auth/`, `data/`, `mcp/`, `services/`, `tools/`, `ui/`, `worker/`, `browser_manager.py`, `cli.py`, `_cli_helpers.py`, `cli_character.py`, `cli_data.py`, `cli_image.py`, `cli_instructions.py`, `cli_models.py`, `cli_movie.py`, `cli_run.py`, `cli_scene.py`, `cli_tools.py`, `cli_video.py`, `chain.py`, `chain_manifest.py`, `composition.py`, `config.py`, `errors.py`, `exceptions.py`, `image_batch.py`, `movie_manifest.py`, `observability.py`, `paths.py`, `profile_store.py`.
12
- - Command surface: `gflow auth`, `gflow image` (t2i/i2i/batch/upload/upscale), `gflow video` (t2v/i2v/r2v/chain — no `batch` subcommand; the nonfunctional stub was removed, loop `gflow video t2v`/`i2v` from the shell for multi-clip runs), `gflow character` (create/list/show/rm/voices — reusable project-scoped Flow Character entities), `gflow scene` (create/show — Add Clip / Scenes, with `create --output` for credit-free server-side extended video), `gflow instructions` (persistent Agent-Mode brief cards — add/list/enable/disable/rm/apply/toggle-mode, credits-free, `--project` required), `gflow movie` (run/template — multi-scene manifest pipeline), `gflow tools` (list/show/run — prompt-rewriting tools, also `--tool` on generation commands), `gflow data` (catalog queries), `gflow models`, `gflow run`, `gflow mcp` (run/setup — stdio MCP server), and `gflow serve` (HTTP/SSE).
12
+ - Command surface: `gflow auth`, `gflow image` (t2i/i2i/batch/upload/upscale), `gflow video` (t2v/i2v/r2v/chain — no `batch` subcommand; the nonfunctional stub was removed, loop `gflow video t2v`/`i2v` from the shell for multi-clip runs), `gflow character` (create/list/show/rm/voices — reusable project-scoped Flow Character entities), `gflow scene` (create/show — Add Clip / Scenes, with `create --output` for credit-free server-side extended video), `gflow instructions` (persistent Agent-Mode brief cards — add/list/enable/disable/rm/apply/toggle-mode, credits-free, `--project` required), `gflow movie` (run/template — multi-scene manifest pipeline), `gflow tools` (list/show/run — prompt-rewriting tools, also `--tool` on generation commands), `gflow data` (catalog queries), `gflow models`, `gflow run`, `gflow mcp` (run/setup — stdio MCP server), and `gflow serve` (Streamable HTTP at `/mcp`; `--transport sse` is deprecated).
13
13
  - Requires a Google AI Ultra or Pro subscription with Flow access. All generations bill against the user's own Google account.
14
14
 
15
15
  ## Headed-browser dependency (architectural reality)
@@ -7,6 +7,86 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.48.0] — 2026-08-02
11
+
12
+ ### Added
13
+
14
+ - **Explicit `-o` / `--output` flag on the core generation commands (#411).**
15
+ `gflow image t2i`, `gflow image i2i`, `gflow video t2v` and `gflow video i2v`
16
+ now accept an explicit **local** destination file path, so scripts control
17
+ exactly where the generated asset lands instead of parsing the
18
+ date-partitioned default layout. Parent directories are auto-created, and
19
+ `-o` takes precedence over `--out`/`--out-dir`. Multi-count **image** runs
20
+ (`--count > 1`) append a deterministic `_1`, `_2`, … suffix before the
21
+ extension; video runs write a single file. On `t2i` the flag is
22
+ single-prompt only — multi-prompt runs abort with a usage error pointing at
23
+ `--out`. Known limits, tracked as follow-ups: no `s3://`/`gs://` targets and
24
+ no `GFLOW_CLI_STORAGE_URI` interplay yet, no `-o` on `video r2v`/`chain`, no
25
+ video multi-count suffixes (#415); the MCP generate tools do **not** carry a
26
+ matching `output` parameter — one was cut before release when the pre-release
27
+ audit showed the worker queue never reads it, making it a silent no-op
28
+ (#414). Raised by a Reddit user testing scriptability (thanks u/_suren).
29
+
30
+ ## [0.47.0] — 2026-08-01
31
+
32
+ ### Fixed
33
+
34
+ - **Entity attachments left no trace in the catalog, making character provenance
35
+ unrecoverable (#402).** `--reference-entity` / `--reference-entity-name` reached
36
+ the transport but were never recorded, so no `image t2i`, `image i2i` or movie
37
+ R2V operation carried the entity it was generated from — while `--ref` media
38
+ refs were recorded in full, with ordering. When character identity drift showed
39
+ up, the catalog could not answer "which entity produced this image?".
40
+ Generation operations now persist `entity_ids` and `entity_names` in
41
+ `operations.metadata_json`, in attach order, on succeeded and failed rows alike
42
+ — a FAILED row carrying `entity_ids` distinguishes a rejected attach from a run
43
+ that never requested an entity. Tool and entity provenance are composed into a
44
+ single `set_operation_metadata` write, since that call replaces the whole
45
+ column. Forward-only: operations recorded before this release cannot be
46
+ Live gate: `tests/e2e/test_entity_provenance_e2e.py` (opt-in via
47
+ `GFLOW_CLI_E2E_RUN_ENTITY_PROV=1`) verifies the recorded entity matches a
48
+ generation Flow actually accepted, including the rejected-attach case.
49
+ - **The MCP server was broken on every fresh install.** `pyproject.toml`
50
+ declared an unbounded `mcp>=1.0.0`. `uv.lock` pinned `1.28.1`, so CI and
51
+ contributors stayed green — but `pip install gflow-cli` / `uv tool install
52
+ gflow-cli` resolved the newly published `mcp` 2.0.0, which **deleted the
53
+ `mcp.server.fastmcp` module** that `gflow_cli.mcp.server` imports at module
54
+ load. `gflow mcp run`, `gflow serve`, and `gflow mcp setup` all failed with
55
+ `ModuleNotFoundError: No module named 'mcp.server.fastmcp'`. The dependency is
56
+ now bounded (`mcp>=2.0.0,<3`) and the server is migrated to the 2.x API.
57
+ Pure-CLI paths were never affected.
58
+ - **New `resolve-drift` CI job — the actual defect.** Every other job installs
59
+ via `uv sync`, which honours `uv.lock`, so CI never exercised the version
60
+ *ranges* in `pyproject.toml` and could not have caught the above. This job
61
+ installs the way a user does — from the declared ranges, newest compatible
62
+ versions, no lockfile — then smoke-imports the MCP surface and the CLI entry
63
+ points. It generalizes to every unbounded dependency, not just `mcp`.
64
+ - **`ui/app.py` advertised an unroutable MCP message endpoint.** mcp 2.0 dropped
65
+ FastMCP's `sse_app(mount_path=...)` shim, which used to let the advertised
66
+ endpoint (`/mcp/messages/`) differ from the sub-app's internal route
67
+ (`/messages/`). Both now derive from one `message_path`, so the advertised
68
+ path was left unrouted at the app root — a silent failure where the SSE stream
69
+ opens and only the follow-up POSTs 404. Fixed with an explicit alias and
70
+ pinned by a regression test.
71
+
72
+ ## [0.46.1] — 2026-07-31
73
+
74
+ ### Fixed
75
+
76
+ - **`image t2i` failed whenever `-n` differed from the displayed count — including
77
+ the default `-n 1` (#404).** Flow renamed the composer's count-tab labels from
78
+ `1x`/`x2`/… to `x1`/`x2`/…, so the count setter's label filter silently dropped
79
+ the count-1 tab and its positional pick clicked the wrong tab (reporting
80
+ per-click success while the value never changed). The count tab is now selected
81
+ by the digit in its label across both label cohorts (`1x`/`x1`), the read-back recognises a
82
+ selected `x1`, and non-convergence raises `UiSelectorDriftError` (exit 23)
83
+ naming desired vs displayed — instead of a bare `RuntimeError` that
84
+ observability hashed into an opaque `UnexpectedError`. The per-click
85
+ `count_click_result` log now carries `effect_observed`, and the video output
86
+ count setter probes both label cohorts too. Verified live on the classic
87
+ composer (new e2e: `tests/e2e/test_classic_count_setter_e2e.py`; evidence:
88
+ [LIVE_VERIFICATION_v0.46.1](docs/LIVE_VERIFICATION_v0.46.1.md)).
89
+
10
90
  ## [0.46.0] — 2026-07-28
11
91
 
12
92
  ### Changed
@@ -2518,7 +2598,10 @@ shell-script template that branches on these codes.
2518
2598
 
2519
2599
  First skeleton. Not functional end-to-end yet.
2520
2600
 
2521
- [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.46.0...HEAD
2601
+ [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.48.0...HEAD
2602
+ [0.48.0]: https://github.com/ffroliva/gflow-cli/compare/v0.47.0...v0.48.0
2603
+ [0.47.0]: https://github.com/ffroliva/gflow-cli/compare/v0.46.1...v0.47.0
2604
+ [0.46.1]: https://github.com/ffroliva/gflow-cli/compare/v0.46.0...v0.46.1
2522
2605
  [0.46.0]: https://github.com/ffroliva/gflow-cli/compare/v0.45.0...v0.46.0
2523
2606
  [0.45.0]: https://github.com/ffroliva/gflow-cli/compare/v0.44.0...v0.45.0
2524
2607
  [0.44.0]: https://github.com/ffroliva/gflow-cli/compare/v0.43.0...v0.44.0
@@ -118,7 +118,8 @@ denon82 profile (aborted pre-submit, saving the 10-credit generation).
118
118
  **Root cause (confirmed live 2026-07-11, screenshot evidence on #288): the
119
119
  duration control is ABSENT from this cohort's settings popover** — the panel
120
120
  renders mode tabs (Imagem/Video), sub-mode (Frames/Elementos), aspect
121
- (9:16/16:9), count (1x–x4), and the model dropdown (Veo 3.1 - Lite), and
121
+ (9:16/16:9), count (1x–x4; labels renamed to xN since — see #404), and the
122
+ model dropdown (Veo 3.1 - Lite), and
122
123
  nothing else. The earlier locale hypothesis is refuted: the UI renders in
123
124
  Portuguese and the sibling count tabs (`1x`/`x2`) match fine; there is simply
124
125
  no duration row to click. Whether Flow removed clip-length selection for this
@@ -629,10 +630,14 @@ issue and not blocked by any code change in this repo.
629
630
  locale-leak fix.
630
631
 
631
632
  **Earlier — Phase 7 multi-image-prompt work** addressed the count-tab selectors:
632
- - `_COUNT_TAB_TEXT_RE = ^(1x|x[2-4])$` only matches the digit+x format Flow
633
+ - `_COUNT_TAB_TEXT_RE = ^(1x|x[1-4])$` only matches the digit+x format Flow
633
634
  renders identically in every locale (numbers/symbols are not translated).
634
- - `_set_count` falls back to positional `.nth(count - 1)` when the read-back
635
- text is unrecognised — locale-invariant.
635
+ Widened for #404: Flow renamed the count-1 label from `1x` to `x1`
636
+ (uniform `xN`, live-verified 2026-07-31); both cohorts are accepted.
637
+ - `_set_count` clicks the tab carrying the desired DIGIT (`1x`/`x1` for
638
+ count=1), not a position — the #404 rename shrank the old filtered set and
639
+ shifted every `.nth(count - 1)` pick by one. Non-convergence raises
640
+ `UiSelectorDriftError` (exit 23) with desired vs displayed counts.
636
641
 
637
642
  **Earlier — PR #48:**
638
643
  - Added `--lang=en-US` Chromium launch arg; parts of `NEW_PROJECT_SELECTORS` /
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gflow-cli
3
- Version: 0.46.0
3
+ Version: 0.48.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
@@ -41,7 +41,7 @@ Requires-Dist: browser-cookie3>=0.20.1
41
41
  Requires-Dist: click>=8.1.0
42
42
  Requires-Dist: fastapi>=0.115.0
43
43
  Requires-Dist: httpx>=0.27.0
44
- Requires-Dist: mcp>=1.0.0
44
+ Requires-Dist: mcp<3,>=2.0.0
45
45
  Requires-Dist: platformdirs>=4.0.0
46
46
  Requires-Dist: playwright>=1.45.0
47
47
  Requires-Dist: pydantic-settings>=2.5.0
@@ -34,12 +34,41 @@ The schema is adapter-shaped so a future Postgres backend can slot in without ch
34
34
  | `profiles` | Logical profile name (e.g. `default`), profile dir, first/last-seen timestamps | First operation per profile |
35
35
  | `projects` | Flow project ID + display title per profile | First operation that touches the project |
36
36
  | `assets` | One row per Flow media ID (image OR video) — model, aspect, dimensions, seed, generation ID, status | Upload response, image generation response, video start, video completion |
37
- | `operations` | One row per CLI command invocation — mode (`upload_image`/`t2i`/`i2i`/`t2v`/`i2v`/`r2v`), prompt, model, aspect, started/completed timestamps, error type/detail, Flow operation/batch IDs | Each command run |
37
+ | `operations` | One row per CLI command invocation — mode (`upload_image`/`t2i`/`i2i`/`t2v`/`i2v`/`r2v`), prompt, model, aspect, started/completed timestamps, error type/detail, Flow operation/batch IDs, plus [`metadata_json` provenance](#operation-metadata_json-provenance) | Each command run |
38
38
  | `operation_assets` | Many-to-many between operations and assets, with role (`input`/`output`/`seed_start`/`seed_end`/`reference`) and ordered position | When the operation links its inputs/outputs |
39
39
  | `local_files` | One row per downloaded asset location — local path or cloud URI, sha256/byte count when local, media type | After each download/upload completes |
40
40
 
41
41
  Schema lives in [`src/gflow_cli/data/migrations/0001_initial.sql`](../src/gflow_cli/data/migrations/0001_initial.sql).
42
42
 
43
+ ### Operation `metadata_json` provenance
44
+
45
+ `operations.metadata_json` answers "what composed this generation?" — the parts
46
+ that aren't columns. Keys are written only when they apply, so an operation with
47
+ neither a tool nor an entity leaves the column `NULL`:
48
+
49
+ | Key | Shape | Written when |
50
+ |---|---|---|
51
+ | `tool` | `{name, version, model, params, config_hash}` (redacted mode: `{name, version, params_hash, config_hash}`) | `--tool` rewrote the prompt |
52
+ | `entity_ids` | `["entity-abc", …]` — Flow CHARACTER entity ids, in attach order | `--reference-entity` was used |
53
+ | `entity_names` | `["Ana", …]` — display names paired with `--reference-entity-name` | `--reference-entity-name` was used |
54
+ | `entity_id` / `name` | scalar id + display name of the entity being created | `character create` only |
55
+
56
+ Entity keys cover `image t2i`, `image i2i`, and movie R2V — the surfaces that
57
+ accept `--reference-entity` — on succeeded **and** failed rows. A FAILED row
58
+ carrying `entity_ids` is how a rejected attach (the transport's wire backstop
59
+ refusing to report a text-only generation as an entity-referenced success) stays
60
+ distinguishable from a run that never requested an entity. Before v0.47.0 the
61
+ entity keys were absent on every generation operation, so character provenance
62
+ could not be reconstructed for those runs — the gap is forward-only, not
63
+ backfillable (issue [#402](https://github.com/ffroliva/gflow-cli/issues/402)).
64
+
65
+ Unlike `assets.metadata_json`, this column is **not** passed through
66
+ `redact_metadata`. Entity ids and names are Flow-side handles the user picked
67
+ rather than prompt text, so they stay readable in `redacted` prompt mode — the
68
+ same treatment `character create` already gave them. Keep that in mind before
69
+ adding a key here: anything prompt-derived must be hashed by its own builder
70
+ (as `tool` does) rather than relying on column-level redaction.
71
+
43
72
  ### What is NOT recorded
44
73
 
45
74
  - Signed CDN URLs (e.g., `fifeUrl?Signature=...`) — they expire and contain bearer-style tokens.
@@ -79,6 +79,7 @@ e2e ─┬─ e2e_auth (auth/session, health check — zero credits)
79
79
  | `GFLOW_CLI_E2E_VIDEO_ASPECT` | `"landscape"` | Aspect ratio for video e2e: `landscape` or `portrait`. |
80
80
  | `GFLOW_CLI_E2E_VIDEO_MODEL` | `"omni-flash"` | Veo model for i2v tests: `omni-flash` or `veo-fast`. |
81
81
  | `GFLOW_CLI_E2E_VIDEO_DURATION` | `"4"` | Seconds of video to generate in i2v tests (minimum credit unit). |
82
+ | `GFLOW_CLI_E2E_RUN_ENTITY_PROV` | `"0"` | Set to `"1"` to run the entity-provenance e2e (#402) — asserts a generation Flow actually accepted records its `entity_ids` / `entity_names` in `operations.metadata_json`. Opt-in because it spends Imagen credits. |
82
83
  | `GFLOW_CLI_E2E_BATCH_MANIFEST` | `test_assets/sample_batch.tsv` | TSV manifest for the batch image e2e. |
83
84
  | `GFLOW_CLI_E2E_BATCH_JITTER` | `"1"` | Set to `"0"` to disable inter-request jitter in batch tests. |
84
85
  | `GFLOW_CLI_E2E_PROMPT` | *(safe default)* | Prompt override for the smoke test. |
@@ -40,7 +40,7 @@ Welcome to the `gflow-cli` documentation. This index is the routing layer: it te
40
40
  | **[docs/MOVIE.md](MOVIE.md)** | `gflow movie` — multi-scene character-consistent films: manifest format, run lifecycle (browser stays open through generate→poll→download), entity-attach mechanism (Personagens right-click), resume/handoff, credits | Working on `gflow movie`, debugging scene generation, or understanding the character-entity attach + consistency model |
41
41
  | **[docs/TOOLS.md](TOOLS.md)** | Tools framework: the `gflow tools list/show/run` group, the `--tool/-t` option on generation commands, the TOML tool schema, how a tool is defined, "My Tools" user-authored tools, MCP exposure + §61 parity | Working on `gflow_cli.tools`, adding a built-in or user tool, or wiring `--tool` into a command |
42
42
  | **[docs/INSTRUCTIONS.md](INSTRUCTIONS.md)** | Agent Instructions: project-brief cards for Flow's Agent Mode — the mechanism (enabled cards steer generation via the reasoning path), ephemeral `-i` vs persistent cards, the `gflow instructions` CRUD surface with the single generic `--ref` (image **or** character), and the 3-layer pipeline | Working on `-i`/agent instructions, the `gflow instructions` group, or understanding how the project brief anchors generations |
43
- | **[docs/MCP.md](MCP.md)** | MCP server: `gflow mcp run` (stdio) + `gflow serve` (HTTP/SSE), the tools/prompts/resources surface, the CLI↔MCP parity contract (AGENTS.md "MCP & CLI Schema Symmetry", enforced by `tests/mcp/test_cli_parity.py`), security model, client setup | Configuring an MCP client, working on `gflow_cli.mcp`, or debugging the stdio/SSE transports |
43
+ | **[docs/MCP.md](MCP.md)** | MCP server: `gflow mcp run` (stdio) + `gflow serve` (Streamable HTTP, SSE deprecated), the tools/prompts/resources surface, the CLI↔MCP parity contract (AGENTS.md "MCP & CLI Schema Symmetry", enforced by `tests/mcp/test_cli_parity.py`), security model, client setup | Configuring an MCP client, working on `gflow_cli.mcp`, or debugging the stdio/HTTP transports |
44
44
  | **[docs/PROMPT_EXPANSION.md](PROMPT_EXPANSION.md)** | The `creative-director` tool: 5-component formula, 15 domain styles, banned-keyword policy, Gemini endpoint + I/O, never-fatal contract, `expanded_prompt` + `metadata_json.tool` provenance/redaction, config | Using or debugging `--tool creative-director`, editing the tool TOML, or auditing recorded prompt provenance |
45
45
  | **[docs/IMAGE_UPSCALE_RECON.md](IMAGE_UPSCALE_RECON.md)** | `gflow image upscale` wire protocol: `upsampleImage` endpoint, full clientContext (projectId/sessionId/tool/userPaygateTier), reCAPTCHA action `IMAGE_GENERATION`, inline base64 response, 4K Ultra-gating, REST-is-dead proof | Working on `gflow image upscale`, debugging the 403/reCAPTCHA path, or understanding Flow's image-upscale wire protocol (#171) |
46
46
  | **[docs/AGENT_UI_RECON.md](AGENT_UI_RECON.md)** | Agentic Flow UI cohort: classic-vs-agentic DOM signature, server-side + volatile (flapping) A/B gating (no client-readable flag), why `_exit_agent_mode` fails, runtime-DOM-detection recommendation | Touching `_exit_agent_mode` / composer mode-switch, diagnosing exit 23 selector drift, or understanding Flow's agentic-UI A/B (#183/#174) |
@@ -135,7 +135,7 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
135
135
  **"A command failed — where is the incident bundle and what's in it?"** → [DEBUGGING § Automatic incident bundles](DEBUGGING.md#automatic-incident-bundles) (layout, triggers, review-before-sharing); privacy boundaries: [SECURITY § Automatic incident bundles](SECURITY.md#automatic-incident-bundles-gflow_cli_incident_capture-default-on); disable via [CONFIGURATION § GFLOW_CLI_INCIDENT_CAPTURE](CONFIGURATION.md#gflow_cli_incident_capture)
136
136
  **"Flow's UI broke a selector — how do I diagnose it?"** → [DEBUGGING § Inspecting Flow's live UI](DEBUGGING.md#inspecting-flows-live-ui)
137
137
  **"What does each `ui_automation.*` log event mean?"** → [DEBUGGING § Listener & HTTP-layer debugging](DEBUGGING.md#listener--http-layer-debugging)
138
- **What was actually live-verified for the latest release?** → latest: [LIVE_VERIFICATION_v0.46.0](LIVE_VERIFICATION_v0.46.0.md) (**#387 provider-agnostic prompt-tools transport live-verified 2026-07-28, ZERO credits** — a four-probe capability spike passed 4/4 against BOTH a non-Google gateway and Google's OpenAI-compat endpoint, including a *semantic* multimodal check [a generated solid-red JPEG round-tripped and the model answered 'Red'], which is what proved the native Gemini `inlineData` path could be deleted outright rather than kept as a fallback; the real CLI then returned `was_expanded: true` on gateway/gateway-no-model/Google-default, emitted the loud one-time notice + no-op for the removed `GFLOW_CLI_GEMINI_API_KEY`, and made NO network call when unconfigured. Live verification caught two defects a fully green 2849-test offline suite missed: Google's compat endpoint has no server-side default model [`400 "model is not specified"`, silently no-oping the DEFAULT configuration], and the first redirect guard did not actually work because `build_opener()` installs its default handlers regardless of arguments, so `Authorization` would still have been replayed cross-host. `/code-review high` is recorded as NOT run — it is user-triggered only). Prior: [v0.45.0](LIVE_VERIFICATION_v0.45.0.md) (**#393 UUID `--ref` binding + #395 character-entity binding live-verified 2026-07-27/28** — a controlled A/B on identical input flipped `--ref` from exit 9 to exit 0 via the catalog-backed upload fallback, with the anti-silence guard [an unbindable ref aborts non-zero and writes no image] pinned by a live e2e; picker DOM + HAR showed Flow indexes a short auto-caption, NOT the prompt, so a prompt-derived search hint was dropped rather than shipped on assumption; a CDP spike against Flow's own character flow then captured the `entityContext` contract that gflow's generations were missing, root-causing #395 to two gflow defects [overlay dismissal Escaping Flow's own composer, and a character-route bounce that sent the prompt to the project composer] — both fixed, both character e2e tests now pass live, including `--format-prompt` [#383], with a read-back confirming the character carries its name and `thumbnail_media_id`). Prior: [v0.44.0](LIVE_VERIFICATION_v0.44.0.md) (**#381 dual-side project management & Playwright Chromium transport live-verified 2026-07-26** — real-editor project creation + rename tRPC server/DOM sync, prompt slugging, `gflow project` subcommand family, HTTP 429 adaptive backoff, and full E2E test suite). Prior: [v0.43.0](LIVE_VERIFICATION_v0.43.0.md) (**private incident diagnostics live-verified 2026-07-23, 1 Veo credit**). Prior: [v0.42.0](LIVE_VERIFICATION_v0.42.0.md) (**#361 production-readiness live-gaps confirmed live 2026-07-21, 1 Veo credit** — a real `veo-lite` t2v through the worker path persisted a real `remote_started` checkpoint [observer→checkpoint→DB chain confirmed], crash-recovery classified the task `indeterminate` without resubmitting, and mid-launch cancellation released the `ProfileLease` credit-free; full evidence in [v0.40.0-production-readiness § "2026-07-21 live follow-up"](LIVE_VERIFICATION_v0.40.0-production-readiness.md#2026-07-21-live-follow-up-0420-cycle); #359 content-safety `400`→`ContentPolicyError` classification is unit-covered, not live-triggered [would require a deliberate policy violation]; #360/#362 are docs-only, verified by the documentation gates). Prior: [v0.41.0](LIVE_VERIFICATION_v0.41.0.md) (**#357 production-readiness hardening — stale-session fail-fast, free image gen, paid veo-lite T2V all proven live**). Prior: [v0.40.0](LIVE_VERIFICATION_v0.40.0.md) (**#344 `@`-mention asset-tagging resolution proven live e2e, ~2 Imagen credits** — `gflow character create` staged a real taggable character [bound reference images, `has_reference_images` guard], the e2e test's documented propagation wait cleared Flow's `projectInitialData` lag, and `gflow image t2i "@Zoro …"` passed with returncode 0, a real generated image, and the correctly de-tagged prompt in the catalog — no code changes needed, `resolve_and_apply` as merged in #344 already works end-to-end; pre-existing unrelated issue #174 [Flow media-library A/B flake] can still intermittently block generation regardless of this feature — recorded, not omitted). Prior: [v0.39.0](LIVE_VERIFICATION_v0.39.0.md) (**#341 failed-generation persistence proven live** — a real `image t2i` on denon82 failed at the wire [`batchGenerateImages` HTTP 400 → `WireFormatError`] and the record-on-catch funnel wrote the **first-ever `failed` row** into the production catalog [`error_type=wire-format`, redacted `error_detail`, browsable via `gflow data list errors`], **$0**; the remaining paid paths [video/chain/batch/movie/worker] are funnel-regression-tested, not force-failed live [would cost credits], and the status-aware `succeeded=false` video-poll fix is unit-locked — recorded, not omitted). Prior: [v0.38.1](LIVE_VERIFICATION_v0.38.1.md) (**#338 agentic-pin recovery proven live ON the pinned account** — run 1 caught the composer-render race the unit suite could not [`ensure_media_incomplete` +115 ms, toggle never reached]; the readiness-wait fix landed and run 2 recovered classic on denon82 after ~2h of pin [`ui_driver.bound mode=classic`, real 768×1376 JPEG, exact prompt adherence]; reload branch unit-locked, live trigger not observed this cycle — recorded, not omitted). Prior: [v0.38.0](LIVE_VERIFICATION_v0.38.0.md) (**#332 mode control + #314 i2i ref dedup proven live e2e** — `image t2i --ui-mode classic` recovered agentic→classic in a real run [`ui_mode.attempt_exit_agent` → full classic chain, 1376×768 JPEG]; two identical `image i2i` runs proved the dedup contract [run 1: picker miss → `image_uploaded`; run 2: `reference_deduped_by_filename`, ZERO uploads]; `video t2v` veo-fast [`MEDIA_GENERATION_STATUS_SUCCESSFUL`, 15.2 MB `ftyp` mp4]; autopilot #333 recorded deferred-with-reason [hermes-ops deployment staged separately]). Prior: [v0.37.0](LIVE_VERIFICATION_v0.37.0.md) (**viewport 1920×1080 + agentic count enforcement + FIPS-safe SAPISIDHASH proven live e2e** — `image t2i` [classic cohort, real 1376×768 JPEG] and `video t2v` veo-fast [`MEDIA_GENERATION_STATUS_SUCCESSFUL`, 11.5 MB `ftyp` mp4] both succeeded end-to-end at the new 1920×1080 viewport with every selector resolving [no drift]; SAPISIDHASH digest verified byte-identical [FIPS-safe `usedforsecurity=False`], auth unchanged). Prior: [v0.36.0](LIVE_VERIFICATION_v0.36.0.md) (**#316 diagnostic tooling live-verified against real Flow traffic** — `GFLOW_CLI_HAR_PATH` captured a real 54-entry HAR [real Flow domains, 34× 200s, and a genuine 401 the tool exists to diagnose]; `GFLOW_CLI_DEBUG_TRACEBACK`'s typed-error scoping confirmed live [console output identical with/without the flag on a `GFlowError`]; unhandled-path behavior covered by 6 new tests (30 total across both files) + SDD task review; #312 reference-entity-smuggling fix covered by its own dedicated e2e test). Prior: [v0.35.0](LIVE_VERIFICATION_v0.35.0.md) (**#305-follow-up multimodal reverse-engineering & storyboard tool proven live e2e** — `gflow tools run storyboard` successfully deconstructed a cyberpunk scene into a cohesive 4-panel sequence; `reverse-engineer` tool extracts frames from video streams/URLs using `claude-video`'s `watch.py` and produces structured prompt components using Gemini multimodal models; dynamic token budgeting and strict Pyright types verified via test suite). Prior: [v0.34.0](LIVE_VERIFICATION_v0.34.0.md) (**#299 `--ui-mode` gate proven live, ZERO credits** — drove `get_ui_driver` directly over 4 real editor loads, never generated: bidirectional switch works [classic→agentic via `_force_agent_mode`, agentic→classic via `_exit_agent_mode`, each DOM-reverified], `agentic`-when-already-agentic is idempotent, and a timed-out toggle → **exit-28 fail-fast before submission**; deprecation behavior-change [`prefer_classic`→exit 28] confirmed). Prior: [v0.33.0](LIVE_VERIFICATION_v0.33.0.md) (**#287-follow-up picker fix proven live on the original repro** — the v0.32.1-failing `i2v <uuid> --project <crowded>` command now exits 0 with a real 3.0 MB `ftyp` mp4, `frame_ref_attached` + `video_saved`, zero uploads; **#241 jitter live-verified on both paths** — flag `--jitter 4-6` → `batch_jitter_sleep seconds=4.98`, and the new 0.5–1.5 s default → `seconds=1.47`, each firing exactly once between two t2i submissions; environment note: the denon82 cohort is now natively agentic and round-2 generations hit the pre-existing #281 `MediaAttributionError`, not a regression). Prior: [v0.32.1](LIVE_VERIFICATION_v0.32.1.md) (**#293 teardown fix live-verified credit-free** — error-path aborts leave ZERO chrome.exe holding the profile [3× leak reproduced pre-fix same day]; force-close fallback + ProfileLockedError translation unit-pinned; #283 wave logic fixes mock-verified to exact call counts). Prior: [v0.32.0](LIVE_VERIFICATION_v0.32.0.md) (**#287 UUID i2v frames proven live e2e** — an in-project asset selected by media UUID in the frame-slot dialog [frame_ref_attached, startImage bound on the wire, ZERO upload events] produced a real 720×1280 interpolation, resolving the #237 negative prior; foreign UUID → exit 9 pre-generation with screenshot; **#288 duration fail-fast proven live** — exit 23 pre-submit saved a 10-credit generation, and the debug screenshot confirmed the duration control is ABSENT from the cohort's settings popover [locale hypothesis refuted]; upload-400 exit-27 repro deferred-with-reason — the original rejected JPEG no longer exists). Prior: [v0.31.0](LIVE_VERIFICATION_v0.31.0.md) (**#281 wrong-media defenses live-verified in BOTH directions, credit-free** — correct attribution downloads with real wire metadata [seed, 768×1376]; the incident-class lazy-render ambiguity reproduced live and hard-stopped with `MediaAttributionError` exit 26 naming every candidate UUID, no file written; **#282 two-UUID-ref i2i proven e2e** — both freshly generated portrait UUIDs picker-selected into one scene with both canonical identities visually transferred). Prior: [v0.30.0](LIVE_VERIFICATION_v0.30.0.md) (**agentic-cohort image path + both fixes live-verified credit-free** — native 768×1376 stills, i2i-chain + canonical-ref identity hold; the character-create `DataIntegrityError` and the `prefer_classic` WARNING were observed live then fixed [recorder idempotent + INFO log]; MCP video-param feature deferred-with-reason on Veo credits, per the stills-only goal). Prior: [v0.29.0](LIVE_VERIFICATION_v0.29.0.md) (**persistent `gflow instructions` CRUD proven live e2e GREEN, credit-free** — 11-command sequence on a fresh project: add incl. `--ref <image-UUID>` attach, list/enable/disable, master toggle both ways, TOML `apply` destructive full-sync with `enabled=false` honored, `rm` with server card-id preserved across mutations; movie brief-sync code-path-verified via the same primitives, deferred-with-reason on credits; MCP `gflow_instructions_*` tools are thin adapters over the live-verified primitives). Prior: [v0.28.0](LIVE_VERIFICATION_v0.28.0.md) (**agent instructions `-i` now steer agentic generation — crayon e2e GREEN**: a style-neutral prompt + an enabled "crayon" card produced an unmistakable crayon drawing through the real transport; root causes were conversational phrasing + the `project_brief.enabled` master switch). Prior: [v0.27.1](LIVE_VERIFICATION_v0.27.1.md) (**v0.27.0 release follow-up fixes and documentation sync**). Prior: [v0.27.0](LIVE_VERIFICATION_v0.27.0.md) (**`[style]` block with named variants + prompt-aware resume — credit-free CLI verification**: real `movie run --dry-run` 3-way ledger proving resolved-style display, `skip (done)` on matching `style_hash`, and `re-run (style changed)` after a style edit; composition is local, wire path untouched, so no Veo credits spent — first credited styled run will confirm visually). Prior: [v0.26.0](LIVE_VERIFICATION_v0.26.0.md) (**image i2i by generated-image UUID proven live e2e GREEN** — the existing asset is *selected in place* by its media UUID, no duplicate upload, producing an i2i output that references it; plus generated-image `display_name` capture, credited @C1ph3r404). Prior: [v0.25.0](LIVE_VERIFICATION_v0.25.0.md) (**#237 remote-UUID i2v proven live e2e GREEN** — a real 8s 720×1280 interpolation from a generated image's UUID, after the picker-search attach was reworked to local upload; #240 home-`.env` matrix live; plus two silent-failure guards root-caused live: video-as-image download rejection and rejected-upload fail-loud). Prior: [v0.24.0](LIVE_VERIFICATION_v0.24.0.md) (--project parity across CLI + MCP — automated coverage; live gen auth-gated). Prior: [v0.23.0](LIVE_VERIFICATION_v0.23.0.md) (MCP generation wiring proven live end-to-end — tool→worker→real Flow REST→structured-error translation; final image-write blocked by an expired session, environmental. #222 macOS fix reporter-verified e2e on Apple Silicon). Prior: [v0.22.0](LIVE_VERIFICATION_v0.22.0.md) (Tools framework — automated/CI coverage complete; credit/key-gated live feature run is a pending owner gate, see the doc) · [v0.21.0](LIVE_VERIFICATION_v0.21.0.md) (MCP server over stdio + HTTP/SSE — credit-free protocol handshake; 4 tools / 2 prompts / 3 resources confirmed on stdout) · [v0.20.1](LIVE_VERIFICATION_v0.20.1.md) · [v0.20.0](LIVE_VERIFICATION_v0.20.0.md) · [v0.19.0](LIVE_VERIFICATION_v0.19.0.md) · [v0.18.0](LIVE_VERIFICATION_v0.18.0.md) · [v0.17.0](LIVE_VERIFICATION_v0.17.0.md) · [v0.16.0](LIVE_VERIFICATION_v0.16.0.md) · [v0.13.0](LIVE_VERIFICATION_v0.13.0.md) · [v0.12.0](LIVE_VERIFICATION_v0.12.0.md) · [v0.11.0](LIVE_VERIFICATION_v0.11.0.md) · [v0.10.0](LIVE_VERIFICATION_v0.10.0.md) · [v0.9.1](LIVE_VERIFICATION_v0.9.1.md) · [v0.9.0](LIVE_VERIFICATION_v0.9.0.md) · [v0.8.1](LIVE_VERIFICATION_v0.8.1.md) · [v0.7.0](LIVE_VERIFICATION_v0.7.0.md)
138
+ **What was actually live-verified for the latest release?** → latest: [LIVE_VERIFICATION_v0.48.0](LIVE_VERIFICATION_v0.48.0.md) (**#411 predictable `-o`/`--output` paths, offline-verified 2026-08-02, ZERO credits** — exact single-target local writes + `_1`/`_2` multi-count **image** suffixes proven by the CLI suite; the pre-tag council audit [RED, then resolved] re-scoped the release to the truthful surface: a dead MCP `output` param was deleted [worker queue never read it — #414], cloud `-o` targets and video multi-count suffixes are follow-ups [#415], and two tautological video-path tests are recorded as weak evidence rather than claimed as proof; storage-layer S3 writes verified against Docker MinIO at the layer level only; 2888-test release tree green; the live-Flow run aborted pre-generation on an expired denon82 session [`AuthExpiredError` 401, correct RFC-7807 contract + remediation hint, $0] — recorded, not omitted; live re-run queued for the next authenticated session). Prior: [v0.47.0](LIVE_VERIFICATION_v0.47.0.md) (**MCP SDK 2.0.0 migration + dual-era protocol + #402 entity provenance recording live-verified 2026-08-01, ZERO credits** — stdio JSON-RPC initialization handshake verified over subprocess transport, `resolve-drift` CI job added to prevent dependency drift, and 121 unit tests in `tests/data` passed). Prior: [v0.46.1](LIVE_VERIFICATION_v0.46.1.md) (**#404 classic count-setter fix live-verified 2026-07-31 on the reporter's exact environment, ZERO credits** — credit-free DOM recon proved Flow renamed the count-tab labels to uniform `xN` [`x1` replaces `1x`, image AND video rows], that `nth(0)` of the old filtered set landed on the selected `x2` and actively moved the count AWAY from the target, and that a digit-keyed click on `x1` converges instantly and persists without a Save commit; the new classic e2e then passed live [count=1 against a fresh project displaying 2 → exactly 1 image; count=2 early-exit → exactly 2], and the #313 agentic count-enforcement e2e passed 4/4 [counts 1–4 vs deliberately mismatched sticky defaults, magic-byte-verified downloads] after its stale setup was repaired [Flow now loads the editor in classic mode — the setup needed an Agent-pill toggle before the `tune` icon; test-only fix, no product code implicated]; the video output-count cascade carries a recorded waiver [full drive costs Veo credits; its exact selector shape was exercised live in the spike's cleanup step]). Prior: [v0.46.0](LIVE_VERIFICATION_v0.46.0.md) (**#387 provider-agnostic prompt-tools transport live-verified 2026-07-28, ZERO credits** — a four-probe capability spike passed 4/4 against BOTH a non-Google gateway and Google's OpenAI-compat endpoint, including a *semantic* multimodal check [a generated solid-red JPEG round-tripped and the model answered 'Red'], which is what proved the native Gemini `inlineData` path could be deleted outright rather than kept as a fallback; the real CLI then returned `was_expanded: true` on gateway/gateway-no-model/Google-default, emitted the loud one-time notice + no-op for the removed `GFLOW_CLI_GEMINI_API_KEY`, and made NO network call when unconfigured. Live verification caught two defects a fully green 2849-test offline suite missed: Google's compat endpoint has no server-side default model [`400 "model is not specified"`, silently no-oping the DEFAULT configuration], and the first redirect guard did not actually work because `build_opener()` installs its default handlers regardless of arguments, so `Authorization` would still have been replayed cross-host. `/code-review high` is recorded as NOT run — it is user-triggered only). Prior: [v0.45.0](LIVE_VERIFICATION_v0.45.0.md) (**#393 UUID `--ref` binding + #395 character-entity binding live-verified 2026-07-27/28** — a controlled A/B on identical input flipped `--ref` from exit 9 to exit 0 via the catalog-backed upload fallback, with the anti-silence guard [an unbindable ref aborts non-zero and writes no image] pinned by a live e2e; picker DOM + HAR showed Flow indexes a short auto-caption, NOT the prompt, so a prompt-derived search hint was dropped rather than shipped on assumption; a CDP spike against Flow's own character flow then captured the `entityContext` contract that gflow's generations were missing, root-causing #395 to two gflow defects [overlay dismissal Escaping Flow's own composer, and a character-route bounce that sent the prompt to the project composer] — both fixed, both character e2e tests now pass live, including `--format-prompt` [#383], with a read-back confirming the character carries its name and `thumbnail_media_id`). Prior: [v0.44.0](LIVE_VERIFICATION_v0.44.0.md) (**#381 dual-side project management & Playwright Chromium transport live-verified 2026-07-26** — real-editor project creation + rename tRPC server/DOM sync, prompt slugging, `gflow project` subcommand family, HTTP 429 adaptive backoff, and full E2E test suite). Prior: [v0.43.0](LIVE_VERIFICATION_v0.43.0.md) (**private incident diagnostics live-verified 2026-07-23, 1 Veo credit**). Prior: [v0.42.0](LIVE_VERIFICATION_v0.42.0.md) (**#361 production-readiness live-gaps confirmed live 2026-07-21, 1 Veo credit** — a real `veo-lite` t2v through the worker path persisted a real `remote_started` checkpoint [observer→checkpoint→DB chain confirmed], crash-recovery classified the task `indeterminate` without resubmitting, and mid-launch cancellation released the `ProfileLease` credit-free; full evidence in [v0.40.0-production-readiness § "2026-07-21 live follow-up"](LIVE_VERIFICATION_v0.40.0-production-readiness.md#2026-07-21-live-follow-up-0420-cycle); #359 content-safety `400`→`ContentPolicyError` classification is unit-covered, not live-triggered [would require a deliberate policy violation]; #360/#362 are docs-only, verified by the documentation gates). Prior: [v0.41.0](LIVE_VERIFICATION_v0.41.0.md) (**#357 production-readiness hardening — stale-session fail-fast, free image gen, paid veo-lite T2V all proven live**). Prior: [v0.40.0](LIVE_VERIFICATION_v0.40.0.md) (**#344 `@`-mention asset-tagging resolution proven live e2e, ~2 Imagen credits** — `gflow character create` staged a real taggable character [bound reference images, `has_reference_images` guard], the e2e test's documented propagation wait cleared Flow's `projectInitialData` lag, and `gflow image t2i "@Zoro …"` passed with returncode 0, a real generated image, and the correctly de-tagged prompt in the catalog — no code changes needed, `resolve_and_apply` as merged in #344 already works end-to-end; pre-existing unrelated issue #174 [Flow media-library A/B flake] can still intermittently block generation regardless of this feature — recorded, not omitted). Prior: [v0.39.0](LIVE_VERIFICATION_v0.39.0.md) (**#341 failed-generation persistence proven live** — a real `image t2i` on denon82 failed at the wire [`batchGenerateImages` HTTP 400 → `WireFormatError`] and the record-on-catch funnel wrote the **first-ever `failed` row** into the production catalog [`error_type=wire-format`, redacted `error_detail`, browsable via `gflow data list errors`], **$0**; the remaining paid paths [video/chain/batch/movie/worker] are funnel-regression-tested, not force-failed live [would cost credits], and the status-aware `succeeded=false` video-poll fix is unit-locked — recorded, not omitted). Prior: [v0.38.1](LIVE_VERIFICATION_v0.38.1.md) (**#338 agentic-pin recovery proven live ON the pinned account** — run 1 caught the composer-render race the unit suite could not [`ensure_media_incomplete` +115 ms, toggle never reached]; the readiness-wait fix landed and run 2 recovered classic on denon82 after ~2h of pin [`ui_driver.bound mode=classic`, real 768×1376 JPEG, exact prompt adherence]; reload branch unit-locked, live trigger not observed this cycle — recorded, not omitted). Prior: [v0.38.0](LIVE_VERIFICATION_v0.38.0.md) (**#332 mode control + #314 i2i ref dedup proven live e2e** — `image t2i --ui-mode classic` recovered agentic→classic in a real run [`ui_mode.attempt_exit_agent` → full classic chain, 1376×768 JPEG]; two identical `image i2i` runs proved the dedup contract [run 1: picker miss → `image_uploaded`; run 2: `reference_deduped_by_filename`, ZERO uploads]; `video t2v` veo-fast [`MEDIA_GENERATION_STATUS_SUCCESSFUL`, 15.2 MB `ftyp` mp4]; autopilot #333 recorded deferred-with-reason [hermes-ops deployment staged separately]). Prior: [v0.37.0](LIVE_VERIFICATION_v0.37.0.md) (**viewport 1920×1080 + agentic count enforcement + FIPS-safe SAPISIDHASH proven live e2e** — `image t2i` [classic cohort, real 1376×768 JPEG] and `video t2v` veo-fast [`MEDIA_GENERATION_STATUS_SUCCESSFUL`, 11.5 MB `ftyp` mp4] both succeeded end-to-end at the new 1920×1080 viewport with every selector resolving [no drift]; SAPISIDHASH digest verified byte-identical [FIPS-safe `usedforsecurity=False`], auth unchanged). Prior: [v0.36.0](LIVE_VERIFICATION_v0.36.0.md) (**#316 diagnostic tooling live-verified against real Flow traffic** — `GFLOW_CLI_HAR_PATH` captured a real 54-entry HAR [real Flow domains, 34× 200s, and a genuine 401 the tool exists to diagnose]; `GFLOW_CLI_DEBUG_TRACEBACK`'s typed-error scoping confirmed live [console output identical with/without the flag on a `GFlowError`]; unhandled-path behavior covered by 6 new tests (30 total across both files) + SDD task review; #312 reference-entity-smuggling fix covered by its own dedicated e2e test). Prior: [v0.35.0](LIVE_VERIFICATION_v0.35.0.md) (**#305-follow-up multimodal reverse-engineering & storyboard tool proven live e2e** — `gflow tools run storyboard` successfully deconstructed a cyberpunk scene into a cohesive 4-panel sequence; `reverse-engineer` tool extracts frames from video streams/URLs using `claude-video`'s `watch.py` and produces structured prompt components using Gemini multimodal models; dynamic token budgeting and strict Pyright types verified via test suite). Prior: [v0.34.0](LIVE_VERIFICATION_v0.34.0.md) (**#299 `--ui-mode` gate proven live, ZERO credits** — drove `get_ui_driver` directly over 4 real editor loads, never generated: bidirectional switch works [classic→agentic via `_force_agent_mode`, agentic→classic via `_exit_agent_mode`, each DOM-reverified], `agentic`-when-already-agentic is idempotent, and a timed-out toggle → **exit-28 fail-fast before submission**; deprecation behavior-change [`prefer_classic`→exit 28] confirmed). Prior: [v0.33.0](LIVE_VERIFICATION_v0.33.0.md) (**#287-follow-up picker fix proven live on the original repro** — the v0.32.1-failing `i2v <uuid> --project <crowded>` command now exits 0 with a real 3.0 MB `ftyp` mp4, `frame_ref_attached` + `video_saved`, zero uploads; **#241 jitter live-verified on both paths** — flag `--jitter 4-6` → `batch_jitter_sleep seconds=4.98`, and the new 0.5–1.5 s default → `seconds=1.47`, each firing exactly once between two t2i submissions; environment note: the denon82 cohort is now natively agentic and round-2 generations hit the pre-existing #281 `MediaAttributionError`, not a regression). Prior: [v0.32.1](LIVE_VERIFICATION_v0.32.1.md) (**#293 teardown fix live-verified credit-free** — error-path aborts leave ZERO chrome.exe holding the profile [3× leak reproduced pre-fix same day]; force-close fallback + ProfileLockedError translation unit-pinned; #283 wave logic fixes mock-verified to exact call counts). Prior: [v0.32.0](LIVE_VERIFICATION_v0.32.0.md) (**#287 UUID i2v frames proven live e2e** — an in-project asset selected by media UUID in the frame-slot dialog [frame_ref_attached, startImage bound on the wire, ZERO upload events] produced a real 720×1280 interpolation, resolving the #237 negative prior; foreign UUID → exit 9 pre-generation with screenshot; **#288 duration fail-fast proven live** — exit 23 pre-submit saved a 10-credit generation, and the debug screenshot confirmed the duration control is ABSENT from the cohort's settings popover [locale hypothesis refuted]; upload-400 exit-27 repro deferred-with-reason — the original rejected JPEG no longer exists). Prior: [v0.31.0](LIVE_VERIFICATION_v0.31.0.md) (**#281 wrong-media defenses live-verified in BOTH directions, credit-free** — correct attribution downloads with real wire metadata [seed, 768×1376]; the incident-class lazy-render ambiguity reproduced live and hard-stopped with `MediaAttributionError` exit 26 naming every candidate UUID, no file written; **#282 two-UUID-ref i2i proven e2e** — both freshly generated portrait UUIDs picker-selected into one scene with both canonical identities visually transferred). Prior: [v0.30.0](LIVE_VERIFICATION_v0.30.0.md) (**agentic-cohort image path + both fixes live-verified credit-free** — native 768×1376 stills, i2i-chain + canonical-ref identity hold; the character-create `DataIntegrityError` and the `prefer_classic` WARNING were observed live then fixed [recorder idempotent + INFO log]; MCP video-param feature deferred-with-reason on Veo credits, per the stills-only goal). Prior: [v0.29.0](LIVE_VERIFICATION_v0.29.0.md) (**persistent `gflow instructions` CRUD proven live e2e GREEN, credit-free** — 11-command sequence on a fresh project: add incl. `--ref <image-UUID>` attach, list/enable/disable, master toggle both ways, TOML `apply` destructive full-sync with `enabled=false` honored, `rm` with server card-id preserved across mutations; movie brief-sync code-path-verified via the same primitives, deferred-with-reason on credits; MCP `gflow_instructions_*` tools are thin adapters over the live-verified primitives). Prior: [v0.28.0](LIVE_VERIFICATION_v0.28.0.md) (**agent instructions `-i` now steer agentic generation — crayon e2e GREEN**: a style-neutral prompt + an enabled "crayon" card produced an unmistakable crayon drawing through the real transport; root causes were conversational phrasing + the `project_brief.enabled` master switch). Prior: [v0.27.1](LIVE_VERIFICATION_v0.27.1.md) (**v0.27.0 release follow-up fixes and documentation sync**). Prior: [v0.27.0](LIVE_VERIFICATION_v0.27.0.md) (**`[style]` block with named variants + prompt-aware resume — credit-free CLI verification**: real `movie run --dry-run` 3-way ledger proving resolved-style display, `skip (done)` on matching `style_hash`, and `re-run (style changed)` after a style edit; composition is local, wire path untouched, so no Veo credits spent — first credited styled run will confirm visually). Prior: [v0.26.0](LIVE_VERIFICATION_v0.26.0.md) (**image i2i by generated-image UUID proven live e2e GREEN** — the existing asset is *selected in place* by its media UUID, no duplicate upload, producing an i2i output that references it; plus generated-image `display_name` capture, credited @C1ph3r404). Prior: [v0.25.0](LIVE_VERIFICATION_v0.25.0.md) (**#237 remote-UUID i2v proven live e2e GREEN** — a real 8s 720×1280 interpolation from a generated image's UUID, after the picker-search attach was reworked to local upload; #240 home-`.env` matrix live; plus two silent-failure guards root-caused live: video-as-image download rejection and rejected-upload fail-loud). Prior: [v0.24.0](LIVE_VERIFICATION_v0.24.0.md) (--project parity across CLI + MCP — automated coverage; live gen auth-gated). Prior: [v0.23.0](LIVE_VERIFICATION_v0.23.0.md) (MCP generation wiring proven live end-to-end — tool→worker→real Flow REST→structured-error translation; final image-write blocked by an expired session, environmental. #222 macOS fix reporter-verified e2e on Apple Silicon). Prior: [v0.22.0](LIVE_VERIFICATION_v0.22.0.md) (Tools framework — automated/CI coverage complete; credit/key-gated live feature run is a pending owner gate, see the doc) · [v0.21.0](LIVE_VERIFICATION_v0.21.0.md) (MCP server over stdio + HTTP/SSE — credit-free protocol handshake; 4 tools / 2 prompts / 3 resources confirmed on stdout) · [v0.20.1](LIVE_VERIFICATION_v0.20.1.md) · [v0.20.0](LIVE_VERIFICATION_v0.20.0.md) · [v0.19.0](LIVE_VERIFICATION_v0.19.0.md) · [v0.18.0](LIVE_VERIFICATION_v0.18.0.md) · [v0.17.0](LIVE_VERIFICATION_v0.17.0.md) · [v0.16.0](LIVE_VERIFICATION_v0.16.0.md) · [v0.13.0](LIVE_VERIFICATION_v0.13.0.md) · [v0.12.0](LIVE_VERIFICATION_v0.12.0.md) · [v0.11.0](LIVE_VERIFICATION_v0.11.0.md) · [v0.10.0](LIVE_VERIFICATION_v0.10.0.md) · [v0.9.1](LIVE_VERIFICATION_v0.9.1.md) · [v0.9.0](LIVE_VERIFICATION_v0.9.0.md) · [v0.8.1](LIVE_VERIFICATION_v0.8.1.md) · [v0.7.0](LIVE_VERIFICATION_v0.7.0.md)
139
139
  **"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)).
140
140
  **"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)
141
141
  **"What was live-verified for the video-download feature (#29)?"** → [LIVE_VERIFICATION_video_download](LIVE_VERIFICATION_video_download.md)
@@ -0,0 +1,78 @@
1
+ # Live Verification — v0.46.1
2
+
3
+ **Date:** 2026-07-31
4
+ **Feature under test:** classic count-setter survives Flow's `1x`→`x1` label rename ([#404](https://github.com/ffroliva/gflow-cli/issues/404), PR [#405](https://github.com/ffroliva/gflow-cli/pull/405))
5
+ **Verifier:** repo owner's Windows 11 workstation, profile `ffroliva` — the exact environment of the original incident bundles (`20260729T151458Z-f9c00656…`, `20260729T151827Z-4f4a6093…`)
6
+ **Credit cost:** zero — image generation costs no Flow credits; the DOM recon was navigation-only.
7
+
8
+ ## Why this release needs live verification
9
+
10
+ The defect *was* Flow-side UI drift: only a real composer can prove the renamed `x1`
11
+ tab exists, that a digit-keyed click converges, and that the selection persists.
12
+ The pre-fix unit suite was fully green while every real `-n 1` run died — the fakes
13
+ ignored locator filters, so no offline test could have caught this (they now honor
14
+ them, and the pre-fix failure is reproduced mechanically in
15
+ `tests/api/transports/test_ui_automation.py::TestSetCountRetry`).
16
+
17
+ ## 1. Root-cause recon (credit-free, navigation only)
18
+
19
+ `scripts/dev/spike_issue404_count_tabs_recon.py` against project `gflow-cli t2i`:
20
+
21
+ | Probe | Result |
22
+ |---|---|
23
+ | Image count row labels | `['x1','x2','x3','x4']` — `1x` gone (video row identical) |
24
+ | Old filtered set (`^(1x\|x[2-4])$`) | size **3** — count-1 tab dropped |
25
+ | Replicated failing click (`nth(0)`) | landed on **`x2`**, moved the count 1→2 (away from target) |
26
+ | Selected `x1` under old read-back | `None` (regex miss) |
27
+ | Digit-keyed click on `x1` | `aria-selected="true"` immediately |
28
+ | Persistence | selection survives Escape-close + reopen — **no Save commit** |
29
+
30
+ Artifacts on disk: `scripts/dev/_spike_out/spike_issue404_count_tabs_*.json` +
31
+ step screenshots (`404_1`–`404_4_*.png`) + `_diagnostics/count_panel_dom_prompt_404.json`.
32
+
33
+ ## 2. Classic surface — the reported invocation (2 passed, 89 s)
34
+
35
+ `tests/e2e/test_classic_count_setter_e2e.py` (`GFLOW_CLI_UI_MODE=classic`, 9:16,
36
+ NARWHAL — mirroring the reporter's run):
37
+
38
+ - **count=1 (the regression):** fresh project displays 2 → the renamed `x1` tab was
39
+ located, clicked, converged; exactly **1** generation result returned.
40
+ - **count=2 (early-exit):** already-matching display short-circuits with no click;
41
+ exactly **2** results.
42
+ - structlog invariant: final `ui_automation.count_setter_completed` has
43
+ `success=True` in both cases; no `error_unhandled`.
44
+
45
+ ## 3. Agentic surface (4/4 passed, ~4 min)
46
+
47
+ `tests/e2e/test_agentic_count_enforcement_e2e.py`, counts 1–4, each against a
48
+ **deliberately mismatched** sticky panel default:
49
+
50
+ - All four counts returned exactly the requested number of images; every image
51
+ downloaded with a recognized magic-byte format (PNG/JPEG/WebP) and non-zero size.
52
+ - `ui_driver.bound mode=agentic`; no `enforce_count_failed` events.
53
+ - First attempt failed in the *test's own setup* (Flow now loads the editor in
54
+ classic mode; the raw-Playwright setup assumed the Agent composer) — repaired in
55
+ `beeb833` by toggling via the composer pill before waiting for the `tune` icon.
56
+ No product code was implicated in that failure.
57
+
58
+ ## 4. Not verified live this cycle (recorded, not omitted)
59
+
60
+ - **Video output-count cascade** (`_set_output_count` widened to probe `x1` then
61
+ legacy `1x`): a full end-to-end drive would spend Veo credits. DOM-level evidence
62
+ from §1 covers the selector shape (the video row renders `x1..x4`; a
63
+ `[role='tab']:text-is('x2')` click — the cascade's exact selector form — executed
64
+ live during the spike's cleanup). Miss remains non-fatal by design
65
+ (`Flow default (x2) applies`).
66
+ - Image **dimensions** were not re-measured this cycle (format sniff + non-empty
67
+ size only); the original incident's passing run already pinned 768×1376 for this
68
+ aspect/model pair.
69
+
70
+ ## 5. Ledger summary
71
+
72
+ | Layer | Evidence |
73
+ |---|---|
74
+ | File count | exact requested count, 6 live generations across counts 1–4 (§2, §3) |
75
+ | Magic bytes | PNG/JPEG/WebP sniff on every downloaded image (§3) |
76
+ | Dimensions | not re-measured (recorded above); format+size verified |
77
+ | structlog invariants | `count_setter_completed success=True`, `ui_driver.bound`, zero `error_unhandled` / `enforce_count_failed` |
78
+ | User-confirmable artifact | spike JSON + 4 step screenshots under `scripts/dev/_spike_out/` |
@@ -0,0 +1,45 @@
1
+ # Live Verification — v0.47.0
2
+
3
+ **Date:** 2026-08-01
4
+ **Features under test:**
5
+ 1. MCP SDK 2.0.0 migration & dual-era protocol support ([#407](https://github.com/ffroliva/gflow-cli/pull/407))
6
+ 2. Entity provenance recording on generation operations ([#402](https://github.com/ffroliva/gflow-cli/issues/402), PR [#408](https://github.com/ffroliva/gflow-cli/pull/408))
7
+ 3. Dependency drift CI gate (`resolve-drift`)
8
+
9
+ **Verifier:** repo owner's Windows 11 workstation, profiles `ffroliva` and `pr389fresh2`
10
+ **Credit cost:** zero — live stdio MCP transport verified credit-free via JSON-RPC protocol initialization; entity provenance logic unit-verified across 121 data tests with 3 opt-in E2E tests added.
11
+
12
+ ## 1. MCP 2.0.0 Migration & Dual-Era Protocol Verification (Credit-Free)
13
+
14
+ `gflow mcp run` driven over stdio subprocess transport with standard JSON-RPC 2.0 initialization protocol payload:
15
+
16
+ | Probe | Result |
17
+ |---|---|
18
+ | Protocol negotiation | Negotiated `2024-11-05` protocol version with `gflow-cli v0.47.0` |
19
+ | Capabilities response | `prompts`, `resources`, `tools` capabilities returned successfully |
20
+ | Stdio stdout isolation | `_redirect_stdout_to_stderr()` preserved JSON-RPC output cleanly |
21
+ | Cache hints | `ttl_ms=3600000` (1h) on list routes, `ttl_ms=300000` (5m) on `resources/read`, all `scope=private` |
22
+
23
+ ## 2. Entity Provenance Recording (#402 / #408)
24
+
25
+ - Data layer persistence updated across `record_generated_images`, `record_started_video`, `_insert_fallback_video_operation`, and `record_failed_operation` in `src/gflow_cli/data/recorder.py`.
26
+ - Tool provenance and entity provenance composed in a single `set_operation_metadata` payload to prevent column overwriting.
27
+ - `tests/data/test_recorder.py` and `tests/data/test_failure_recording.py` passed **121 unit tests**.
28
+ - Opt-in live E2E gate created in `tests/e2e/test_entity_provenance_e2e.py` covering:
29
+ - `test_t2i_entity_attach_records_provenance`
30
+ - `test_i2i_entity_attach_records_provenance`
31
+ - `test_rejected_entity_attach_still_records_provenance`
32
+
33
+ ## 3. Dependency Drift CI Job (`resolve-drift`)
34
+
35
+ - Unpinned requirement installation with `--upgrade` validated locally in clean environment.
36
+ - Prevents breaking upstream package changes (e.g. `mcp 2.0.0` deleting `mcp.server.fastmcp`) from breaking fresh installations.
37
+
38
+ ## 4. Ledger summary
39
+
40
+ | Layer | Evidence |
41
+ |---|---|
42
+ | File count | 121 unit tests passing in `tests/data`, 114 tests passing in `tests/mcp`/`tests/ui` |
43
+ | Protocol negotiation | `initialize` response over stdio returning `gflow-cli v0.47.0` |
44
+ | Provenance schema | `entity_ids` and `entity_names` persisted in `operations.metadata_json` |
45
+ | CI Quality Gates | 100% clean across `ruff`, `pyright`, `check_doc_links`, `check_website_docs_pii`, `check_repo_hygiene` |
@@ -0,0 +1,38 @@
1
+ # Live Verification — v0.48.0
2
+
3
+ - **Scope**: #411 — explicit `-o` / `--output` flag on `gflow image t2i`, `gflow image i2i`, `gflow video t2v`, `gflow video i2v` (PR #413, merged 2026-08-02). Local destination paths only; the MCP `output` param was removed pre-release (see the audit note below).
4
+ - **Date**: 2026-08-02
5
+ - **Credits spent**: 0
6
+
7
+ ## Pre-tag gates
8
+
9
+ - `/gflow:check`: hygiene + doc-links + PII + mirror-drift ✅, ruff check/format ✅, pyright 0 errors ✅, full suite 2888 passed / 5 skipped ✅.
10
+ - `/gflow:doc-review`: mechanical pass ✅; 3-auditor council returned **RED** (auditors 1 & 3) — the release notes claimed more than the code shipped. Findings and their resolution are recorded below; the release was re-scoped to the truthful surface ("truth-only release") before tagging. Council reports at `tmp/council/` (local-only).
11
+ - SonarCloud: the develop branch analysis failed its quality gate on `new_duplicated_lines_density` (13.7% vs 3%) from #413's copy-pasted option stacks; deduplicated in the release branch (`_shared_gen_tail_options` in `cli_video.py`, `_generate_verify_download` in `cli_image.py`) — gate verified on the release PR.
12
+
13
+ ## Evidence ledger (what is actually proven, and by what)
14
+
15
+ | Claim | Evidence | Status |
16
+ |---|---|---|
17
+ | `-o` writes the single image to the exact local path | `tests/cli/test_predictable_output.py::test_t2i_explicit_output_single_file`, `::test_i2i_explicit_output_file` (CLI runner, mocked transport, real path assertions) | ✅ offline |
18
+ | Multi-count images get `_1`, `_2` stem suffixes | `::test_t2i_explicit_output_multi_count`; logic at `cli_image.py::_download_images` | ✅ offline |
19
+ | Video `-o` relocates the mp4 to the target path | `::test_video_t2v_explicit_output_file`, `::test_video_i2v_explicit_output_file` — **weak**: the mock writes directly to the target, so `_relocate_video_output`'s mkdir+move short-circuits (#415 tracks de-mocking) | ⚠️ partial |
20
+ | Nested parent auto-creation | Production code exists (`_relocate_video_output` mkdir; `storage.py::_write_local` mkdir), but the covering test's mock performs the mkdir itself (#415) | ⚠️ code-read, test tautological |
21
+ | Single-prompt-only guard on `t2i` | `cli_image.py` raises `UsageError` (reproduced by hand: exits with the documented message) | ✅ |
22
+ | Storage layer writes/reads `s3://` keys byte-identically | `tests/integration/test_storage_s3.py` (8 tests, Docker MinIO) — exercises `storage_path()`/`write_asset_async()` **directly; not the `-o` flag**, which is local-only in v0.48.0 (#415) | ✅ layer-level only |
23
+ | Release tree healthy | Full suite 2888 passed / 5 skipped; green full-suite CI on the merged tree | ✅ |
24
+
25
+ ## Live-Flow attempt (recorded, not omitted)
26
+
27
+ A live `image t2i --profile denon82 -o <nested path>` run was attempted 2026-08-02 15:24 UTC and aborted pre-generation with `AuthExpiredError` (HTTP 401 on `project.createProject`) — the profile's Flow session cookies had expired since the last live cycle (2026-07-31). The failure exercised the error contract correctly: typed `AuthExpiredError`, RFC-7807 problem payload, remediation hint naming `gflow auth login --profile <name>`, no file written, no credits spent. A live re-run is queued for the next authenticated session.
28
+
29
+ ## Pre-release audit outcome (why the shipped surface is smaller than PR #413's description)
30
+
31
+ The doc-review council found two claims in PR #413's description that the code did not back:
32
+
33
+ 1. **MCP parity** — the `output` param on `gflow_generate_image`/`gflow_generate_video` was written into the queue payload but never decoded by `worker/codec.py`; `worker/daemon.py` hardcodes the destination. A silent no-op param violates the project's own MCP rule, so it was **removed** in the release branch. Re-adding it with real worker support is #414.
34
+ 2. **Cloud storage** — `-o` is `click.Path(path_type=Path)`; it never routes through the UPath/fsspec layer, and under `GFLOW_CLI_STORAGE_URI` an out-of-tree path is flattened to its basename. Cloud targets are #415.
35
+
36
+ ## Post-tag evidence
37
+
38
+ _(filled after publish)_