gflow-cli 0.37.0__tar.gz → 0.38.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 (596) hide show
  1. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/AGENTS.md +2 -2
  2. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/CHANGELOG.md +15 -1
  3. {gflow_cli-0.37.0/website/docs → gflow_cli-0.38.0}/KNOWN_ISSUES.md +15 -0
  4. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/PKG-INFO +1 -1
  5. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/PLAN.md +12 -0
  6. gflow_cli-0.38.0/deploy/PR-TRIAGE-AUTOPILOT-OPS.md +94 -0
  7. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/GITHUB.md +11 -8
  8. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/INDEX.md +3 -1
  9. gflow_cli-0.38.0/docs/LIVE_VERIFICATION_v0.38.0.md +52 -0
  10. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/PROJECT_STATUS.md +15 -1
  11. {gflow_cli-0.37.0/website → gflow_cli-0.38.0}/docs/USAGE.md +2 -2
  12. gflow_cli-0.38.0/docs/superpowers/plans/2026-07-08-pr-triage-autopilot/PLAN.md +164 -0
  13. gflow_cli-0.38.0/docs/superpowers/specs/2026-07-04-pr-triage-autopilot-design.md +230 -0
  14. gflow_cli-0.38.0/eval/pr_triage_eval.py +42 -0
  15. gflow_cli-0.38.0/eval/pr_triage_fixtures.json +194 -0
  16. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/pyproject.toml +2 -1
  17. gflow_cli-0.38.0/scripts/autopilot/Dockerfile.triage +39 -0
  18. gflow_cli-0.38.0/scripts/autopilot/entrypoint.sh +9 -0
  19. gflow_cli-0.38.0/scripts/autopilot/pr_triage_autopilot.py +572 -0
  20. gflow_cli-0.38.0/scripts/autopilot/pr_triage_gate.py +192 -0
  21. gflow_cli-0.38.0/scripts/autopilot/run_sandboxed_review.sh +100 -0
  22. gflow_cli-0.38.0/scripts/dev/spike_issue314_picker_filename_search.py +148 -0
  23. gflow_cli-0.38.0/scripts/dev/spike_mode_roundtrip.py +155 -0
  24. gflow_cli-0.38.0/scripts/dev/spike_mode_switch_agentic_to_classic.py +170 -0
  25. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/skills/pr-council-review/SKILL.md +39 -0
  26. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/__init__.py +1 -1
  27. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/api/client.py +57 -40
  28. gflow_cli-0.38.0/src/gflow_cli/api/transports/mode_control.py +123 -0
  29. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/api/transports/ui_automation.py +6 -1
  30. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/api/transports/ui_automation_video.py +135 -56
  31. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/mcp/tools.py +19 -12
  32. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/movie_manifest.py +44 -25
  33. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/tools/expander.py +28 -15
  34. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/ui/app.py +38 -28
  35. gflow_cli-0.38.0/tests/api/transports/test_mode_control.py +123 -0
  36. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/transports/test_ui_automation.py +21 -7
  37. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/transports/test_ui_automation_video.py +161 -0
  38. gflow_cli-0.38.0/tests/autopilot/test_pr_triage_autopilot.py +399 -0
  39. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/uv.lock +4 -4
  40. gflow_cli-0.37.0/docs/superpowers/plans/2026-07-16-agentic-count-enforcement/PLAN.md +0 -482
  41. gflow_cli-0.37.0/docs/superpowers/plans/2026-07-16-agentic-count-enforcement-rework/PLAN.md +0 -690
  42. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/.claude/README.md +0 -0
  43. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/.claude/commands/gflow/active.md +0 -0
  44. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/.claude/commands/gflow/branch-review.md +0 -0
  45. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/.claude/commands/gflow/changelog.md +0 -0
  46. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/.claude/commands/gflow/check.md +0 -0
  47. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/.claude/commands/gflow/doc-review.md +0 -0
  48. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/.claude/commands/gflow/issue-assessment.md +0 -0
  49. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/.claude/commands/gflow/issue-resolve.md +0 -0
  50. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/.claude/commands/gflow/known-issues.md +0 -0
  51. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/.claude/commands/gflow/llm-council.md +0 -0
  52. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/.claude/commands/gflow/next.md +0 -0
  53. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/.claude/commands/gflow/plan.md +0 -0
  54. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/.claude/commands/gflow/pr-council-review.md +0 -0
  55. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/.claude/commands/gflow/predict.md +0 -0
  56. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/.claude/commands/gflow/release.md +0 -0
  57. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/.claude/commands/gflow/scenario.md +0 -0
  58. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/.claude/commands/gflow/sonar.md +0 -0
  59. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/.claude/commands/gflow/status.md +0 -0
  60. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/.env.template +0 -0
  61. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/.gitattributes +0 -0
  62. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/.github/CODEOWNERS +0 -0
  63. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  64. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/.github/copilot-instructions.md +0 -0
  65. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/.github/dependabot.yml +0 -0
  66. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/.github/workflows/ci.yml +0 -0
  67. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/.github/workflows/external-pr-triage.yml +0 -0
  68. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/.github/workflows/governance-advisory.yml +0 -0
  69. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/.github/workflows/governance-benchmark.yml +0 -0
  70. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/.github/workflows/main-base-guard.yml +0 -0
  71. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/.github/workflows/pages.yml +0 -0
  72. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/.github/workflows/release.yml +0 -0
  73. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/.gitignore +0 -0
  74. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/.gitleaks.toml +0 -0
  75. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/.pre-commit-config.yaml +0 -0
  76. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/.secrets.baseline +0 -0
  77. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/CLAUDE.md +0 -0
  78. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/CONFIGURATION.md +0 -0
  79. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/CONTRIBUTING.md +0 -0
  80. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/DISCLAIMER.md +0 -0
  81. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/GEMINI.md +0 -0
  82. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/LICENSE +0 -0
  83. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/README.md +0 -0
  84. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/RELEASE.md +0 -0
  85. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/ROADMAP.md +0 -0
  86. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/conftest.py +0 -0
  87. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docker-compose.yml +0 -0
  88. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/AGENT_GUIDE.md +0 -0
  89. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/AGENT_UI_E2E.md +0 -0
  90. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/AGENT_UI_RECON.md +0 -0
  91. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/ARCHITECTURE.md +0 -0
  92. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/AUTHENTICATION.md +0 -0
  93. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/CHARACTER.md +0 -0
  94. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/CHARACTER_RECON.md +0 -0
  95. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/CONFIGURATION.md +0 -0
  96. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/DATA_LAYER.md +0 -0
  97. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/DEBUGGING.md +0 -0
  98. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/DEMOS.md +0 -0
  99. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/DEVELOPMENT.md +0 -0
  100. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/E2E_TESTING.md +0 -0
  101. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/EXTERNAL_STORAGE.md +0 -0
  102. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
  103. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
  104. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/INSTRUCTIONS.md +0 -0
  105. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
  106. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
  107. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
  108. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
  109. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
  110. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
  111. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
  112. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
  113. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
  114. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
  115. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
  116. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
  117. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_v0.21.0.md +0 -0
  118. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_v0.22.0.md +0 -0
  119. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_v0.23.0.md +0 -0
  120. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_v0.24.0.md +0 -0
  121. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_v0.25.0.md +0 -0
  122. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_v0.26.0.md +0 -0
  123. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_v0.27.0.md +0 -0
  124. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_v0.27.1.md +0 -0
  125. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_v0.28.0.md +0 -0
  126. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_v0.29.0.md +0 -0
  127. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_v0.30.0.md +0 -0
  128. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_v0.31.0.md +0 -0
  129. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_v0.32.0.md +0 -0
  130. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_v0.32.1.md +0 -0
  131. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_v0.33.0.md +0 -0
  132. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_v0.34.0.md +0 -0
  133. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_v0.35.0.md +0 -0
  134. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_v0.36.0.md +0 -0
  135. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_v0.37.0.md +0 -0
  136. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
  137. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
  138. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
  139. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
  140. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
  141. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/MCP.md +0 -0
  142. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/MOVIE.md +0 -0
  143. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/PROMPT_EXPANSION.md +0 -0
  144. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/SECURITY.md +0 -0
  145. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/TOOLS.md +0 -0
  146. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/USER_GUIDE.md +0 -0
  147. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/assets/demo-split-pf.gif +0 -0
  148. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/assets/example-run.gif +0 -0
  149. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/assets/examples.webp +0 -0
  150. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/medium_tutorial.md +0 -0
  151. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/schemas/movie-handoff.schema.json +0 -0
  152. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/sonar-cleanup-tracker.md +0 -0
  153. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
  154. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +0 -0
  155. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +0 -0
  156. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +0 -0
  157. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +0 -0
  158. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +0 -0
  159. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +0 -0
  160. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +0 -0
  161. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +0 -0
  162. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +0 -0
  163. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/superpowers/plans/2026-07-09-camoufox-adoption/PLAN.md +0 -0
  164. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/superpowers/plans/2026-07-14-storyboarding-and-visual-curation/PLAN.md +0 -0
  165. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/superpowers/research/2026-06-27-tool-abstraction-evaluation.md +0 -0
  166. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/superpowers/specs/2026-06-29-issue-assessment-workflow-design.md +0 -0
  167. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/superpowers/spikes/2026-07-09-camoufox-waf-403.md +0 -0
  168. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/superpowers/spikes/2026-07-12-ui-cohort-backend-config.md +0 -0
  169. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/docs/superpowers/spikes/2026-07-17-production-readiness-assessment.md +0 -0
  170. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/examples/README.md +0 -0
  171. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/examples/batch_from_config.py +0 -0
  172. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/examples/multi_prompt_t2i.py +0 -0
  173. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/examples/sample_config.json +0 -0
  174. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/examples/sample_prompts.txt +0 -0
  175. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/examples/single_image_t2i.py +0 -0
  176. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/examples/workflow_chain.py +0 -0
  177. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/index.html +0 -0
  178. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/llms.txt +0 -0
  179. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/samples/README.md +0 -0
  180. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/samples/captured/01_upload_image.json +0 -0
  181. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
  182. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
  183. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/samples/captured/04_archive_workflow.json +0 -0
  184. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/samples/captured/05_createProject.json +0 -0
  185. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/samples/captured/06_batchGenerateImages.json +0 -0
  186. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
  187. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
  188. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
  189. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
  190. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
  191. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/samples/captured/12_create_scene.json +0 -0
  192. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
  193. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/samples/captured/14_get_scene_workflows.json +0 -0
  194. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
  195. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/ci/check_doc_links.py +0 -0
  196. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/ci/check_materiality.py +0 -0
  197. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/ci/check_repo_hygiene.py +0 -0
  198. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/debug_editor.py +0 -0
  199. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/debug_gen_settings.py +0 -0
  200. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/debug_settings.py +0 -0
  201. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/_recording_client.py +0 -0
  202. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/_spike_common.py +0 -0
  203. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/active_plan.py +0 -0
  204. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/analyze_agent_ui_capture.py +0 -0
  205. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
  206. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
  207. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
  208. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
  209. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
  210. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/capture_locale_invariants.py +0 -0
  211. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
  212. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/character_create_spike.py +0 -0
  213. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/character_create_spike_v2.py +0 -0
  214. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/dump_character_selectors.js +0 -0
  215. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/make_project.py +0 -0
  216. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/materiality_backtest.py +0 -0
  217. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/monitor_pr_38.py +0 -0
  218. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/patch_character.py +0 -0
  219. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/skillopt/README.md +0 -0
  220. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/skillopt/harness.py +0 -0
  221. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/skillopt/tasks.json +0 -0
  222. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/sonar-local-scan.sh +0 -0
  223. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/sonar-pre-push-gate.sh +0 -0
  224. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/spike_char_editor_dom.py +0 -0
  225. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/spike_char_gen_capture.py +0 -0
  226. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
  227. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
  228. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
  229. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
  230. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
  231. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
  232. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/spike_issue313_agent_mode_controls.py +0 -0
  233. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
  234. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
  235. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
  236. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/spike_movie_picker_select.py +0 -0
  237. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/spike_movie_voice_list.py +0 -0
  238. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/spike_patch_entity.py +0 -0
  239. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/dev/spike_patchright.py +0 -0
  240. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/diag/README.md +0 -0
  241. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/diag/capture_flow_traffic.py +0 -0
  242. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/diag/memory_profile.py +0 -0
  243. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/diag/recaptcha_mint.py +0 -0
  244. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
  245. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/e2e/capture_agent_toggle.py +0 -0
  246. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/record_demo.ps1 +0 -0
  247. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/smoke_image.py +0 -0
  248. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/smoke_real_chrome_image.py +0 -0
  249. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/smoke_video_editor.py +0 -0
  250. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/smoke_worker_style.py +0 -0
  251. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/spike_waf_camoufox.py +0 -0
  252. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/scripts/verify_chrome_auth_viability.py +0 -0
  253. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/skills/README.md +0 -0
  254. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/skills/changelog/SKILL.md +0 -0
  255. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/skills/check/SKILL.md +0 -0
  256. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/skills/doc-review/SKILL.md +0 -0
  257. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/skills/gflow-cli/SKILL.md +0 -0
  258. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/skills/issue-assessment/SKILL.md +0 -0
  259. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/skills/issue-resolve/SKILL.md +0 -0
  260. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/skills/known-issues/SKILL.md +0 -0
  261. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/skills/llm-council/SKILL.md +0 -0
  262. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/skills/plan/SKILL.md +0 -0
  263. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/skills/predict/SKILL.md +0 -0
  264. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/skills/release/SKILL.md +0 -0
  265. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/skills/scenario/SKILL.md +0 -0
  266. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/skills/sonar/SKILL.md +0 -0
  267. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/skills/status/SKILL.md +0 -0
  268. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/sonar-project.properties +0 -0
  269. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/__main__.py +0 -0
  270. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/_cli_helpers.py +0 -0
  271. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/api/__init__.py +0 -0
  272. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/api/_engine.py +0 -0
  273. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/api/_retry.py +0 -0
  274. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
  275. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/api/character.py +0 -0
  276. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/api/dto.py +0 -0
  277. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/api/image.py +0 -0
  278. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/api/image_upscale.py +0 -0
  279. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/api/recaptcha.py +0 -0
  280. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/api/routes.py +0 -0
  281. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/api/scene.py +0 -0
  282. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/api/transports/__init__.py +0 -0
  283. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/api/transports/_common.py +0 -0
  284. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
  285. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/api/transports/base.py +0 -0
  286. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
  287. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/api/transports/drivers/agentic.py +0 -0
  288. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/api/transports/drivers/base.py +0 -0
  289. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/api/transports/drivers/classic.py +0 -0
  290. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/api/transports/drivers/factory.py +0 -0
  291. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
  292. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
  293. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
  294. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
  295. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/api/video.py +0 -0
  296. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/auth/__init__.py +0 -0
  297. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/auth/base.py +0 -0
  298. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/auth/cookies.py +0 -0
  299. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/auth/factory.py +0 -0
  300. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
  301. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/auth/real_chrome.py +0 -0
  302. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/auth/strategies.py +0 -0
  303. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/auth/verification.py +0 -0
  304. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/browser_manager.py +0 -0
  305. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/chain.py +0 -0
  306. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/chain_manifest.py +0 -0
  307. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/cli.py +0 -0
  308. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/cli_character.py +0 -0
  309. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/cli_data.py +0 -0
  310. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/cli_image.py +0 -0
  311. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/cli_instructions.py +0 -0
  312. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/cli_models.py +0 -0
  313. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/cli_movie.py +0 -0
  314. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/cli_run.py +0 -0
  315. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/cli_scene.py +0 -0
  316. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/cli_tools.py +0 -0
  317. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/cli_video.py +0 -0
  318. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/composition.py +0 -0
  319. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/config.py +0 -0
  320. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/data/__init__.py +0 -0
  321. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/data/chain_repo.py +0 -0
  322. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
  323. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
  324. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
  325. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
  326. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
  327. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
  328. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/data/migrations/0007_queue.sql +0 -0
  329. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/data/migrations/0008_add_operation_expanded_prompt.sql +0 -0
  330. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
  331. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/data/models.py +0 -0
  332. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/data/queries.py +0 -0
  333. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/data/recorder.py +0 -0
  334. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/data/redaction.py +0 -0
  335. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/data/repository.py +0 -0
  336. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/data/store.py +0 -0
  337. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/errors.py +0 -0
  338. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/exceptions.py +0 -0
  339. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/image_batch.py +0 -0
  340. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/json_output.py +0 -0
  341. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/manifest.py +0 -0
  342. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/mcp/__init__.py +0 -0
  343. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/mcp/prompts.py +0 -0
  344. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/mcp/resources.py +0 -0
  345. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/mcp/server.py +0 -0
  346. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/media.py +0 -0
  347. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/observability.py +0 -0
  348. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/paths.py +0 -0
  349. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/profile_store.py +0 -0
  350. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/services/__init__.py +0 -0
  351. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/services/character_create.py +0 -0
  352. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/storage.py +0 -0
  353. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/tools/__init__.py +0 -0
  354. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/tools/banned.py +0 -0
  355. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/tools/builtin/__init__.py +0 -0
  356. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/tools/builtin/creative-director.toml +0 -0
  357. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/tools/builtin/reverse-engineer.toml +0 -0
  358. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/tools/builtin/storyboard.toml +0 -0
  359. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/tools/invocation.py +0 -0
  360. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/tools/loader.py +0 -0
  361. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/tools/registry.py +0 -0
  362. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/tools/runtime.py +0 -0
  363. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/tools/spec.py +0 -0
  364. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/ui/server.py +0 -0
  365. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/worker/daemon.py +0 -0
  366. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/src/gflow_cli/worker/queue.py +0 -0
  367. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tasks/lessons.md +0 -0
  368. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/test_assets/sample_batch.json +0 -0
  369. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/test_assets/sample_batch.tsv +0 -0
  370. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/test_assets/sample_batch_invalid.tsv +0 -0
  371. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/__init__.py +0 -0
  372. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/__init__.py +0 -0
  373. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/fixtures/character_gen_response.json +0 -0
  374. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/fixtures/patch_entity_response.json +0 -0
  375. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/test_aisandbox_auth_error.py +0 -0
  376. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
  377. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/test_bearer_redaction.py +0 -0
  378. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/test_character.py +0 -0
  379. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/test_client.py +0 -0
  380. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/test_client_character.py +0 -0
  381. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/test_client_delete_characters.py +0 -0
  382. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/test_client_generate_character.py +0 -0
  383. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/test_client_image.py +0 -0
  384. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/test_client_launch_kwargs.py +0 -0
  385. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/test_client_patch_entity.py +0 -0
  386. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/test_client_scene.py +0 -0
  387. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/test_client_upscale.py +0 -0
  388. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/test_concurrency.py +0 -0
  389. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/test_dto.py +0 -0
  390. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/test_engine.py +0 -0
  391. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/test_image.py +0 -0
  392. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/test_image_dto.py +0 -0
  393. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/test_image_upscale.py +0 -0
  394. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/test_post_json_aisandbox_auth.py +0 -0
  395. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/test_recaptcha.py +0 -0
  396. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/test_retry.py +0 -0
  397. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/test_routes.py +0 -0
  398. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/test_routes_character.py +0 -0
  399. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/test_routes_scene.py +0 -0
  400. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/test_sapisidhash_helper.py +0 -0
  401. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/test_scene_models.py +0 -0
  402. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/test_video.py +0 -0
  403. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/test_video_request.py +0 -0
  404. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/transports/__init__.py +0 -0
  405. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/transports/conftest.py +0 -0
  406. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/transports/drivers/__init__.py +0 -0
  407. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/transports/drivers/test_agentic.py +0 -0
  408. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/transports/drivers/test_classic.py +0 -0
  409. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/transports/drivers/test_factory.py +0 -0
  410. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/transports/drivers/test_ui_mode.py +0 -0
  411. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/transports/test_base.py +0 -0
  412. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/transports/test_bearer.py +0 -0
  413. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/transports/test_common.py +0 -0
  414. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
  415. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/transports/test_factory.py +0 -0
  416. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/transports/test_fingerprint.py +0 -0
  417. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/transports/test_sapisidhash.py +0 -0
  418. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/transports/test_selector_symmetry.py +0 -0
  419. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/transports/test_transport_timeout.py +0 -0
  420. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/transports/test_ui_automation_batch.py +0 -0
  421. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
  422. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/api/transports/test_ui_character_editor.py +0 -0
  423. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/auth/strategies/test_factory.py +0 -0
  424. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/auth/strategies/test_strategies.py +0 -0
  425. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/auth/test_cookies.py +0 -0
  426. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/auth/test_verification.py +0 -0
  427. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/cli/__init__.py +0 -0
  428. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/cli/test_cli_auth_list.py +0 -0
  429. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/cli/test_cli_character.py +0 -0
  430. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/cli/test_cli_character_create.py +0 -0
  431. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/cli/test_cli_data.py +0 -0
  432. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/cli/test_cli_image.py +0 -0
  433. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
  434. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/cli/test_cli_image_selector_drift.py +0 -0
  435. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/cli/test_cli_image_upscale.py +0 -0
  436. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/cli/test_cli_instructions.py +0 -0
  437. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/cli/test_cli_models.py +0 -0
  438. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/cli/test_cli_movie.py +0 -0
  439. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/cli/test_cli_run.py +0 -0
  440. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/cli/test_cli_scene.py +0 -0
  441. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/cli/test_cli_tools.py +0 -0
  442. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/cli/test_cli_video.py +0 -0
  443. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/cli/test_cli_video_chain.py +0 -0
  444. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/cli/test_error_handling.py +0 -0
  445. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/cli/test_helpers.py +0 -0
  446. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/cli/test_movie_manifest.py +0 -0
  447. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/cli/test_movie_manifest_style_variants.py +0 -0
  448. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/cli/test_settings_validation.py +0 -0
  449. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
  450. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/composition/test_character.py +0 -0
  451. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/composition/test_compose_prompt.py +0 -0
  452. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/composition/test_handoff.py +0 -0
  453. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/composition/test_style_variants.py +0 -0
  454. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/composition/test_style_variants_e2e.py +0 -0
  455. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/conftest.py +0 -0
  456. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/data/__init__.py +0 -0
  457. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/data/test_chain_repo.py +0 -0
  458. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/data/test_find_incomplete_character.py +0 -0
  459. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/data/test_models.py +0 -0
  460. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/data/test_packaging.py +0 -0
  461. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/data/test_recorder.py +0 -0
  462. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/data/test_recorder_character.py +0 -0
  463. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/data/test_redaction.py +0 -0
  464. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/data/test_repository.py +0 -0
  465. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/data/test_scene_persistence.py +0 -0
  466. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/data/test_settings_and_errors.py +0 -0
  467. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/data/test_store_migrations.py +0 -0
  468. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/dev/test_recording_client.py +0 -0
  469. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/e2e/__init__.py +0 -0
  470. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/e2e/conftest.py +0 -0
  471. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/e2e/test_agentic_count_enforcement_e2e.py +0 -0
  472. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
  473. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
  474. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/e2e/test_chain_e2e.py +0 -0
  475. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/e2e/test_character_create_e2e.py +0 -0
  476. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/e2e/test_daemon_e2e.py +0 -0
  477. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/e2e/test_data_layer_e2e.py +0 -0
  478. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/e2e/test_entity_smuggling_e2e.py +0 -0
  479. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/e2e/test_i2v_flags_e2e.py +0 -0
  480. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/e2e/test_image_batch_e2e.py +0 -0
  481. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
  482. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/e2e/test_json_output_e2e.py +0 -0
  483. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/e2e/test_live_agentic_instructions.py +0 -0
  484. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
  485. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/e2e/test_scene_compose_live.py +0 -0
  486. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/e2e/test_tools_e2e.py +0 -0
  487. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/e2e/test_transports_e2e.py +0 -0
  488. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
  489. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
  490. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/features/__init__.py +0 -0
  491. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/features/auth.feature +0 -0
  492. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/features/auth_login.feature +0 -0
  493. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/features/character_create.feature +0 -0
  494. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/features/character_read.feature +0 -0
  495. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/features/conftest.py +0 -0
  496. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/features/image.feature +0 -0
  497. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/features/image_upscale.feature +0 -0
  498. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/features/instructions.feature +0 -0
  499. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/features/locale_picker_include.feature +0 -0
  500. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/features/test_auth_login_steps.py +0 -0
  501. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/features/test_auth_steps.py +0 -0
  502. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/features/test_character_create_steps.py +0 -0
  503. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/features/test_character_read_steps.py +0 -0
  504. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/features/test_image_steps.py +0 -0
  505. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/features/test_image_upscale_steps.py +0 -0
  506. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/features/test_instructions_steps.py +0 -0
  507. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/features/test_locale_picker_include_steps.py +0 -0
  508. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/features/test_step_collision_guard.py +0 -0
  509. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/features/test_video_agent_ui_steps.py +0 -0
  510. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/features/test_video_chain_steps.py +0 -0
  511. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/features/video_agent_ui.feature +0 -0
  512. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/features/video_chain.feature +0 -0
  513. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/fixtures/__init__.py +0 -0
  514. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/fixtures/seeded_catalog.py +0 -0
  515. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/image_batch/__init__.py +0 -0
  516. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/image_batch/test_image_manifest.py +0 -0
  517. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/image_batch/test_jitter_config.py +0 -0
  518. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/image_batch/test_observability_events.py +0 -0
  519. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/integration/__init__.py +0 -0
  520. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/integration/conftest.py +0 -0
  521. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/integration/constants.py +0 -0
  522. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/integration/test_storage_gcs.py +0 -0
  523. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/integration/test_storage_s3.py +0 -0
  524. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/mcp/__init__.py +0 -0
  525. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/mcp/conftest.py +0 -0
  526. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/mcp/test_cli_parity.py +0 -0
  527. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/mcp/test_server.py +0 -0
  528. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/mcp/test_stdio_transport.py +0 -0
  529. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/mcp/test_tools_helpers.py +0 -0
  530. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/mcp/test_tools_instructions.py +0 -0
  531. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/mcp/test_tools_wired.py +0 -0
  532. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
  533. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
  534. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/scripts/test_check_materiality.py +0 -0
  535. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/scripts/test_check_repo_hygiene.py +0 -0
  536. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/scripts/test_materiality_backtest.py +0 -0
  537. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/services/__init__.py +0 -0
  538. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/services/test_character_create_redaction.py +0 -0
  539. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/services/test_character_create_saga.py +0 -0
  540. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
  541. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/smoke/__init__.py +0 -0
  542. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/smoke/test_profile_account_smoke.py +0 -0
  543. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/smoke/test_real_flow.py +0 -0
  544. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/test_auth.py +0 -0
  545. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/test_browser_manager.py +0 -0
  546. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/test_chain.py +0 -0
  547. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/test_chain_manifest.py +0 -0
  548. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/test_cli_data.py +0 -0
  549. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/test_config.py +0 -0
  550. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/test_conftest_isolation.py +0 -0
  551. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/test_data_queries.py +0 -0
  552. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/test_documentation_gate.py +0 -0
  553. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/test_errors.py +0 -0
  554. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/test_errors_403.py +0 -0
  555. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/test_json_output.py +0 -0
  556. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/test_manifest.py +0 -0
  557. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/test_marker_registry.py +0 -0
  558. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/test_media.py +0 -0
  559. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/test_observability.py +0 -0
  560. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/test_paths.py +0 -0
  561. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/test_profile_store.py +0 -0
  562. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/test_smoke.py +0 -0
  563. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/tools/__init__.py +0 -0
  564. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/tools/test_banned.py +0 -0
  565. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/tools/test_expander.py +0 -0
  566. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/tools/test_invocation.py +0 -0
  567. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/tools/test_loader.py +0 -0
  568. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/tools/test_registry.py +0 -0
  569. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/tools/test_runtime.py +0 -0
  570. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/tools/test_spec.py +0 -0
  571. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/ui/test_app.py +0 -0
  572. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/tests/worker/test_daemon.py +0 -0
  573. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/website/docs/ARCHITECTURE.md +0 -0
  574. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/website/docs/AUTHENTICATION.md +0 -0
  575. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/website/docs/CHARACTER.md +0 -0
  576. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/website/docs/CONFIGURATION.md +0 -0
  577. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/website/docs/DATA_LAYER.md +0 -0
  578. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/website/docs/DEBUGGING.md +0 -0
  579. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/website/docs/DEVELOPMENT.md +0 -0
  580. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/website/docs/E2E_TESTING.md +0 -0
  581. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/website/docs/EXTERNAL_STORAGE.md +0 -0
  582. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/website/docs/INSTRUCTIONS.md +0 -0
  583. {gflow_cli-0.37.0 → gflow_cli-0.38.0/website/docs}/KNOWN_ISSUES.md +0 -0
  584. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/website/docs/MCP.md +0 -0
  585. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/website/docs/MOVIE.md +0 -0
  586. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/website/docs/PROMPT_EXPANSION.md +0 -0
  587. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/website/docs/SECURITY.md +0 -0
  588. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/website/docs/TOOLS.md +0 -0
  589. {gflow_cli-0.37.0 → gflow_cli-0.38.0/website}/docs/USAGE.md +0 -0
  590. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/website/docs/USER_GUIDE.md +0 -0
  591. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/website/docs/agents.md +0 -0
  592. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/website/docs/index.md +0 -0
  593. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/website/docs/installation.md +0 -0
  594. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/website/docs/quickstart.md +0 -0
  595. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/website/docs/stylesheets/extra.css +0 -0
  596. {gflow_cli-0.37.0 → gflow_cli-0.38.0}/website/mkdocs.yml +0 -0
@@ -9,7 +9,7 @@ Supported tools that auto-discover this file: Cursor, Codex, Aider, Jules, Devin
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`, `manifest.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/batch/chain), `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 — `batch` is a Phase B stub), `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).
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)
@@ -28,7 +28,7 @@ If you can help unblock a pure HTTP transport (especially for video generation,
28
28
  - `uv sync` then `uv run playwright install chromium`. No global Python install needed.
29
29
  - Copy `.env.template` to `.env.local`; never commit `.env.local`. It documents every env var.
30
30
  - Output goes to `./tmp/` for scripts/tests or `$GFLOW_CLI_OUTPUT_DIR` for CLI outputs (defaults to `./out/`).
31
- - One-time auth: `gflow auth login --browser chrome`. The `--browser chrome` flag is mandatory; the CLI fails fast on other strategies.
31
+ - One-time auth: `gflow auth login --browser chrome` (recommended — a real-Chrome profile is what generation runs need; the default `--browser auto` can also pick the internal strategy, and generation later fails fast on profiles created with a non-chrome strategy).
32
32
  - Use `/gflow:status` to see the current task before starting work; `/gflow:known-issues` before touching auth or reCAPTCHA code paths.
33
33
 
34
34
  ## Testing instructions — The Impeccable Routine
@@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.38.0] — 2026-07-17
11
+
12
+ ### Added
13
+
14
+ - **Robust agentic↔classic UI mode control** (#332): `--ui-mode` is now driven by a state-aware mode controller that reads Flow's Agent toggle (`aria-pressed`, locale-invariant) instead of icon heuristics — the "Tools" icon present in both modes could previously be misread as a forced-agentic cohort, causing spurious "not recoverable" aborts. `--ui-mode classic` now reliably reaches the classic editor: the controller closes the chat sidebar, toggles off only when actually in agent mode, and verifies the result. Live-verified with a full classic→agent→classic round-trip on real Flow.
15
+ - **i2i reference dedup via picker filename search** (#314): repeated local `--ref` images in `gflow image i2i` are attached by selecting the already-uploaded library tile (exact-filename picker search, project-scoped) instead of re-uploading — ending duplicate library pile-ups (the reported 8× `son.jpg`). Falls back to upload when the filename isn't found, and scrolls the virtualised picker grid so off-screen matches are still selected rather than silently re-uploaded (#335). R2V video refs keep upload-only behavior.
16
+ - **PR-Triage Autopilot (#238, #333)**: deterministic Stage 0 pre-filter and ephemeral Docker container sandbox executing the `/gflow:pr-council-review` skill against qualified external PRs hourly on the host VPS. Includes Telegram notifications and a persistent audit ledger. Implementation + fixture evals ship in this release; host-side deployment is staged separately.
17
+
18
+ ### Changed
19
+
20
+ - **Cognitive-complexity refactor of 5 pure-logic functions** (#331): extracted cohesive private helpers to bring them under the Sonar S3776 threshold with zero behavior change (verified by types, scoped tests, and an adversarial behavior-diff review). The remaining S3776/S107 findings in essential-complexity live-automation code were accepted in SonarCloud with justification.
21
+
10
22
  ## [0.37.0] — 2026-07-17
11
23
 
12
24
  ### Fixed
@@ -319,6 +331,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
319
331
  mid-run edit to the home `.env` can no longer produce a task whose client config
320
332
  disagrees with the parameters the task derived from `get_settings()`.
321
333
 
334
+
322
335
  ## [0.24.0] — 2026-07-01
323
336
 
324
337
  ### Added
@@ -2007,7 +2020,8 @@ shell-script template that branches on these codes.
2007
2020
 
2008
2021
  First skeleton. Not functional end-to-end yet.
2009
2022
 
2010
- [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.37.0...HEAD
2023
+ [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.38.0...HEAD
2024
+ [0.38.0]: https://github.com/ffroliva/gflow-cli/compare/v0.37.0...v0.38.0
2011
2025
  [0.37.0]: https://github.com/ffroliva/gflow-cli/compare/v0.36.0...v0.37.0
2012
2026
  [0.36.0]: https://github.com/ffroliva/gflow-cli/compare/v0.35.0...v0.36.0
2013
2027
  [0.35.0]: https://github.com/ffroliva/gflow-cli/compare/v0.34.0...v0.35.0
@@ -751,6 +751,21 @@ key — surfaces as a `RuntimeError` that `auth/cookies.py` normalizes to
751
751
 
752
752
  ## Resolved
753
753
 
754
+ ### False "forced agentic — not recoverable" aborts from an icon-heuristic cohort probe
755
+
756
+ - **Status:** Resolved · **Severity:** Was-Medium (spurious exit-25 aborts on profiles that could in fact reach classic mode) · **Was-affecting:** `--ui-mode classic` and classic-only operations through v0.37.0 · **Fixed in:** 0.38.0 · **Tracked:** [#299](https://github.com/ffroliva/gflow-cli/issues/299), [#332](https://github.com/ffroliva/gflow-cli/issues/332)
757
+
758
+ The forced-agentic detection keyed on UI icons including `apps_spark_2` — which is
759
+ Flow's **Tools** button, present in BOTH cohorts — so a classic-capable profile could
760
+ be misclassified as an unrecoverable agentic cohort and abort with exit 25. Recovery
761
+ was a blind single click on the Agent pill with no state verification. v0.38.0
762
+ replaces this with a state-aware mode controller (`mode_control.py`) that reads the
763
+ Agent toggle's `aria-pressed` attribute (false = classic media, true = agent —
764
+ locale-invariant), closes the expanded chat sidebar first, toggles off only when
765
+ actually in agent mode, and re-verifies. Live-verified with a full
766
+ classic→agent→classic round-trip and a real agentic→classic recovery in the v0.38.0
767
+ release run ([evidence](docs/LIVE_VERIFICATION_v0.38.0.md)).
768
+
754
769
  ### Agentic image generation could silently attribute a pre-existing project asset as the "generated" image
755
770
 
756
771
  - **Status:** Resolved · **Severity:** Was-High (wrong file downloaded and reported as success, silently) · **Was-affecting:** the agentic driver through v0.30.0 (and, for the pre-download guard below, every transport) · **Fixed in:** unreleased (0.31.0) · **Tracked:** [#281](https://github.com/ffroliva/gflow-cli/issues/281); related picker fix [#282](https://github.com/ffroliva/gflow-cli/issues/282)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gflow-cli
3
- Version: 0.37.0
3
+ Version: 0.38.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
@@ -449,6 +449,18 @@ Phase A (T2V library transport) shipped with v0.7.0 via PR #23. PR #36 (2026-05-
449
449
 
450
450
  ---
451
451
 
452
+ ### PR-Triage Autopilot — COMPLETED
453
+
454
+ Autonomous hourly code review helper running in a Docker sandbox. Design spec in [2026-07-04-pr-triage-autopilot-design.md](file:///C:/development/github/gflow-cli-pr-triage/docs/superpowers/specs/2026-07-04-pr-triage-autopilot-design.md).
455
+
456
+ - [x] Task 1: Stage 0 deterministic pre-filter (`pr_triage_gate.py`)
457
+ - [x] Task 2: §9 Autonomous mode in `pr-council-review` skill
458
+ - [x] Task 3: Ephemeral Docker sandbox image (`Dockerfile.triage`)
459
+ - [x] Task 4: Main host orchestration script (`pr_triage_autopilot.py`)
460
+ - [x] Task 5: Operations runbook (`PR_TRIAGE_AUTOPILOT-OPS.md`)
461
+
462
+ ---
463
+
452
464
  ### Technical Debt & Refactoring — BACKLOG
453
465
 
454
466
  Identified during v0.6.0a1 Council Review. To be addressed before or during Phase 6.
@@ -0,0 +1,94 @@
1
+ # PR-Triage Autopilot Operations Runbook
2
+
3
+ This runbook guides the deployment, configuration, monitoring, and administration of the hourly PR-Triage Autopilot on the VPS host.
4
+
5
+ ---
6
+
7
+ ## 1. Environment & Credentials
8
+
9
+ The autopilot orchestrator (`scripts/autopilot/pr_triage_autopilot.py`) runs as an hourly cron job and requires the following environment variables:
10
+
11
+ | Variable | Scope | Purpose |
12
+ |---|---|---|
13
+ | `ANTHROPIC_API_KEY` | Autopilot orchestrator & sandbox | Mints the Claude agent tokens to execute the council review. |
14
+ | `GH_COMMENT_TOKEN` | Autopilot orchestrator (host) | The comment-only GitHub PAT used to post verdicts and reviews to `ffroliva/gflow-cli` PRs. |
15
+ | `TELEGRAM_BOT_TOKEN` | Autopilot orchestrator (host) | Bot token to dispatch alert messages. |
16
+ | `TELEGRAM_USER_ID` | Autopilot orchestrator (host) | The chat ID to receive triage alert messages. |
17
+ | `PR_TRIAGE_ENGINE` | Autopilot orchestrator (host), optional | Review engine selector. Default `council-claude`; any other value exits at startup (`council-multi-cli` is reserved backlog). |
18
+ | `HERMES_OPS_DIR` | Autopilot orchestrator (host), optional | Location of the hermes-ops checkout hosting the Resend email notifier. Default `/opt/hermes-ops`. |
19
+ | `RESEND_API_KEY` | Email notifier (hermes-ops) | Resend API key consumed by `$HERMES_OPS_DIR/scripts/notify/email_notify.py`. |
20
+ | `HERMES_NOTIFY_EMAIL_TO` | Email notifier (hermes-ops) | Recipient address for high-signal triage emails. |
21
+ | `HERMES_NOTIFY_EMAIL_FROM` | Email notifier (hermes-ops) | Verified sender address for the Resend account. |
22
+
23
+ **Email channel note:** on the VPS the three email vars live in `/opt/hermes/.env`, rendered from hermes-ops' SOPS store. When they are unset the email channel silently disables itself — the notifier logs "email disabled" and the autopilot run is unaffected (Telegram, ledger, and GitHub comments remain authoritative).
24
+
25
+ ---
26
+
27
+ ## 2. Directory Layout & Symlinks
28
+
29
+ Deploy the following layout on the VPS:
30
+ - `/opt/gflow-cli`: Dedicated git repository checkout representing the active branch.
31
+ - `/opt/experience-vault`: Host experience vault directory structure.
32
+ - `/opt/experience-vault/projects/C--development-github-gflow-cli/memory`: The project-specific memory namespace to mount.
33
+
34
+ ---
35
+
36
+ ## 3. Ephemeral Sandbox Firewall Hardening
37
+
38
+ The docker sandbox runs under `scripts/autopilot/run_sandboxed_review.sh`. If run with root/sudo privileges on the VPS host, it automatically invokes `iptables` rules restricting the container bridge network egress interface to:
39
+ - UDP/TCP port 53 (DNS resolution)
40
+ - TCP port 443 to `api.anthropic.com` resolved IPs
41
+ - TCP port 443 to `github.com` resolved IPs
42
+ - All other internet egress is blocked (`DROP`).
43
+
44
+ Ensure `iptables` is installed on the host VPS. If `iptables` permissions are withheld, the script falls back with a warning, but egress hardening will not be active.
45
+
46
+ ---
47
+
48
+ ## 4. Cron Configuration & Verification
49
+
50
+ ### Setup Cron Tick
51
+ Configure a cron job checking every hour on the hour under the `hermes` system user:
52
+
53
+ ```cron
54
+ 0 * * * * set -a; . /opt/hermes/.env 2>/dev/null; set +a; export ANTHROPIC_API_KEY="xxx" && export GH_COMMENT_TOKEN="xxx" && export TELEGRAM_BOT_TOKEN="xxx" && export TELEGRAM_USER_ID="xxx" && cd /opt/gflow-cli && uv run python scripts/autopilot/pr_triage_autopilot.py --repo-dir /opt/gflow-cli --memory-dir /opt/experience-vault/projects/C--development-github-gflow-cli/memory >> /var/log/hermes/pr_triage.log 2>&1
55
+ ```
56
+
57
+ Sourcing `/opt/hermes/.env` first (`set -a` exports everything it defines) is what delivers the `RESEND_API_KEY` / `HERMES_NOTIFY_EMAIL_*` vars to the process so the email channel works; without it the run still succeeds but emails are silently disabled.
58
+
59
+ ### Deploy mechanism (warning)
60
+
61
+ Do **NOT** register the orchestrator directly via `hermes cron create --script pr_triage_autopilot.py`. Hermes' cron runs scripts with hermes-agent's own interpreter — which lacks this repo's dependencies (e.g. `structlog`) — and only accepts scripts under `HERMES_HOME/scripts/`. Supported mechanisms:
62
+
63
+ - **(a) Plain crontab** — the line above, under the `hermes` system user.
64
+ - **(b) Thin shim in `HERMES_HOME/scripts/`** — a script that does `cd /opt/gflow-cli && exec uv run python scripts/autopilot/pr_triage_autopilot.py "$@"` (mirrors the existing EV ops-health shim pattern), registered with `hermes cron create "1h" --no-agent --script <shim> --deliver telegram`.
65
+
66
+ ### Check Logs & Status
67
+ - **Log Location**: `/var/log/hermes/pr_triage.log`
68
+ - **Triage Ledger**: `/opt/gflow-cli/pr_triage_ledger.jsonl` tracks verdicts and failure states.
69
+ - **Lock File**: `/tmp/pr_triage_autopilot.lock` prevents overlapping ticks.
70
+
71
+ ---
72
+
73
+ ## 5. Operations & Kill-Switches
74
+
75
+ ### Incident: Infinite loop or excessive cost
76
+ 1. **Pause Cron**: Comment out the cron entry in `crontab -e`.
77
+ 2. **Kill Running Container**:
78
+ ```bash
79
+ docker ps | grep gflow-triage
80
+ docker kill <container_id>
81
+ ```
82
+ 3. **Clean Up Lock**:
83
+ ```bash
84
+ rm -f /tmp/pr_triage_autopilot.lock
85
+ ```
86
+
87
+ ### Incident: Permanently Failed PR
88
+ If a PR enters the `FAILED_PERMANENT` state in `pr_triage_ledger.jsonl` due to 3 consecutive failures:
89
+ 1. Examine `/var/log/hermes/pr_triage.log` for the exact trace.
90
+ 2. Fix the underlying environmental or syntax issue.
91
+ 3. To trigger a re-review, delete or edit the `FAILED_PERMANENT` entries for that PR number/SHA in `pr_triage_ledger.jsonl`, then run the script manually:
92
+ ```bash
93
+ uv run python scripts/autopilot/pr_triage_autopilot.py --repo-dir /opt/gflow-cli --memory-dir /opt/experience-vault/projects/C--development-github-gflow-cli/memory
94
+ ```
@@ -24,9 +24,7 @@ when deciding what to do with an external or internal PR.
24
24
 
25
25
  ## Automated External PR Triage
26
26
 
27
- External PR routing is handled by
28
- `.github/workflows/external-pr-triage.yml`. It uses `pull_request_target`, but
29
- only for repository metadata operations:
27
+ External PR routing starts with `.github/workflows/external-pr-triage.yml` (triggered via `pull_request_target`), which performs basic repository metadata operations:
30
28
 
31
29
  - label external PRs as `external-contribution`
32
30
  - label them as `needs-maintainer-review`
@@ -34,12 +32,17 @@ only for repository metadata operations:
34
32
  - request `@ffroliva` as reviewer
35
33
  - post or update the external-contribution checklist comment
36
34
 
37
- Bot PRs such as Dependabot updates are skipped by this human-contributor
38
- triage. They still run normal CI and remain subject to branch protection.
35
+ Bot PRs such as Dependabot updates are skipped by this human-contributor triage. They still run normal CI and remain subject to branch protection.
39
36
 
40
- This workflow must not checkout the PR branch, install dependencies, run tests,
41
- or execute contributor code. Keep all code execution in the normal `pull_request`
42
- CI workflow, where forked PRs do not receive repository secrets.
37
+ This workflow must not checkout the PR branch, install dependencies, run tests, or execute contributor code. Keep all code execution in the normal `pull_request` CI workflow, where forked PRs do not receive repository secrets.
38
+
39
+ ### PR-Triage Autopilot (VPS Sandbox)
40
+
41
+ To automate deeper verification, an hourly `hermes-ops` cron job runs on the host VPS to triage eligible external PRs.
42
+ - It uses the deterministic **Stage 0 pre-filter** (`pr_triage_gate.py`) to confirm eligibility.
43
+ - It fetches the PR branch and runs the full `/gflow:pr-council-review` inside an **ephemeral, non-root, read-only Docker container sandbox** (with restricted network egress and no write credentials).
44
+ - The host orchestrator posts the review comment to the PR and alerts the maintainer via Telegram.
45
+ - For design details, see [2026-07-04-pr-triage-autopilot-design.md](superpowers/specs/2026-07-04-pr-triage-autopilot-design.md) and the implementation plan [PLAN.md](superpowers/plans/2026-07-08-pr-triage-autopilot/PLAN.md).
43
46
 
44
47
  ## GitHub Copilot Code Review
45
48
 
@@ -47,6 +47,8 @@ Welcome to the `gflow-cli` documentation. This index is the routing layer: it te
47
47
  | **[skills/README.md](../skills/README.md)** | Installable agent skill docs (gflow-cli, predict, pr-council-review, scenario) — cross-tool portable Markdown consumed by Claude Code, Cursor, Codex, Gemini CLI, Aider, etc. | Any agent wanting to use gflow-cli correctly |
48
48
  | **[scripts/dev/skillopt/README.md](../scripts/dev/skillopt/README.md)** | SkillOpt mock harness — rollout→score loop for measuring and improving skill doc accuracy across multiple LLM providers | Measuring a skill edit's impact; comparing Claude vs GPT-4o vs Gemini on gflow tasks |
49
49
  | **[scripts/diag/README.md](../scripts/diag/README.md)** | Diagnostic investigation scripts — run against a live authenticated profile to capture wire samples, measure Chrome memory, or mint reCAPTCHA tokens | Running a one-off investigation against a live Flow session; establishing baseline measurements for issue #155 |
50
+ | [docs/superpowers/specs/2026-07-04-pr-triage-autopilot-design.md](superpowers/specs/2026-07-04-pr-triage-autopilot-design.md) | PR-triage autopilot design spec: Stage 0/1 gate, Docker sandboxing, Telegram and audit ledger | Reviewing or auditing the automated PR-triage setup |
51
+ | [docs/superpowers/plans/2026-07-08-pr-triage-autopilot/PLAN.md](superpowers/plans/2026-07-08-pr-triage-autopilot/PLAN.md) | Implementation plan for the PR-Triage Autopilot | Tracking task-by-task execution |
50
52
 
51
53
  ## Agent commands
52
54
 
@@ -123,7 +125,7 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
123
125
  **"A gflow command hangs / fails — where do I start?"** → [DEBUGGING § Quick reference](DEBUGGING.md#quick-reference)
124
126
  **"Flow's UI broke a selector — how do I diagnose it?"** → [DEBUGGING § Inspecting Flow's live UI](DEBUGGING.md#inspecting-flows-live-ui)
125
127
  **"What does each `ui_automation.*` log event mean?"** → [DEBUGGING § Listener & HTTP-layer debugging](DEBUGGING.md#listener--http-layer-debugging)
126
- **What was actually live-verified for the latest release?** → latest: [LIVE_VERIFICATION_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)
128
+ **What was actually live-verified for the latest release?** → latest: [LIVE_VERIFICATION_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)
127
129
  **"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.
128
130
  **"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)
129
131
  **"What was live-verified for the video-download feature (#29)?"** → [LIVE_VERIFICATION_video_download](LIVE_VERIFICATION_video_download.md)
@@ -0,0 +1,52 @@
1
+ # Live Verification — v0.38.0
2
+
3
+ **Date:** 2026-07-17 · **Profile:** `ffroliva` (real Chrome, live Flow) · **Tree:** `develop` @ v0.38.0 prep
4
+
5
+ This release's user-facing changes were exercised end-to-end against live Flow before the
6
+ tag. Evidence uses the 5-layer ledger (file count + magic bytes + shape + structlog
7
+ invariants + user-confirmable artifact).
8
+
9
+ ## Features covered
10
+
11
+ | Feature (release) | How verified |
12
+ |---|---|
13
+ | **Robust agentic↔classic mode control** (#332) | The t2i run below requested `--ui-mode classic` on a profile that loaded in the agentic cohort; the log shows `ui_driver.ui_mode.attempt_exit_agent` followed by the full classic-editor chain — the exact path that previously false-aborted as "forced agentic, not recoverable". Also live-validated in #332 itself via `scripts/dev/spike_mode_roundtrip.py` (full classic→agent→classic round-trip asserting `aria-pressed`). |
14
+ | **i2i ref dedup via picker filename search** (#314, #334, #335) | Two identical `image i2i` runs against the same project with a uniquely-named local ref. Run 1: picker search missed (scroll probes logged) → `image_uploaded` (HTTP 200) → `reference_attached`. Run 2: `reference_deduped_by_filename` (`dedup-v038-check.jpg`), **zero** upload events, `reference_attached` via the existing tile, generation OK. This closes the "Live e2e re-verify pending" note on #335. |
15
+ | **Cognitive-complexity refactor** (#331) | Behavior-preserving by construction (pyright 0/0/0, 1202 scoped tests, adversarial behavior-diff review in the PR); all three live runs below traverse the refactored `_enter_setup` client path. |
16
+ | **PR-Triage Autopilot** (#238, #333) | **Not live-verifiable this cycle:** the autopilot executes on the hermes-ops VPS, whose deployment is staged separately (implementation + fixture evals only in this repo). Recorded here per the release gate rather than silently omitted. |
17
+
18
+ ## E2e evidence — `gflow image t2i --ui-mode classic` (classic cohort, #332 path)
19
+
20
+ - **Command:** `image t2i "a red vintage bicycle leaning against a stone wall, morning light, photorealistic" --aspect 16:9 -n 1 --ui-mode classic` · **exit 0** · `status: ok`.
21
+ - **File count:** 1 JPEG produced.
22
+ - **Magic bytes:** `ff d8 ff e0` (valid JPEG).
23
+ - **Shape:** 1376×768 (16:9), 1.16 MB, model `NARWHAL`.
24
+ - **Structlog invariants:** `ui_mode.attempt_exit_agent → image_mode_entered → image_model_selected → aspect_ratio_set → count_setter_completed → prompt_submitted → batch_response_captured`.
25
+ - **Artifact:** `2ac7ae3f-…_1.jpg`.
26
+
27
+ ## E2e evidence — `gflow image i2i` ×2, same ref (dedup, #314)
28
+
29
+ - **Commands:** `image i2i "<prompt>" --ref dedup-v038-check.jpg --project 9d5b9a86-…` run twice · both **exit 0** · `status: ok`.
30
+ - **Run 1 (miss→upload):** `picker_scroll_probe`×4 → `picker_scroll_done` → `image_uploaded` (HTTP 200) → `reference_attached`; 1 JPEG generated.
31
+ - **Run 2 (hit→dedup):** `reference_deduped_by_filename {filename: dedup-v038-check.jpg}` → `reference_attached`; **0** `image_uploaded` events; 1 JPEG generated.
32
+ - **Artifacts:** `582da216-…_1.jpg` (run 1), `00e99878-…_1.jpg` (run 2).
33
+
34
+ ## E2e evidence — `gflow video t2v` (veo-fast, classic cohort)
35
+
36
+ - **Command:** `video t2v "slow dolly shot along a misty forest road at dawn, cinematic" --aspect 16:9 --model veo-fast` · **exit 0** · `generation_status: MEDIA_GENERATION_STATUS_SUCCESSFUL`.
37
+ - **File count:** 1 MP4 produced.
38
+ - **Magic bytes:** `ftyp isom` container (valid MP4).
39
+ - **Shape:** 15.2 MB (landscape), model `veo_3_1_fast`.
40
+ - **Structlog invariants:** `video_mode_entered → editor_ready → model_selected → aspect_set → output_count_set → generate_captured → poll_terminal(SUCCESSFUL) → video_saved`.
41
+ - **Artifact:** `3d001ce4-….mp4`.
42
+
43
+ ## Pre-tag gates
44
+
45
+ - `/gflow:check`: hygiene + doc links + ruff check/format + pyright 0/0/0 green; full-suite CI green on the exact release tree (develop @ `b97a8ea`).
46
+ - `/gflow:doc-review`: mechanical pass green after fixes (PROJECT_STATUS updated for v0.37.0+v0.38.0; shipped plan dirs consolidated). _Council verdict: YELLOW/YELLOW/GREEN across the 3 auditors. 6 findings: 0 Tier 1; 4 Tier 2 fixed in the release-prep commit (USAGE i2i dedup semantics, KNOWN_ISSUES resolved entry for the false forced-agentic abort + exit-25 remediation refresh, AGENTS.md `--browser` claim, AGENTS.md video `batch` stub label); 2 cosmetic noted, no action. Council reports at `tmp/council/0{1,2,3}-*.md` (local-only)._
47
+
48
+ ## Result
49
+
50
+ All live generation paths succeeded end-to-end on the v0.38.0 tree: the #332 mode
51
+ controller recovered agentic→classic in a real run, and the #314 dedup path selected the
52
+ existing library tile instead of re-uploading. Release gate **PASS**.
@@ -4,9 +4,21 @@
4
4
 
5
5
  ## Current release
6
6
 
7
+ **v0.38.0 — alpha.** **Robust agentic↔classic mode control + i2i reference dedup (#332, #314).** `--ui-mode` is now driven by a state-aware mode controller reading Flow's Agent toggle `aria-pressed` state (locale-invariant), ending spurious "forced agentic — not recoverable" aborts caused by an icon heuristic that matched both modes; `--ui-mode classic` reliably reaches the classic editor. Repeated local `--ref` images in `gflow image i2i` are now attached by selecting the already-uploaded library tile via exact-filename picker search (with a virtualised-grid scroll fallback, #335) instead of re-uploading duplicates. Also ships the PR-triage autopilot implementation (#238/#333, host deployment staged separately) and a behavior-preserving cognitive-complexity refactor (#331). Verification: [LIVE_VERIFICATION_v0.38.0](LIVE_VERIFICATION_v0.38.0.md) (agentic→classic recovery observed in a real run; dedup contract proven with an upload-then-dedup run pair; veo-fast t2v successful).
8
+
9
+ **Develop (unreleased, post-v0.38.0):** *(empty — develop is the staging branch for the next release).*
10
+
11
+ <details><summary>v0.37.0 — viewport 1920×1080 + agentic count enforcement</summary>
12
+
13
+ **v0.37.0 — alpha.** **Viewport 1920×1080 + agentic count enforcement + FIPS-safe SAPISIDHASH (#313, #315, #329).** UI-automation and auth-login viewports harmonized to 1920×1080 to blend with the most common desktop resolution; the agentic cohort's requested image count (`-n`) is reliably enforced via the Agent settings panel; the protocol-mandated SHA-1 in SAPISIDHASH is marked `usedforsecurity=False` so it works under FIPS-mode Python. Also bumps `mcp` to 1.28.1 (CVE-2026-59950). Verification: [LIVE_VERIFICATION_v0.37.0](LIVE_VERIFICATION_v0.37.0.md).
14
+
15
+ </details>
16
+
17
+ <details><summary>v0.36.0 — diagnostic tooling + reference-entity-smuggling fix</summary>
18
+
7
19
  **v0.36.0 — alpha.** **Diagnostic tooling (`GFLOW_CLI_HAR_PATH` + `GFLOW_CLI_DEBUG_TRACEBACK`) + reference-entity-smuggling fix (#312/#316).** Two opt-in, env-var-only debug knobs: `GFLOW_CLI_HAR_PATH` captures full Playwright network traffic to a HAR file (0600-hardened on POSIX); `GFLOW_CLI_DEBUG_TRACEBACK` prints the real exception + traceback for unhandled errors (console and `--json`) instead of the generic placeholder, while structured telemetry stays hashed unconditionally either way. Also fixes a poisoned character entity leaking `referenceEntities` into unrelated `image i2i` calls in the same project workspace. Also ships the `llm-council` skill (`/gflow:llm-council`), adding external CLI reviewers (`codex`/`gemini`, opt-in `agy`) alongside the internal council for high-stakes reviews. Verification: [LIVE_VERIFICATION_v0.36.0](LIVE_VERIFICATION_v0.36.0.md) (live HAR capture against real Flow traffic; typed-error scoping confirmed live; unhandled path covered by 6 new tests, 30 total across both files).
8
20
 
9
- **Develop (unreleased, post-v0.36.0):** *(empty — develop is the staging branch for the next release).*
21
+ </details>
10
22
 
11
23
  <details><summary>v0.35.0 — multimodal reverse-engineering + storyboard tool</summary>
12
24
 
@@ -209,6 +221,8 @@ reporter-verified e2e on macOS).
209
221
  | Agent instructions (`-i`/`--instruction`) steer agentic generation — conversational directive + brief master switch (PR #263) | ✅ done (v0.28.0) |
210
222
  | Persistent `gflow instructions` CRUD + `movie.toml` instructions brief-sync + `gflow_instructions_*` MCP tools + CI-enforced MCP↔CLI parity (#192) | ✅ done (v0.29.0) |
211
223
  | Diagnostic tooling (`GFLOW_CLI_HAR_PATH` + `GFLOW_CLI_DEBUG_TRACEBACK`) + reference-entity-smuggling fix (#312/#316) | ✅ done (v0.36.0) |
224
+ | Viewports 1920×1080 + agentic count enforcement + FIPS-safe SAPISIDHASH (#313/#315/#329) | ✅ done (v0.37.0) |
225
+ | Robust `aria-pressed` agentic↔classic mode control (#332) + i2i ref dedup via picker filename search (#314) | ✅ done (v0.38.0) |
212
226
  | `gflow video batch` (TSV manifest) on `ui_automation` | ⏳ Phase B |
213
227
  | Persistence layer (stay-mounted batch sessions across project boundaries) | ⏳ Phase B |
214
228
  | Provider abstraction for official Veo 3.1 API | ⏳ planned |
@@ -306,7 +306,7 @@ Options:
306
306
  **Path-or-UUID semantics.** Each `--ref` value is classified at the CLI boundary:
307
307
 
308
308
  - **Looks like a Flow asset UUID** (case-insensitive 8-4-4-4-12 hex, e.g. `ddb6ef97-262d-49f4-8269-4a28c0fae6a2`) → passed through verbatim. No upload, no extra round-trip.
309
- - **Anything else** → treated as a local path. The CLI canonicalises it (resolving symlinks once at validation time, closing the symlink-laundering vector where `./hero.png -> ~/.ssh/id_rsa` could exfiltrate secrets), uploads it, then uses the resulting UUID.
309
+ - **Anything else** → treated as a local path. The CLI canonicalises it (resolving symlinks once at validation time, closing the symlink-laundering vector where `./hero.png -> ~/.ssh/id_rsa` could exfiltrate secrets), then attaches it — **deduplicated by filename since v0.38.0 (#314):** if the target project's library already holds an asset with the exact same filename, that existing tile is selected in the picker instead of re-uploading, so repeating a ref across runs no longer piles up duplicate library entries. On a picker miss the file is uploaded as before. Caveat: the match is by exact filename only — a *different* image that happens to share the name of one already in the project will be reused, not uploaded; rename the file if you need a fresh upload. (Video `r2v` refs keep upload-only behavior.)
310
310
 
311
311
  Mix and match in a single call. UUIDs and paths can co-exist on the same command line; order is preserved so `imageInputs[]` matches the order you typed.
312
312
 
@@ -1251,7 +1251,7 @@ shell scripts can branch on the failure mode without parsing stderr.
1251
1251
  | `22` | `UpscaleUnavailableError` | 4K upscale is gated to Flow **Ultra** accounts (HTTP 403) | Use `--scale 2k`, or upgrade the Flow plan |
1252
1252
  | `23` | `UiSelectorDriftError` | A Flow editor control could not be located — Google changed the frontend (issue #183) | Update gflow-cli; file a bug with the probe name + debug screenshot from the error message |
1253
1253
  | `24` | `BrowserEngineUnavailableError` | `GFLOW_CLI_BROWSER_ENGINE=patchright` but the engine is not installed | `pip install 'gflow-cli[patchright]'`, or unset `GFLOW_CLI_BROWSER_ENGINE` |
1254
- | `25` | `FlowAgentUiError` | The profile is on Flow's Agentic UI cohort and the classic media panel is unrecoverable for this operation | Use a Classic-cohort profile; see KNOWN_ISSUES on the agentic cohort |
1254
+ | `25` | `FlowAgentUiError` | The profile is on Flow's Agentic UI cohort and the classic media panel is unrecoverable for this operation | Rare since v0.38.0 (#332): the mode controller reliably recovers agentic→classic, so first retry with `--ui-mode classic`; if it persists, see KNOWN_ISSUES on the agentic cohort |
1255
1255
  | `26` | `MediaAttributionError` | Generated media could not be reliably attributed to this request (issue #281) | Re-run; a dedicated project with fewer pre-existing assets avoids the ambiguity |
1256
1256
  | `27` | `MediaUploadRejectedError` | Flow's upload endpoint refused the input file (`uploadImage` 4xx, issue #287) | Re-encode the image (`ffmpeg -q:v 2 -map_metadata -1`), or reference the asset by its media UUID |
1257
1257
  | `28` | `UiModeUnavailableError` | The Flow UI arm this command required (`GFLOW_CLI_UI_MODE`, or inferred — `-i` forces agentic) couldn't be reached after a switch attempt; aborted before submitting — no credits spent (issue #299) | Retry (the cohort flaps per load); try another `--profile`; or relax `GFLOW_CLI_UI_MODE` |
@@ -0,0 +1,164 @@
1
+ # PR-Triage Autopilot Implementation Plan
2
+
3
+ > **For agentic workers:** Run `/gflow:status --feature pr-triage-autopilot` to find the next
4
+ > unchecked task. Implement one task at a time. Run `/gflow:check` before every commit.
5
+
6
+ **Goal:** Implement an hourly `hermes-ops` autopilot that autonomously runs `/gflow:pr-council-review` against eligible external PRs on `ffroliva/gflow-cli` using a sandboxed Docker container, auto-posts reviews, and alerts via Telegram.
7
+
8
+ **Architecture:**
9
+ - `scripts/autopilot/pr_triage_gate.py` (Stage 0): Deterministic pre-filter verifying author, draft status, diff sizes, and scanning for obvious prompt injections.
10
+ - `scripts/autopilot/Dockerfile.triage`: Ephemeral container image packing the `claude` CLI, run with restricted read-only volume mounts and network egress.
11
+ - `skills/pr-council-review/SKILL.md`: Gaining §9 autonomous resolutions for interactive gates (credit limits, memory, etc.).
12
+ - `scripts/autopilot/pr_triage_autopilot.py`: The hourly host orchestrator handling polling, Stage 1/council execution, posting comments via the host token boundary, Telegram alerts, and writing to `pr_triage_ledger.jsonl`.
13
+
14
+ **Predict verdict:** GO — confidence 9/10 (based on reference `dependabot-autopilot` pattern).
15
+
16
+ **Risk register:**
17
+ | Severity | Risk | Mitigation |
18
+ |---|---|---|
19
+ | Critical | Prompt injection executing commands on host VPS | Run reviews in ephemeral Docker sandbox with read-only code mounts, no write-scoped GitHub credentials, and network restrictions. |
20
+ | High | Unbounded LLM cost via commit churn or failed posts | Implement per-PR Stage-1 volume cap (default 3/day), calendar daily cap (default 5/day), and fail-count limit (cap at 3 retries, mark `FAILED_PERMANENT`). |
21
+ | Medium | Re-reviewing unchanged PRs | Key the audit ledger by `(pr, head_sha)` instead of just `pr` to skip already-reviewed commits. |
22
+
23
+ ---
24
+
25
+ ## File structure
26
+
27
+ ### New files
28
+ ```
29
+ scripts/autopilot/pr_triage_gate.py
30
+ Stage 0 deterministic pre-filter logic
31
+ scripts/autopilot/pr_triage_autopilot.py
32
+ Main host orchestrator script (triggers, sandbox executor, posting, ledger)
33
+ scripts/autopilot/Dockerfile.triage
34
+ Ephemeral sandbox container definition
35
+ scripts/autopilot/run_sandboxed_review.sh
36
+ Docker invocation wrapper
37
+ eval/pr_triage_fixtures.json
38
+ Recorded/synthetic GitHub PR shapes for pre-filter testing
39
+ eval/pr_triage_eval.py
40
+ 100%-match assertion script for Stage 0
41
+ deploy/PR-TRIAGE-AUTOPILOT-OPS.md
42
+ As-built operations runbook for the VPS
43
+ ```
44
+
45
+ ### Modified files
46
+ ```
47
+ skills/pr-council-review/SKILL.md
48
+ Add §9 Autonomous mode resolutions and structured verdict summary output
49
+ PLAN.md
50
+ Add PR-Triage Autopilot Phase status
51
+ ```
52
+
53
+ ---
54
+
55
+ ## Task 1 — Stage 0 Deterministic Pre-Filter (`pr_triage_gate.py`)
56
+
57
+ **What:** Implement the deterministic logic to identify eligible PRs, filter out drafts, bots, owner, oversized diffs, and obvious prompt injections.
58
+
59
+ **Files:**
60
+ - `scripts/autopilot/pr_triage_gate.py` — Pre-filter function and CLI wrapper
61
+ - `eval/pr_triage_fixtures.json` — Target test vectors
62
+ - `eval/pr_triage_eval.py` — Run gate logic over fixtures
63
+
64
+ **Steps:**
65
+ - [x] Define the `should_review(pr: dict) -> ShouldReviewResult` logic:
66
+ - Exclude author `ffroliva`, bot authors, and draft PRs.
67
+ - Detect PRs incorrectly targeting `main` base branch (route to `NEEDS-HUMAN` to post an automated request asking contributor to retarget to `develop` rather than silently skipping).
68
+ - Exclude diff sizes $> 30$ files or $> 1500$ additions+deletions.
69
+ - Scan title, body, and comments for regex-based injection patterns (e.g., "ignore previous instructions").
70
+ - [x] Record 10+ fixtures in `eval/pr_triage_fixtures.json` covering:
71
+ - Valid PRs (`PROCEED`)
72
+ - Drafts, owner, bots, and merged/closed PRs (`SKIP`)
73
+ - Oversized diffs (`DEFERRED_SIZE`)
74
+ - Injection matches (`NEEDS-HUMAN`)
75
+ - [x] Implement `eval/pr_triage_eval.py` asserting a 100% verdict match rate over the fixtures.
76
+
77
+ **Tests created (red):**
78
+ - [x] Run `python eval/pr_triage_eval.py` and verify all fixtures pass.
79
+
80
+ ---
81
+
82
+ ## Task 2 — §9 Autonomous Mode in `pr-council-review` Skill
83
+
84
+ **What:** Add non-interactive resolutions to the review skill when run under `hermes` orchestration.
85
+
86
+ **Files:**
87
+ - `skills/pr-council-review/SKILL.md` — Modify review instructions
88
+
89
+ **Steps:**
90
+ - [x] Add `## 9. Autonomous Mode` section:
91
+ - Instruct the agent to bypass the credit-spend gate (log as open item).
92
+ - Bypassing memory actions (report suggestions but do not auto-write).
93
+ - Forbid custom/unstructured output formats.
94
+ - Specify printing a single structured line to stdout at the end: `VERDICT: [verdict] | MUST-FIX: [count] | URL: [pr_url]` for the host orchestrator to parse.
95
+ - Set a content constraint on the review text itself: do not echo potential injection text, disclose environment details, or respond to meta-queries.
96
+
97
+ ---
98
+
99
+ ## Task 3 — Ephemeral Docker Sandbox (`Dockerfile.triage`)
100
+
101
+ **What:** Package the review environment in a secure, ephemeral container.
102
+
103
+ **Files:**
104
+ - `scripts/autopilot/Dockerfile.triage` — Docker image specification
105
+ - `scripts/autopilot/run_sandboxed_review.sh` — Execution wrapper shell script
106
+
107
+ **Steps:**
108
+ - [x] Define `Dockerfile.triage`:
109
+ - Base on a lightweight image (e.g., node/python-slim).
110
+ - Install dependencies (including the `gh` CLI required by the review skill) and Claude CLI.
111
+ - Configure a non-root runtime user with a writable home directory `/home/nonroot` (e.g. via tmpfs mount) to allow Claude CLI internal state writes.
112
+ - [x] Write `run_sandboxed_review.sh`:
113
+ - Bind-mount the fetched clone of `/opt/gflow-cli` as **read-only**.
114
+ - Mount only the project-specific memory namespace (`C:\Users\ffrol\.claude\projects\C--development-github-gflow-cli\memory` or its VPS equivalent) read-only, explicitly avoiding broad mounting of `/opt/experience-vault` to prevent cross-project exfiltration.
115
+ - Enforce restricted network egress (block everything except `api.anthropic.com` and `github.com`), explicitly permitting DNS (UDP/TCP port 53) for host name resolution.
116
+ - Restrict write capabilities (do not mount write-scoped GitHub tokens inside the container; pass the read-only auth token to `gh` safely).
117
+
118
+ ---
119
+
120
+ ## Task 4 — Main Orchestration Loop (`pr_triage_autopilot.py`)
121
+
122
+ **What:** Implement the hourly runner orchestrating Stage 0, Stage 1 pre-eval, sandbox execution, comment posting, Telegram notifications, and the audit ledger.
123
+
124
+ **Files:**
125
+ - `scripts/autopilot/pr_triage_autopilot.py` — Orchestrator entrypoint
126
+ - `tests/autopilot/test_pr_triage_autopilot.py` — Core tests
127
+
128
+ **Steps:**
129
+ - [x] Implement hourly lock file acquisition (`flock` or lockfile) to prevent concurrent cron ticks.
130
+ - [x] Fetch the list of open PRs via `gh pr list --json`.
131
+ - [x] Run Stage 0 gate. If qualified, fetch `pull/<N>/head` on the host machine.
132
+ - [x] Run Stage 1 pre-evaluation inside the container (cheap `claude -p` call). If `PROCEED`/`TRIVIAL`, proceed to the full review.
133
+ - [x] Launch the sandboxed Docker container executing the `pr-council-review` skill.
134
+ - [x] Capture the container's stdout, parse the structured summary line, and post the review comment from the host using `gh pr comment` (via the host's comment-only bot PAT).
135
+ - [x] Log outcomes atomically to `pr_triage_ledger.jsonl`.
136
+ - [x] Implement retry limits: increment `fail_count` on crashes; limit to 3 retries before marking `FAILED_PERMANENT` and sending a Telegram alert.
137
+ - [x] Implement the calendar daily cap (default 5 reviews/day).
138
+ - [x] Notify Telegram (Flavio) of every outcome (MERGE/FLAG/SKIP/ERROR).
139
+ - [x] Implement unit tests in `test_pr_triage_autopilot.py` ensuring that Docker and `gh` CLI subprocess calls are mocked/stubbed so tests pass cleanly on systems without Docker or `gh` CLI installed.
140
+
141
+ ---
142
+
143
+ ## Task 5 — Operations Runbook & Shim (`PR_TRIAGE_AUTOPILOT-OPS.md`)
144
+
145
+ **What:** Document deployment and operational management on the VPS.
146
+
147
+ **Files:**
148
+ - `deploy/PR-TRIAGE-AUTOPILOT-OPS.md` — Deployment runbook
149
+
150
+ **Steps:**
151
+ - [x] Document the VPS installation, environment variables (`TELEGRAM_USER_ID`, `GH_COMMENT_TOKEN`), and symlink setups.
152
+ - [x] Detail log locations, status checking (`hermes cron list`), and the kill-switch procedure (pausing cron / pausing docker daemon).
153
+ - [x] Record the golden-task baselines setup.
154
+
155
+ ---
156
+
157
+ ## Definition of done
158
+
159
+ - [x] All task steps checked off
160
+ - [x] `/gflow:check` green in the worktree
161
+ - [x] Pure-function fixture test (`pr_triage_eval.py`) passes 100%
162
+ - [x] Dry-run mode verified against actual open PRs without making live comments
163
+ - [x] `CHANGELOG.md` updated
164
+ - [x] Plan written to `docs/superpowers/plans/2026-07-08-pr-triage-autopilot/PLAN.md`