gflow-cli 0.59.0__tar.gz → 0.60.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 (811) hide show
  1. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.codex-plugin/plugin.json +1 -1
  2. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.github/workflows/ci.yml +57 -7
  3. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.github/workflows/deps-watch.yml +3 -1
  4. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.github/workflows/external-pr-triage.yml +9 -1
  5. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.github/workflows/governance-advisory.yml +11 -3
  6. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.github/workflows/governance-benchmark.yml +2 -1
  7. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.github/workflows/main-base-guard.yml +2 -0
  8. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.github/workflows/pages.yml +2 -0
  9. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.github/workflows/release.yml +8 -1
  10. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.github/workflows/scorecard.yml +1 -1
  11. gflow_cli-0.60.0/.github/workflows/selector-probe.yml +26 -0
  12. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/CHANGELOG.md +84 -1
  13. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/PKG-INFO +2 -2
  14. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/deploy/PR-TRIAGE-AUTOPILOT-OPS.md +28 -4
  15. gflow_cli-0.60.0/deploy/logrotate-pr-triage +21 -0
  16. {gflow_cli-0.59.0/website → gflow_cli-0.60.0}/docs/E2E_TESTING.md +159 -0
  17. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/GITHUB.md +87 -0
  18. gflow_cli-0.60.0/docs/INDEX.md +165 -0
  19. gflow_cli-0.60.0/docs/LIVE_VERIFICATION_v0.60.0.md +180 -0
  20. gflow_cli-0.60.0/docs/superpowers/plans/2026-08-21-selector-registry.md +743 -0
  21. gflow_cli-0.60.0/docs/superpowers/plans/2026-08-25-workflow-hardening-gaps.md +171 -0
  22. gflow_cli-0.60.0/docs/superpowers/specs/2026-08-21-selector-registry-design.md +307 -0
  23. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/pyproject.toml +3 -3
  24. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/autopilot/Dockerfile.triage +4 -0
  25. gflow_cli-0.60.0/scripts/autopilot/entrypoint.sh +10 -0
  26. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/autopilot/package-lock.json +48 -36
  27. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/autopilot/package.json +1 -1
  28. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/autopilot/pr_triage_autopilot.py +105 -10
  29. gflow_cli-0.60.0/scripts/autopilot/run_sandboxed_review.sh +172 -0
  30. gflow_cli-0.60.0/scripts/canary/register_task.ps1 +79 -0
  31. gflow_cli-0.60.0/scripts/canary/run_canary.py +362 -0
  32. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/ci/check_repo_hygiene.py +20 -6
  33. gflow_cli-0.60.0/scripts/dev/live_verify_policy_400_v060.py +142 -0
  34. gflow_cli-0.60.0/scripts/dev/spike_trpc_origin_referer_401.py +151 -0
  35. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/diag/README.md +1 -0
  36. gflow_cli-0.60.0/scripts/diag/diag_aisandbox_bearer.py +124 -0
  37. gflow_cli-0.60.0/scripts/probe/run_probe.py +210 -0
  38. gflow_cli-0.60.0/scripts/probe/spike_auth_matrix.py +131 -0
  39. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/__init__.py +1 -1
  40. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/client.py +59 -60
  41. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/_common.py +54 -0
  42. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/base.py +24 -0
  43. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/ui_automation.py +103 -27
  44. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/ui_automation_video.py +21 -4
  45. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/diagnostics.py +72 -13
  46. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/errors.py +57 -1
  47. gflow_cli-0.60.0/src/gflow_cli/flow_selectors/__init__.py +1 -0
  48. gflow_cli-0.60.0/src/gflow_cli/flow_selectors/grading.py +51 -0
  49. gflow_cli-0.60.0/src/gflow_cli/flow_selectors/model.py +59 -0
  50. gflow_cli-0.60.0/src/gflow_cli/flow_selectors/registry.py +63 -0
  51. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_post_json_aisandbox_auth.py +74 -0
  52. gflow_cli-0.60.0/tests/api/transports/test_policy_400.py +185 -0
  53. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/test_ui_automation.py +16 -3
  54. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/test_ui_automation_batch.py +8 -8
  55. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/autopilot/test_pr_triage_autopilot.py +344 -2
  56. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/conftest.py +26 -2
  57. gflow_cli-0.60.0/tests/flow_selectors/test_grading.py +67 -0
  58. gflow_cli-0.60.0/tests/flow_selectors/test_model.py +37 -0
  59. gflow_cli-0.60.0/tests/flow_selectors/test_registry.py +47 -0
  60. gflow_cli-0.60.0/tests/flow_selectors/test_report.py +57 -0
  61. gflow_cli-0.60.0/tests/scripts/test_canary_classify.py +326 -0
  62. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/scripts/test_check_repo_hygiene.py +46 -2
  63. gflow_cli-0.60.0/tests/scripts/test_workflow_hardening.py +203 -0
  64. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_errors_classification.py +9 -8
  65. gflow_cli-0.60.0/tests/test_incident_generation_requests.py +94 -0
  66. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_self_documenting_errors.py +34 -5
  67. gflow_cli-0.60.0/tests/tools/__init__.py +0 -0
  68. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/uv.lock +53 -53
  69. {gflow_cli-0.59.0 → gflow_cli-0.60.0/website}/docs/E2E_TESTING.md +159 -0
  70. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/requirements.txt +3 -3
  71. gflow_cli-0.59.0/docs/INDEX.md +0 -159
  72. gflow_cli-0.59.0/scripts/autopilot/entrypoint.sh +0 -9
  73. gflow_cli-0.59.0/scripts/autopilot/run_sandboxed_review.sh +0 -115
  74. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.agents/plugins/marketplace.json +0 -0
  75. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/README.md +0 -0
  76. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/active.md +0 -0
  77. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/branch-review.md +0 -0
  78. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/changelog.md +0 -0
  79. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/check.md +0 -0
  80. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/doc-review.md +0 -0
  81. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/issue-assessment.md +0 -0
  82. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/issue-resolve.md +0 -0
  83. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/known-issues.md +0 -0
  84. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/live-verify.md +0 -0
  85. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/llm-council.md +0 -0
  86. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/next.md +0 -0
  87. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/plan.md +0 -0
  88. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/pr-council-review.md +0 -0
  89. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/predict.md +0 -0
  90. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/release.md +0 -0
  91. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/scenario.md +0 -0
  92. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/sonar.md +0 -0
  93. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/status.md +0 -0
  94. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.env.template +0 -0
  95. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.gitattributes +0 -0
  96. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.github/CODEOWNERS +0 -0
  97. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  98. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.github/copilot-instructions.md +0 -0
  99. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.github/dependabot.yml +0 -0
  100. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.github/workflows/labels.yml +0 -0
  101. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.gitignore +0 -0
  102. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.gitleaks.toml +0 -0
  103. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.pre-commit-config.yaml +0 -0
  104. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.secrets.baseline +0 -0
  105. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/AGENTS.md +0 -0
  106. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/CLAUDE.md +0 -0
  107. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/CONFIGURATION.md +0 -0
  108. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/CONTRIBUTING.md +0 -0
  109. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/DISCLAIMER.md +0 -0
  110. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/KNOWN_ISSUES.md +0 -0
  111. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/LICENSE +0 -0
  112. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/PLAN.md +0 -0
  113. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/README.md +0 -0
  114. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/RELEASE.md +0 -0
  115. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/ROADMAP.md +0 -0
  116. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/conftest.py +0 -0
  117. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docker-compose.yml +0 -0
  118. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/AGENT_GUIDE.md +0 -0
  119. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/AGENT_UI_E2E.md +0 -0
  120. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/AGENT_UI_RECON.md +0 -0
  121. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/ARCHITECTURE.md +0 -0
  122. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/ASSET_TAGGING_RECON.md +0 -0
  123. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/AUTHENTICATION.md +0 -0
  124. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/CHARACTER.md +0 -0
  125. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/CHARACTER_RECON.md +0 -0
  126. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/CONFIGURATION.md +0 -0
  127. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/DATA_LAYER.md +0 -0
  128. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/DEBUGGING.md +0 -0
  129. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/DEMOS.md +0 -0
  130. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/DEVELOPMENT.md +0 -0
  131. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/EXTERNAL_STORAGE.md +0 -0
  132. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
  133. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
  134. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/INSTRUCTIONS.md +0 -0
  135. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
  136. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
  137. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_playwright_1.61.md +0 -0
  138. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
  139. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
  140. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
  141. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
  142. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
  143. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
  144. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
  145. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
  146. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
  147. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
  148. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.21.0.md +0 -0
  149. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.22.0.md +0 -0
  150. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.23.0.md +0 -0
  151. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.24.0.md +0 -0
  152. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.25.0.md +0 -0
  153. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.26.0.md +0 -0
  154. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.27.0.md +0 -0
  155. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.27.1.md +0 -0
  156. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.28.0.md +0 -0
  157. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.29.0.md +0 -0
  158. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.30.0.md +0 -0
  159. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.31.0.md +0 -0
  160. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.32.0.md +0 -0
  161. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.32.1.md +0 -0
  162. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.33.0.md +0 -0
  163. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.34.0.md +0 -0
  164. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.35.0.md +0 -0
  165. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.36.0.md +0 -0
  166. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.37.0.md +0 -0
  167. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.38.0.md +0 -0
  168. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.38.1.md +0 -0
  169. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.39.0.md +0 -0
  170. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.40.0-production-readiness.md +0 -0
  171. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.40.0.md +0 -0
  172. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.41.0.md +0 -0
  173. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.42.0.md +0 -0
  174. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.43.0.md +0 -0
  175. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.44.0.md +0 -0
  176. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.45.0.md +0 -0
  177. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.46.0.md +0 -0
  178. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.46.1.md +0 -0
  179. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.47.0.md +0 -0
  180. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.48.0.md +0 -0
  181. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.49.0.md +0 -0
  182. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.50.0.md +0 -0
  183. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.51.0.md +0 -0
  184. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.52.0.md +0 -0
  185. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.54.0.md +0 -0
  186. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.55.0.md +0 -0
  187. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.56.0.md +0 -0
  188. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.57.0.md +0 -0
  189. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.57.1.md +0 -0
  190. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.58.0.md +0 -0
  191. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.59.0.md +0 -0
  192. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
  193. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
  194. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
  195. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
  196. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
  197. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/MCP.md +0 -0
  198. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/MEDIA_LIBRARY.md +0 -0
  199. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/MOVIE.md +0 -0
  200. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/PROJECT_STATUS.md +0 -0
  201. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/PROMPT_EXPANSION.md +0 -0
  202. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/REFERENCE_STRATEGIES.md +0 -0
  203. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/SECURITY.md +0 -0
  204. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/TOOLS.md +0 -0
  205. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/USAGE.md +0 -0
  206. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/USER_GUIDE.md +0 -0
  207. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/assets/demo-split-pf.gif +0 -0
  208. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/assets/example-run.gif +0 -0
  209. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/assets/examples.webp +0 -0
  210. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/medium_tutorial.md +0 -0
  211. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/schemas/movie-handoff.schema.json +0 -0
  212. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/sonar-cleanup-tracker.md +0 -0
  213. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
  214. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +0 -0
  215. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +0 -0
  216. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +0 -0
  217. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +0 -0
  218. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +0 -0
  219. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +0 -0
  220. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +0 -0
  221. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +0 -0
  222. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +0 -0
  223. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-08-pr-triage-autopilot/PLAN.md +0 -0
  224. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-09-camoufox-adoption/PLAN.md +0 -0
  225. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-14-storyboarding-and-visual-curation/PLAN.md +0 -0
  226. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-18-asset-tagging/PLAN.md +0 -0
  227. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-19-live-verify/PLAN.md +0 -0
  228. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-19-production-readiness-browser-lifecycle.md +0 -0
  229. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-19-production-readiness-driver-cdp-verification.md +0 -0
  230. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-19-production-readiness-public-truth.md +0 -0
  231. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-19-production-readiness-queue-safety.md +0 -0
  232. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-26-character-prompt-polishing/PLAN.md +0 -0
  233. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-26-project-name-management/PLAN.md +0 -0
  234. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-26-self-documenting-errors/PLAN.md +0 -0
  235. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-27-overlay-banner-dismissal/PLAN.md +0 -0
  236. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/PLAN.md +0 -0
  237. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/SCENARIO.md +0 -0
  238. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-04-mcp-tasks/PLAN.md +0 -0
  239. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-04-output-hardening/PLAN.md +0 -0
  240. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-05-issue-317-intra-batch-references/PLAN.md +0 -0
  241. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-05-issue-317-intra-batch-references/SCENARIO.md +0 -0
  242. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-05-issue-402-entity-provenance/PLAN.md +0 -0
  243. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-05-issue-402-entity-provenance/SCENARIO.md +0 -0
  244. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-05-issue-451-duration-tab-drift/PLAN.md +0 -0
  245. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-05-issue-451-duration-tab-drift/SCENARIO.md +0 -0
  246. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-06-driver-delay-jittering/PLAN.md +0 -0
  247. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-06-driver-delay-jittering/SCENARIO.md +0 -0
  248. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-06-overlay-changelog-watermark/PLAN.md +0 -0
  249. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-06-overlay-changelog-watermark/SCENARIO.md +0 -0
  250. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-06-ui-mode-policy/PLAN.md +0 -0
  251. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-06-ui-mode-policy/SCENARIO.md +0 -0
  252. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-14-video-ui-mode-policy/PLAN.md +0 -0
  253. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-14-video-ui-mode-policy/SCENARIO.md +0 -0
  254. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/research/2026-06-27-tool-abstraction-evaluation.md +0 -0
  255. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/specs/2026-06-29-issue-assessment-workflow-design.md +0 -0
  256. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/specs/2026-07-04-pr-triage-autopilot-design.md +0 -0
  257. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/specs/2026-07-18-asset-tagging-design.md +0 -0
  258. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/specs/2026-07-19-live-verify-design.md +0 -0
  259. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/specs/2026-07-19-production-readiness-hardening-design.md +0 -0
  260. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/spikes/2026-07-09-camoufox-waf-403.md +0 -0
  261. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/spikes/2026-07-12-ui-cohort-backend-config.md +0 -0
  262. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/spikes/2026-07-17-production-readiness-assessment.md +0 -0
  263. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/spikes/2026-08-01-mcp-2026-07-28-spec-impact.md +0 -0
  264. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/spikes/2026-08-14-video-model-capability-matrix.md +0 -0
  265. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/spikes/2026-08-15-picker-tile-alt-text.md +0 -0
  266. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/eval/pr_triage_eval.py +0 -0
  267. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/eval/pr_triage_fixtures.json +0 -0
  268. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/examples/README.md +0 -0
  269. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/examples/batch_from_config.py +0 -0
  270. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/examples/multi_prompt_t2i.py +0 -0
  271. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/examples/sample_config.json +0 -0
  272. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/examples/sample_prompts.txt +0 -0
  273. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/examples/single_image_t2i.py +0 -0
  274. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/examples/workflow_chain.py +0 -0
  275. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/index.html +0 -0
  276. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/llms.txt +0 -0
  277. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/samples/README.md +0 -0
  278. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/samples/captured/01_upload_image.json +0 -0
  279. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
  280. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
  281. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/samples/captured/04_archive_workflow.json +0 -0
  282. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/samples/captured/05_createProject.json +0 -0
  283. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/samples/captured/06_batchGenerateImages.json +0 -0
  284. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
  285. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
  286. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
  287. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
  288. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
  289. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/samples/captured/12_create_scene.json +0 -0
  290. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
  291. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/samples/captured/14_get_scene_workflows.json +0 -0
  292. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
  293. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/autopilot/pr_triage_gate.py +0 -0
  294. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/ci/check_doc_links.py +0 -0
  295. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/ci/check_materiality.py +0 -0
  296. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/ci/check_release_artifacts.py +0 -0
  297. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/ci/check_test_count.py +0 -0
  298. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/ci/check_website_docs_pii.py +0 -0
  299. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/ci/generate_website_docs.py +0 -0
  300. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/debug_editor.py +0 -0
  301. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/debug_gen_settings.py +0 -0
  302. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/debug_settings.py +0 -0
  303. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/_recording_client.py +0 -0
  304. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/_spike_common.py +0 -0
  305. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/active_plan.py +0 -0
  306. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/analyze_agent_ui_capture.py +0 -0
  307. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/capture_frames_mode_trigger_ligature.py +0 -0
  308. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
  309. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
  310. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
  311. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
  312. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
  313. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/capture_locale_invariants.py +0 -0
  314. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/capture_lower_priority_model_cost.py +0 -0
  315. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/capture_project_listing.py +0 -0
  316. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/capture_r2v_ingredient_lifecycle.py +0 -0
  317. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/capture_sidebar_state_dom.py +0 -0
  318. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/capture_video_model_capability_matrix.py +0 -0
  319. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
  320. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/character_create_spike.py +0 -0
  321. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/character_create_spike_v2.py +0 -0
  322. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/dump_character_selectors.js +0 -0
  323. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/incident_bundle_quality.py +0 -0
  324. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/live_verify_mcp_tasks.py +0 -0
  325. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/make_project.py +0 -0
  326. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/materiality_backtest.py +0 -0
  327. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/patch_character.py +0 -0
  328. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/skillopt/README.md +0 -0
  329. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/skillopt/harness.py +0 -0
  330. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/skillopt/tasks.json +0 -0
  331. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/sonar-local-scan.sh +0 -0
  332. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/sonar-pre-push-gate.sh +0 -0
  333. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_char_editor_dom.py +0 -0
  334. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_char_gen_capture.py +0 -0
  335. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_character_prompt_format.py +0 -0
  336. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
  337. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
  338. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
  339. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
  340. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_incident_live.py +0 -0
  341. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
  342. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
  343. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_issue313_agent_mode_controls.py +0 -0
  344. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_issue314_picker_filename_search.py +0 -0
  345. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_issue404_count_tabs_recon.py +0 -0
  346. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_mode_roundtrip.py +0 -0
  347. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_mode_switch_agentic_to_classic.py +0 -0
  348. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
  349. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
  350. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
  351. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_movie_picker_select.py +0 -0
  352. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_movie_voice_list.py +0 -0
  353. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_omni_flash_i2v_ui_recon.py +0 -0
  354. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_patch_entity.py +0 -0
  355. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_patchright.py +0 -0
  356. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/diag/capture_flow_traffic.py +0 -0
  357. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/diag/memory_profile.py +0 -0
  358. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/diag/recaptcha_mint.py +0 -0
  359. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/diag/spike_387_openai_compat.py +0 -0
  360. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
  361. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/e2e/capture_agent_toggle.py +0 -0
  362. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/record_demo.ps1 +0 -0
  363. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/smoke_image.py +0 -0
  364. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/smoke_video_editor.py +0 -0
  365. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/smoke_worker_style.py +0 -0
  366. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/spike_waf_camoufox.py +0 -0
  367. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/verify_chrome_auth_viability.py +0 -0
  368. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/skills/README.md +0 -0
  369. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/skills/changelog/SKILL.md +0 -0
  370. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/skills/check/SKILL.md +0 -0
  371. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/skills/doc-review/SKILL.md +0 -0
  372. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/skills/gflow-cli/SKILL.md +0 -0
  373. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/skills/issue-assessment/SKILL.md +0 -0
  374. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/skills/issue-resolve/SKILL.md +0 -0
  375. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/skills/known-issues/SKILL.md +0 -0
  376. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/skills/live-verify/SKILL.md +0 -0
  377. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/skills/llm-council/SKILL.md +0 -0
  378. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/skills/plan/SKILL.md +0 -0
  379. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/skills/pr-council-review/SKILL.md +0 -0
  380. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/skills/predict/SKILL.md +0 -0
  381. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/skills/release/SKILL.md +0 -0
  382. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/skills/scenario/SKILL.md +0 -0
  383. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/skills/sonar/SKILL.md +0 -0
  384. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/skills/status/SKILL.md +0 -0
  385. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/sonar-project.properties +0 -0
  386. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/__main__.py +0 -0
  387. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/_cli_helpers.py +0 -0
  388. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/__init__.py +0 -0
  389. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/_engine.py +0 -0
  390. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/_retry.py +0 -0
  391. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
  392. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/character.py +0 -0
  393. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/dto.py +0 -0
  394. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/image.py +0 -0
  395. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/image_upscale.py +0 -0
  396. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/recaptcha.py +0 -0
  397. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/routes.py +0 -0
  398. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/scene.py +0 -0
  399. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/__init__.py +0 -0
  400. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
  401. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
  402. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/drivers/agentic.py +0 -0
  403. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/drivers/base.py +0 -0
  404. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/drivers/classic.py +0 -0
  405. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/drivers/factory.py +0 -0
  406. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
  407. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
  408. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
  409. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
  410. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/mode_control.py +0 -0
  411. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/video.py +0 -0
  412. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/auth/__init__.py +0 -0
  413. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/auth/base.py +0 -0
  414. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/auth/cookies.py +0 -0
  415. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/auth/factory.py +0 -0
  416. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
  417. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/auth/real_chrome.py +0 -0
  418. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/auth/strategies.py +0 -0
  419. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/auth/verification.py +0 -0
  420. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/browser_manager.py +0 -0
  421. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/chain.py +0 -0
  422. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/chain_manifest.py +0 -0
  423. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/cli.py +0 -0
  424. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/cli_character.py +0 -0
  425. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/cli_data.py +0 -0
  426. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/cli_doctor.py +0 -0
  427. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/cli_image.py +0 -0
  428. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/cli_instructions.py +0 -0
  429. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/cli_models.py +0 -0
  430. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/cli_movie.py +0 -0
  431. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/cli_project.py +0 -0
  432. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/cli_run.py +0 -0
  433. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/cli_scene.py +0 -0
  434. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/cli_tools.py +0 -0
  435. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/cli_video.py +0 -0
  436. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/composition.py +0 -0
  437. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/config.py +0 -0
  438. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/__init__.py +0 -0
  439. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/chain_repo.py +0 -0
  440. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
  441. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
  442. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
  443. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
  444. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
  445. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
  446. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/migrations/0007_queue.sql +0 -0
  447. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/migrations/0008_add_operation_expanded_prompt.sql +0 -0
  448. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/migrations/0009_queue_claims.sql +0 -0
  449. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
  450. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/models.py +0 -0
  451. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/queries.py +0 -0
  452. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/recorder.py +0 -0
  453. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/redaction.py +0 -0
  454. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/repository.py +0 -0
  455. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/store.py +0 -0
  456. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/exceptions.py +0 -0
  457. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/file_integrity.py +0 -0
  458. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/image_batch.py +0 -0
  459. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/json_output.py +0 -0
  460. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/mcp/__init__.py +0 -0
  461. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/mcp/prompts.py +0 -0
  462. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/mcp/resources.py +0 -0
  463. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/mcp/server.py +0 -0
  464. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/mcp/setup.py +0 -0
  465. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/mcp/tasks_extension.py +0 -0
  466. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/mcp/tools.py +0 -0
  467. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/media.py +0 -0
  468. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/movie_manifest.py +0 -0
  469. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/observability.py +0 -0
  470. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/paths.py +0 -0
  471. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/profile_lease.py +0 -0
  472. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/profile_store.py +0 -0
  473. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/redaction.py +0 -0
  474. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/services/__init__.py +0 -0
  475. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/services/catalog_sync.py +0 -0
  476. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/services/character_create.py +0 -0
  477. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/services/doctor.py +0 -0
  478. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/services/mentions.py +0 -0
  479. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/storage.py +0 -0
  480. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/__init__.py +0 -0
  481. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/banned.py +0 -0
  482. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/builtin/__init__.py +0 -0
  483. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/builtin/creative-director.toml +0 -0
  484. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/builtin/reverse-engineer.toml +0 -0
  485. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/builtin/storyboard.toml +0 -0
  486. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/expander.py +0 -0
  487. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/invocation.py +0 -0
  488. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/loader.py +0 -0
  489. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/registry.py +0 -0
  490. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/runtime.py +0 -0
  491. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/spec.py +0 -0
  492. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/ui/app.py +0 -0
  493. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/ui/server.py +0 -0
  494. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/update_check.py +0 -0
  495. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/winsec.py +0 -0
  496. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/worker/codec.py +0 -0
  497. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/worker/daemon.py +0 -0
  498. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/worker/queue.py +0 -0
  499. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tasks/lessons.md +0 -0
  500. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/test_assets/sample_batch.json +0 -0
  501. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/test_assets/sample_batch.tsv +0 -0
  502. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/test_assets/sample_batch_invalid.tsv +0 -0
  503. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/__init__.py +0 -0
  504. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/__init__.py +0 -0
  505. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/fixtures/character_gen_response.json +0 -0
  506. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/fixtures/patch_entity_response.json +0 -0
  507. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_aisandbox_auth_error.py +0 -0
  508. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
  509. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_bearer_redaction.py +0 -0
  510. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_character.py +0 -0
  511. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_client.py +0 -0
  512. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_client_character.py +0 -0
  513. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_client_delete_characters.py +0 -0
  514. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_client_errors.py +0 -0
  515. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_client_generate_character.py +0 -0
  516. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_client_image.py +0 -0
  517. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_client_incidents.py +0 -0
  518. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_client_launch_kwargs.py +0 -0
  519. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_client_patch_entity.py +0 -0
  520. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_client_scene.py +0 -0
  521. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_client_upscale.py +0 -0
  522. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_concurrency.py +0 -0
  523. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_dto.py +0 -0
  524. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_engine.py +0 -0
  525. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_image.py +0 -0
  526. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_image_dto.py +0 -0
  527. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_image_upscale.py +0 -0
  528. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_recaptcha.py +0 -0
  529. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_retry.py +0 -0
  530. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_routes.py +0 -0
  531. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_routes_character.py +0 -0
  532. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_routes_scene.py +0 -0
  533. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_sapisidhash_helper.py +0 -0
  534. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_scene_models.py +0 -0
  535. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_video.py +0 -0
  536. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_video_request.py +0 -0
  537. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/__init__.py +0 -0
  538. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/conftest.py +0 -0
  539. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/drivers/__init__.py +0 -0
  540. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/drivers/test_agentic.py +0 -0
  541. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/drivers/test_classic.py +0 -0
  542. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/drivers/test_factory.py +0 -0
  543. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/drivers/test_ui_mode.py +0 -0
  544. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/test_agentic_cohort_detection.py +0 -0
  545. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/test_base.py +0 -0
  546. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/test_bearer.py +0 -0
  547. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/test_common.py +0 -0
  548. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
  549. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/test_factory.py +0 -0
  550. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/test_fingerprint.py +0 -0
  551. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/test_mode_control.py +0 -0
  552. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/test_sapisidhash.py +0 -0
  553. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/test_selector_symmetry.py +0 -0
  554. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/test_transport_timeout.py +0 -0
  555. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
  556. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/test_ui_automation_video.py +0 -0
  557. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/test_ui_character_editor.py +0 -0
  558. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/auth/strategies/test_factory.py +0 -0
  559. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/auth/strategies/test_strategies.py +0 -0
  560. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/auth/test_cookies.py +0 -0
  561. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/auth/test_real_chrome.py +0 -0
  562. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/auth/test_verification.py +0 -0
  563. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/auth/test_windows_acl.py +0 -0
  564. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/__init__.py +0 -0
  565. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_auth_status.py +0 -0
  566. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_auth_list.py +0 -0
  567. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_character.py +0 -0
  568. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_character_create.py +0 -0
  569. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_data.py +0 -0
  570. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_data_errors.py +0 -0
  571. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_data_errors_retention.py +0 -0
  572. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_data_sync.py +0 -0
  573. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_doctor.py +0 -0
  574. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_image.py +0 -0
  575. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
  576. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_image_selector_drift.py +0 -0
  577. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_image_upscale.py +0 -0
  578. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_image_uuid_ref_enrichment.py +0 -0
  579. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_instructions.py +0 -0
  580. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_models.py +0 -0
  581. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_movie.py +0 -0
  582. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_run.py +0 -0
  583. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_scene.py +0 -0
  584. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_tools.py +0 -0
  585. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_video.py +0 -0
  586. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_video_chain.py +0 -0
  587. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_error_handling.py +0 -0
  588. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_failure_funnel.py +0 -0
  589. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_helpers.py +0 -0
  590. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_incident_output.py +0 -0
  591. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_movie_manifest.py +0 -0
  592. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_movie_manifest_style_variants.py +0 -0
  593. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_predictable_output.py +0 -0
  594. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_settings_validation.py +0 -0
  595. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
  596. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/composition/test_character.py +0 -0
  597. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/composition/test_compose_prompt.py +0 -0
  598. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/composition/test_handoff.py +0 -0
  599. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/composition/test_style_variants.py +0 -0
  600. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/composition/test_style_variants_e2e.py +0 -0
  601. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/data/__init__.py +0 -0
  602. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/data/test_chain_repo.py +0 -0
  603. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/data/test_failure_recording.py +0 -0
  604. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/data/test_find_incomplete_character.py +0 -0
  605. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/data/test_models.py +0 -0
  606. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/data/test_packaging.py +0 -0
  607. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/data/test_recorder.py +0 -0
  608. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/data/test_recorder_character.py +0 -0
  609. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/data/test_redaction.py +0 -0
  610. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/data/test_repository.py +0 -0
  611. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/data/test_scene_persistence.py +0 -0
  612. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/data/test_settings_and_errors.py +0 -0
  613. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/data/test_store.py +0 -0
  614. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/data/test_store_migrations.py +0 -0
  615. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/dev/test_recording_client.py +0 -0
  616. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/__init__.py +0 -0
  617. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/conftest.py +0 -0
  618. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_agentic_count_enforcement_e2e.py +0 -0
  619. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
  620. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_asset_tagging_e2e.py +0 -0
  621. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
  622. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_cancellation_e2e.py +0 -0
  623. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_chain_e2e.py +0 -0
  624. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_character_create_e2e.py +0 -0
  625. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_classic_count_setter_e2e.py +0 -0
  626. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_crash_recovery_e2e.py +0 -0
  627. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_daemon_e2e.py +0 -0
  628. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_data_layer_e2e.py +0 -0
  629. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_data_sync_names_e2e.py +0 -0
  630. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_entity_provenance_e2e.py +0 -0
  631. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_entity_smuggling_e2e.py +0 -0
  632. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_i2v_flags_e2e.py +0 -0
  633. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_image_batch_e2e.py +0 -0
  634. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
  635. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_image_uuid_ref_e2e.py +0 -0
  636. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_incident_quality_e2e.py +0 -0
  637. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_json_output_e2e.py +0 -0
  638. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_live_agentic_instructions.py +0 -0
  639. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
  640. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_project_naming_e2e.py +0 -0
  641. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_refresh_on_miss_e2e.py +0 -0
  642. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_scene_compose_live.py +0 -0
  643. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_sidebar_recovery_e2e.py +0 -0
  644. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_tools_e2e.py +0 -0
  645. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_transports_e2e.py +0 -0
  646. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
  647. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_video_r2v_uuid_name_e2e.py +0 -0
  648. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
  649. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/__init__.py +0 -0
  650. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/asset_tagging.feature +0 -0
  651. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/auth.feature +0 -0
  652. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/auth_login.feature +0 -0
  653. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/character_create.feature +0 -0
  654. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/character_read.feature +0 -0
  655. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/conftest.py +0 -0
  656. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/duration_tab_drift.feature +0 -0
  657. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/entity_provenance.feature +0 -0
  658. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/image.feature +0 -0
  659. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/image_batch_references.feature +0 -0
  660. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/image_upscale.feature +0 -0
  661. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/incident_diagnostics.feature +0 -0
  662. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/instructions.feature +0 -0
  663. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/locale_picker_include.feature +0 -0
  664. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/mcp_tasks.feature +0 -0
  665. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/media_picker_tiers.feature +0 -0
  666. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/output_hardening.feature +0 -0
  667. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/test_asset_tagging_steps.py +0 -0
  668. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/test_auth_login_steps.py +0 -0
  669. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/test_auth_steps.py +0 -0
  670. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/test_character_create_steps.py +0 -0
  671. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/test_character_read_steps.py +0 -0
  672. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/test_image_steps.py +0 -0
  673. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/test_image_upscale_steps.py +0 -0
  674. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/test_incident_diagnostics_steps.py +0 -0
  675. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/test_instructions_steps.py +0 -0
  676. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/test_locale_picker_include_steps.py +0 -0
  677. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/test_mcp_tasks_steps.py +0 -0
  678. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/test_media_picker_tiers_steps.py +0 -0
  679. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/test_output_hardening_steps.py +0 -0
  680. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/test_step_collision_guard.py +0 -0
  681. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/test_video_agent_ui_steps.py +0 -0
  682. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/test_video_chain_steps.py +0 -0
  683. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/video_agent_ui.feature +0 -0
  684. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/video_chain.feature +0 -0
  685. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/fixtures/__init__.py +0 -0
  686. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/fixtures/doctor_env.py +0 -0
  687. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/fixtures/listing_payload.py +0 -0
  688. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/fixtures/seeded_catalog.py +0 -0
  689. {gflow_cli-0.59.0/tests/image_batch → gflow_cli-0.60.0/tests/flow_selectors}/__init__.py +0 -0
  690. {gflow_cli-0.59.0/tests/integration → gflow_cli-0.60.0/tests/image_batch}/__init__.py +0 -0
  691. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/image_batch/test_image_manifest.py +0 -0
  692. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/image_batch/test_jitter_config.py +0 -0
  693. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/image_batch/test_observability_events.py +0 -0
  694. {gflow_cli-0.59.0/tests/services → gflow_cli-0.60.0/tests/integration}/__init__.py +0 -0
  695. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/integration/conftest.py +0 -0
  696. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/integration/constants.py +0 -0
  697. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/integration/test_expander_gateway.py +0 -0
  698. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/integration/test_storage_gcs.py +0 -0
  699. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/integration/test_storage_s3.py +0 -0
  700. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/mcp/__init__.py +0 -0
  701. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/mcp/conftest.py +0 -0
  702. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/mcp/test_auth_status_tool.py +0 -0
  703. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/mcp/test_cli_parity.py +0 -0
  704. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/mcp/test_error_funnel.py +0 -0
  705. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/mcp/test_http_transport.py +0 -0
  706. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/mcp/test_known_issues_resource.py +0 -0
  707. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/mcp/test_no_spend.py +0 -0
  708. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/mcp/test_rate_limit_envelope.py +0 -0
  709. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/mcp/test_resources.py +0 -0
  710. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/mcp/test_server.py +0 -0
  711. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/mcp/test_setup.py +0 -0
  712. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/mcp/test_stdio_transport.py +0 -0
  713. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/mcp/test_tasks_extension.py +0 -0
  714. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/mcp/test_tools_helpers.py +0 -0
  715. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/mcp/test_tools_instructions.py +0 -0
  716. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/mcp/test_tools_wired.py +0 -0
  717. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
  718. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
  719. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/scripts/test_check_materiality.py +0 -0
  720. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/scripts/test_check_release_artifacts.py +0 -0
  721. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/scripts/test_check_test_count.py +0 -0
  722. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/scripts/test_check_website_docs_pii.py +0 -0
  723. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/scripts/test_codex_plugin.py +0 -0
  724. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/scripts/test_generate_website_docs.py +0 -0
  725. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/scripts/test_incident_bundle_quality.py +0 -0
  726. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/scripts/test_materiality_backtest.py +0 -0
  727. {gflow_cli-0.59.0/tests/smoke → gflow_cli-0.60.0/tests/services}/__init__.py +0 -0
  728. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/services/test_catalog_sync.py +0 -0
  729. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/services/test_character_create_redaction.py +0 -0
  730. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/services/test_character_create_saga.py +0 -0
  731. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
  732. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/services/test_doctor.py +0 -0
  733. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/services/test_mentions_observability.py +0 -0
  734. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/services/test_mentions_parse.py +0 -0
  735. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/services/test_mentions_resolve.py +0 -0
  736. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/services/test_resolve_and_apply.py +0 -0
  737. {gflow_cli-0.59.0/tests/tools → gflow_cli-0.60.0/tests/smoke}/__init__.py +0 -0
  738. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/smoke/test_profile_account_smoke.py +0 -0
  739. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/smoke/test_real_flow.py +0 -0
  740. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_auth.py +0 -0
  741. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_browser_manager.py +0 -0
  742. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_chain.py +0 -0
  743. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_chain_manifest.py +0 -0
  744. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_cli_data.py +0 -0
  745. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_cli_project.py +0 -0
  746. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_config.py +0 -0
  747. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_conftest_isolation.py +0 -0
  748. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_data_queries.py +0 -0
  749. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_diagnostics_bundle.py +0 -0
  750. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_diagnostics_events.py +0 -0
  751. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_diagnostics_journal.py +0 -0
  752. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_diagnostics_recorder.py +0 -0
  753. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_diagnostics_retention.py +0 -0
  754. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_diagnostics_sanitize.py +0 -0
  755. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_documentation_gate.py +0 -0
  756. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_duration_tab_drift.py +0 -0
  757. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_entity_provenance.py +0 -0
  758. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_errors.py +0 -0
  759. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_image_batch_references.py +0 -0
  760. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_json_output.py +0 -0
  761. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_marker_registry.py +0 -0
  762. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_media.py +0 -0
  763. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_observability.py +0 -0
  764. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_overlay_banner_dismissal.py +0 -0
  765. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_paths.py +0 -0
  766. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_playwright_pin.py +0 -0
  767. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_profile_lease.py +0 -0
  768. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_profile_lease_subprocess.py +0 -0
  769. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_profile_store.py +0 -0
  770. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_smoke.py +0 -0
  771. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_update_check.py +0 -0
  772. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/tools/test_banned.py +0 -0
  773. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/tools/test_expander.py +0 -0
  774. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/tools/test_invocation.py +0 -0
  775. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/tools/test_loader.py +0 -0
  776. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/tools/test_registry.py +0 -0
  777. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/tools/test_runtime.py +0 -0
  778. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/tools/test_spec.py +0 -0
  779. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/ui/test_app.py +0 -0
  780. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/worker/test_codec.py +0 -0
  781. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/worker/test_daemon.py +0 -0
  782. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/worker/test_mcp_daemon_race.py +0 -0
  783. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/worker/test_queue.py +0 -0
  784. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/worker/test_queue_multiprocess.py +0 -0
  785. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/worker/test_queue_reconciliation.py +0 -0
  786. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/ARCHITECTURE.md +0 -0
  787. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/AUTHENTICATION.md +0 -0
  788. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/CHARACTER.md +0 -0
  789. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/CONFIGURATION.md +0 -0
  790. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/DATA_LAYER.md +0 -0
  791. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/DEBUGGING.md +0 -0
  792. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/DEVELOPMENT.md +0 -0
  793. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/EXTERNAL_STORAGE.md +0 -0
  794. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/INSTRUCTIONS.md +0 -0
  795. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/KNOWN_ISSUES.md +0 -0
  796. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/MCP.md +0 -0
  797. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/MEDIA_LIBRARY.md +0 -0
  798. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/MOVIE.md +0 -0
  799. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/PROMPT_EXPANSION.md +0 -0
  800. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/SECURITY.md +0 -0
  801. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/TOOLS.md +0 -0
  802. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/USAGE.md +0 -0
  803. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/USER_GUIDE.md +0 -0
  804. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/agents.md +0 -0
  805. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/index.md +0 -0
  806. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/installation.md +0 -0
  807. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/onboarding-mockup.html +0 -0
  808. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/onboarding.md +0 -0
  809. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/stylesheets/extra.css +0 -0
  810. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/mkdocs.yml +0 -0
  811. {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/requirements.in +0 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gflow",
3
- "version": "0.59.0",
3
+ "version": "0.60.0",
4
4
  "description": "Reusable development and operations workflows for gflow-cli",
5
5
  "author": {
6
6
  "name": "Flavio Oliva",
@@ -26,6 +26,7 @@ jobs:
26
26
  steps:
27
27
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
28
28
  with:
29
+ persist-credentials: false
29
30
  fetch-depth: 0 # full history so gitleaks can diff against base
30
31
 
31
32
  - name: Run gitleaks
@@ -39,8 +40,10 @@ jobs:
39
40
  runs-on: ubuntu-latest
40
41
  steps:
41
42
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
43
+ with:
44
+ persist-credentials: false
42
45
  - name: Install uv
43
- uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
46
+ uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
44
47
  - name: Audit locked dependencies for known CVEs
45
48
  # Fails the build on any known advisory. Accept later via: pip-audit --ignore-vuln <GHSA-id>
46
49
  #
@@ -57,6 +60,42 @@ jobs:
57
60
  # dependabot ecosystem — bump by hand when it drifts).
58
61
  uvx pip-audit==2.10.1 -r requirements-audit.txt
59
62
 
63
+ # ── Security gate: static analysis of the workflows themselves ───────────
64
+ # Everything else in this file audits the Python we ship. Nothing audited the
65
+ # CI that ships it, and CI is a supply-chain surface in its own right: it
66
+ # holds a repository token, it publishes to PyPI, and its inputs (branch
67
+ # names, PR titles, fork content) are attacker-controllable text.
68
+ #
69
+ # zizmor is what turns that into a gate. It found real defects on its first
70
+ # run over this repo (#565): 12 checkouts persisting the job token into the
71
+ # workspace, and `${{ github.base_ref }}` interpolated straight into a
72
+ # governance-advisory shell script. Both are fixed; this job is what stops
73
+ # them coming back one copy-pasted step at a time.
74
+ workflow-audit:
75
+ name: Workflow audit (zizmor)
76
+ runs-on: ubuntu-latest
77
+ steps:
78
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
79
+ with:
80
+ persist-credentials: false
81
+
82
+ - name: Install uv
83
+ uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
84
+
85
+ - name: Audit workflows (zizmor)
86
+ # --offline: the online audits need a GH token and reach the network, so
87
+ # they would make this gate non-deterministic and unrunnable on fork
88
+ # PRs. Action freshness/pinning is already covered by Dependabot plus
89
+ # Scorecard's Pinned-Dependencies check.
90
+ # --min-severity low: informational findings are advisory, not defects.
91
+ # The one open today is `superfluous-actions` on
92
+ # softprops/action-gh-release; rewriting the release publisher is not
93
+ # a hardening change and is deliberately declined (docs/GITHUB.md).
94
+ # Version pinned for a reproducible gate — uvx has no Dependabot
95
+ # ecosystem, so bump it by hand (the pin is asserted by
96
+ # tests/scripts/test_workflow_hardening.py, which fails if the two drift).
97
+ run: uvx zizmor==1.29.0 --offline --min-severity low .github/workflows/
98
+
60
99
  # ── Supply-chain gate: resolve WITHOUT the lockfile ───────────────────────
61
100
  # Every other job installs via `uv sync`, which honours uv.lock. That means CI
62
101
  # never exercises the version RANGES in pyproject.toml — the exact blind spot
@@ -73,9 +112,11 @@ jobs:
73
112
  runs-on: ubuntu-latest
74
113
  steps:
75
114
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
115
+ with:
116
+ persist-credentials: false
76
117
 
77
118
  - name: Install uv
78
- uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
119
+ uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
79
120
 
80
121
  - name: Set up Python
81
122
  run: uv python install 3.13
@@ -127,18 +168,24 @@ jobs:
127
168
  python-version: ["3.11", "3.12", "3.13"]
128
169
  steps:
129
170
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
171
+ with:
172
+ persist-credentials: false
130
173
 
131
174
  - name: Install uv
132
- uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
175
+ uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
133
176
 
134
177
  - name: Set up Python
135
178
  run: uv python install ${{ matrix.python-version }}
136
179
 
180
+ # --frozen: install from the committed uv.lock without re-resolving it.
181
+ # Plain `uv sync` REWRITES uv.lock in place, which would silently repair
182
+ # the exact version drift the hygiene gate below exists to catch.
137
183
  - name: Install deps
138
- run: uv sync --extra dev
184
+ run: uv sync --frozen --extra dev
139
185
 
140
- - name: Repo hygiene (no artefacts, no hardcoded paths)
141
- run: uv run python scripts/ci/check_repo_hygiene.py
186
+ # --no-sync for the same reason: `uv run` re-locks before running.
187
+ - name: Repo hygiene (no artefacts, no hardcoded paths, version lockstep)
188
+ run: uv run --no-sync python scripts/ci/check_repo_hygiene.py
142
189
 
143
190
  - name: Documentation links
144
191
  run: uv run python scripts/ci/check_doc_links.py
@@ -196,9 +243,11 @@ jobs:
196
243
  os: [windows-latest, macos-latest, ubuntu-latest]
197
244
  steps:
198
245
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
246
+ with:
247
+ persist-credentials: false
199
248
 
200
249
  - name: Install uv
201
- uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
250
+ uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
202
251
 
203
252
  - name: Set up Python
204
253
  run: uv python install 3.13
@@ -237,6 +286,7 @@ jobs:
237
286
  steps:
238
287
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
239
288
  with:
289
+ persist-credentials: false
240
290
  fetch-depth: 0 # shallow clones break blame / new-code detection
241
291
 
242
292
  - name: Download coverage report
@@ -29,9 +29,11 @@ jobs:
29
29
  runs-on: ubuntu-latest
30
30
  steps:
31
31
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
32
+ with:
33
+ persist-credentials: false
32
34
 
33
35
  - name: Install uv
34
- uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
36
+ uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
35
37
 
36
38
  - name: Set up Python
37
39
  run: uv python install 3.13
@@ -1,7 +1,15 @@
1
1
  name: External PR Triage
2
2
 
3
+ # `pull_request_target` is deliberate and is the reason this file is the
4
+ # highest-risk surface in the repo: labelling a fork's PR needs a token forks
5
+ # cannot be given, and `pull_request` does not have one. The trigger is only
6
+ # unsafe when the workflow CHECKS OUT or EXECUTES the untrusted head — this one
7
+ # never does: there is no `actions/checkout` step at all, every PR field is read
8
+ # from `context.payload` inside github-script, and permissions are scoped to
9
+ # `issues`/`pull-requests` write. Keep all three properties or drop the
10
+ # suppression with them.
3
11
  on:
4
- pull_request_target:
12
+ pull_request_target: # zizmor: ignore[dangerous-triggers]
5
13
  types: [opened, reopened, synchronize, ready_for_review, edited]
6
14
 
7
15
  permissions:
@@ -21,13 +21,21 @@ jobs:
21
21
  steps:
22
22
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
23
23
  with:
24
+ persist-credentials: false
24
25
  fetch-depth: 0 # full history so `git diff origin/<base>..HEAD` resolves
25
26
 
26
27
  - name: Install uv
27
- uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
28
+ uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
28
29
 
29
30
  - name: Classify touched paths (advisory, never blocks)
31
+ # BASE_REF arrives through `env:`, never interpolated into the script
32
+ # body: a branch name is attacker-supplied text, and `${{ ... }}` is
33
+ # substituted before the shell ever sees it (zizmor: template-injection).
34
+ # The fetch is belt-and-braces — `fetch-depth: 0` above already brings
35
+ # the base branch down — and needs no credential on a public repo.
36
+ env:
37
+ BASE_REF: ${{ github.base_ref }}
30
38
  run: |
31
- git fetch --no-tags origin "${{ github.base_ref }}" || true
39
+ git fetch --no-tags origin "$BASE_REF" || true
32
40
  uv run python scripts/ci/check_materiality.py \
33
- --base "origin/${{ github.base_ref }}"
41
+ --base "origin/$BASE_REF"
@@ -20,10 +20,11 @@ jobs:
20
20
  steps:
21
21
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
22
22
  with:
23
+ persist-credentials: false
23
24
  fetch-depth: 0 # full history — the backtest replays every commit
24
25
 
25
26
  - name: Install uv
26
- uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
27
+ uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
27
28
 
28
29
  - name: Run backtest (advisory; writes to job summary)
29
30
  run: uv run python scripts/dev/materiality_backtest.py >> "$GITHUB_STEP_SUMMARY"
@@ -31,6 +31,8 @@ jobs:
31
31
  runs-on: ubuntu-latest
32
32
  steps:
33
33
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
34
+ with:
35
+ persist-credentials: false
34
36
  - name: Verify release artifacts
35
37
  env:
36
38
  BASE_REF: ${{ github.base_ref }}
@@ -27,6 +27,8 @@ jobs:
27
27
  runs-on: ubuntu-latest
28
28
  steps:
29
29
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
30
+ with:
31
+ persist-credentials: false
30
32
  - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
31
33
  with:
32
34
  python-version: "3.12"
@@ -25,10 +25,17 @@ jobs:
25
25
  steps:
26
26
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
27
27
  with:
28
+ persist-credentials: false
28
29
  fetch-depth: 0
29
30
 
30
31
  - name: Install uv
31
- uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
32
+ uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
33
+ with:
34
+ # This is the one workflow that publishes artefacts (PyPI + GitHub
35
+ # Release), so it must not restore a cache any other workflow can
36
+ # write: a poisoned entry would reach a signed release. Releases are
37
+ # rare; the cold resolve costs seconds (zizmor: cache-poisoning).
38
+ enable-cache: false
32
39
 
33
40
  - name: Set up Python
34
41
  run: uv python install 3.12
@@ -47,6 +47,6 @@ jobs:
47
47
  retention-days: 5
48
48
 
49
49
  - name: Upload to code-scanning
50
- uses: github/codeql-action/upload-sarif@ff2f1c621b7f889edc0d3c761ac2e6a3f8cdb0dd # v4
50
+ uses: github/codeql-action/upload-sarif@db488ddef3bf6cb639b32c2e9a7c0a7ea8271d28 # v4
51
51
  with:
52
52
  sarif_file: results.sarif
@@ -0,0 +1,26 @@
1
+ name: Selector drift probe
2
+
3
+ on:
4
+ schedule:
5
+ - cron: "0 5 * * *"
6
+ workflow_dispatch:
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ probe:
13
+ runs-on: ubuntu-latest
14
+ timeout-minutes: 15
15
+ if: github.repository == 'ffroliva/gflow-cli'
16
+ steps:
17
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
18
+ with: { persist-credentials: false }
19
+ - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
20
+ - run: uv sync --frozen
21
+ - run: uv run playwright install chromium --with-deps
22
+ - name: Probe
23
+ env:
24
+ GFLOW_CI_SESSION_TOKEN: ${{ secrets.GFLOW_CI_SESSION_TOKEN }}
25
+ GFLOW_CI_PROJECT_ID: ${{ secrets.GFLOW_CI_PROJECT_ID }}
26
+ run: uv run python scripts/probe/run_probe.py --surface editor
@@ -7,6 +7,88 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.60.0] — 2026-08-25
11
+
12
+ ### Added
13
+
14
+ - **Selector registry + nightly CI drift probe
15
+ ([#404](https://github.com/ffroliva/gflow-cli/issues/404),
16
+ [#493](https://github.com/ffroliva/gflow-cli/issues/493),
17
+ [#313](https://github.com/ffroliva/gflow-cli/issues/313)).** New
18
+ `gflow_cli.flow_selectors` package: a structured, enumerable inventory of the
19
+ Flow DOM selectors gflow depends on (`Surface`, `Selector`) plus a pure
20
+ grader (`HIT` / `FALLBACK` / `AMBIGUOUS` / `MISS` / `EXPECTED_ABSENT`), so
21
+ selector drift is *named* rather than inferred from a failing test. A $0
22
+ probe (`scripts/probe/run_probe.py`, driven by the `selector-probe` workflow
23
+ on `schedule` + `workflow_dispatch` only) walks the registry against a live
24
+ editor: navigate and read only, never generates. Exit 0 clean / 1 drift /
25
+ 2 inconclusive — an expired token or dead project is never published as
26
+ drift.
27
+
28
+ - **Incident bundles record what was submitted
29
+ ([#528](https://github.com/ffroliva/gflow-cli/issues/528)).**
30
+ `network.json` gains a `generation_requests` array carrying a counts-only
31
+ summary of each outgoing generation submit (body size, reference-entity
32
+ count, reference-field count). The reference shape that triggers a policy 400
33
+ was previously visible only in the stderr stream, so bundles attached to an
34
+ issue could not be diagnosed. Counts and booleans only — no key names, field
35
+ values, or prompt text — matching the existing §5.3 retention boundary.
36
+
37
+ ### Changed
38
+
39
+ - **All labs.google requests now carry `origin`/`referer`
40
+ ([#578](https://github.com/ffroliva/gflow-cli/pull/578)).** Header
41
+ construction moved into a single `_request_headers()` shared by
42
+ `_post_json`/`_patch_json`/`_get_json`, which previously assembled headers
43
+ inline three times and could diverge per verb. The labs lane now sends the
44
+ same `origin`/`referer` every other lane already sent. A live A/B against
45
+ `project.createProject` showed these headers are **not** required — an
46
+ origin-less mutation still returns 200 — so this is consistency and
47
+ defence-in-depth, not a fix for any observed failure.
48
+
49
+ ### Fixed
50
+
51
+ - **Content-policy 400s are no longer misclassified as `WireFormatError`
52
+ ([#528](https://github.com/ffroliva/gflow-cli/issues/528)).** An HTTP 400 from
53
+ `flowMedia:batchGenerateImages` or `batchAsyncGenerateVideo*` now raises
54
+ `ContentPolicyError` with remediation that names the levers that actually
55
+ work — reduce to a single face-bearing reference, replace age-explicit person
56
+ descriptors with relational or role nouns — and states outright that
57
+ shortening the prompt does not help. Previously these surfaced as "the
58
+ request was rejected as malformed… retry with a simpler prompt text", which
59
+ sends operators down a path that cannot succeed. Same defect shape as
60
+ [#379](https://github.com/ffroliva/gflow-cli/issues/379) (429), one status
61
+ over, and the self-documenting-errors goal of
62
+ [#380](https://github.com/ffroliva/gflow-cli/issues/380).
63
+ - **Video generation gained the 429 branch the image path got in #379.** A
64
+ quota hit on `batchAsyncGenerateVideo*` raised `WireFormatError` instead of
65
+ `RateLimitError`, losing `Retry-After` and the retryable classification.
66
+ - **`generate_images_batch` no longer reports a bare, remediation-free
67
+ `GFlowError`** when every response failed — it classifies the first error the
68
+ same way the single-prompt path does.
69
+
70
+ ### Security
71
+
72
+ - **CI/CD supply-chain hardening
73
+ ([#565](https://github.com/ffroliva/gflow-cli/issues/565)).** Every
74
+ `actions/checkout` step now sets `persist-credentials: false` (12 existing
75
+ steps fixed across `ci.yml`, `deps-watch.yml`, `governance-advisory.yml`,
76
+ `governance-benchmark.yml`, `main-base-guard.yml`, `pages.yml` and
77
+ `release.yml`); the default leaves the job token in `.git/config` for the rest
78
+ of the job. No workflow needed it — releases publish over PyPI Trusted
79
+ Publishing (OIDC) and Pages deploys over `actions/deploy-pages`. A new
80
+ `workflow-audit` job runs [zizmor](https://github.com/zizmorcore/zizmor)
81
+ (pinned, `--offline`) over `.github/workflows/` on every push and PR, so the
82
+ class cannot come back. Its first run also caught two defects the manual pass
83
+ missed: `${{ github.base_ref }}` interpolated directly into a
84
+ `governance-advisory.yml` shell script (template injection — the value now
85
+ arrives through `env:`), and a shared uv cache restored by the publishing
86
+ release job (cache poisoning — caching is now off there). The
87
+ `pull_request_target` trigger in `external-pr-triage.yml` is suppressed inline
88
+ with its rationale, and a changelog-guard workflow was evaluated and declined
89
+ — both decisions recorded in
90
+ [docs/GITHUB.md § Workflow Security Gates](docs/GITHUB.md#workflow-security-gates).
91
+
10
92
  ## [0.59.0] — 2026-08-16
11
93
 
12
94
  ### Added
@@ -3073,7 +3155,8 @@ shell-script template that branches on these codes.
3073
3155
 
3074
3156
  First skeleton. Not functional end-to-end yet.
3075
3157
 
3076
- [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.59.0...HEAD
3158
+ [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.60.0...HEAD
3159
+ [0.60.0]: https://github.com/ffroliva/gflow-cli/compare/v0.59.0...v0.60.0
3077
3160
  [0.59.0]: https://github.com/ffroliva/gflow-cli/compare/v0.58.0...v0.59.0
3078
3161
  [0.58.0]: https://github.com/ffroliva/gflow-cli/compare/v0.57.1...v0.58.0
3079
3162
  [0.57.1]: https://github.com/ffroliva/gflow-cli/compare/v0.57.0...v0.57.1
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: gflow-cli
3
- Version: 0.59.0
3
+ Version: 0.60.0
4
4
  Summary: Unofficial CLI for Google Flow — drive Veo image-to-video generations from the terminal.
5
5
  Project-URL: Homepage, https://github.com/ffroliva/gflow-cli
6
6
  Project-URL: Issues, https://github.com/ffroliva/gflow-cli/issues
@@ -58,7 +58,7 @@ Requires-Dist: numpy>=1.24; extra == 'dev'
58
58
  Requires-Dist: pyright>=1.1.0; extra == 'dev'
59
59
  Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
60
60
  Requires-Dist: pytest>=8.0.0; extra == 'dev'
61
- Requires-Dist: ruff==0.16.2; extra == 'dev'
61
+ Requires-Dist: ruff==0.16.4; extra == 'dev'
62
62
  Provides-Extra: gcs
63
63
  Requires-Dist: gcsfs>=2024.2.0; extra == 'gcs'
64
64
  Requires-Dist: universal-pathlib>=0.2.5; extra == 'gcs'
@@ -16,6 +16,8 @@ The autopilot orchestrator (`scripts/autopilot/pr_triage_autopilot.py`) runs as
16
16
  | `TELEGRAM_USER_ID` | Autopilot orchestrator (host) | The chat ID to receive triage alert messages. |
17
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
18
  | `HERMES_OPS_DIR` | Autopilot orchestrator (host), optional | Location of the hermes-ops checkout hosting the Resend email notifier. Default `/opt/hermes-ops`. |
19
+ | `GH_SANDBOX_TOKEN` | Review **container** | Fine-grained **read-only** PAT for the repo under review. The container only reads the PR; the host posts the comment. If unset the orchestrator falls back and raises an alert rather than degrading silently. Stored in the SOPS secret store. |
20
+ | `GFLOW_TRIAGE_MEMORY_DIR` | Autopilot orchestrator (host), optional | Council memory directory mounted read-only for D5. Set it only to override the XDG default (`$XDG_DATA_HOME/gflow-cli/memory`, i.e. `~/.local/share/gflow-cli/memory`). **Never put a machine-specific path in the cron line** — see §2. |
19
21
  | `RESEND_API_KEY` | Email notifier (hermes-ops) | Resend API key consumed by `$HERMES_OPS_DIR/scripts/notify/email_notify.py`. |
20
22
  | `HERMES_NOTIFY_EMAIL_TO` | Email notifier (hermes-ops) | Recipient address for high-signal triage emails. |
21
23
  | `HERMES_NOTIFY_EMAIL_FROM` | Email notifier (hermes-ops) | Verified sender address for the Resend account. |
@@ -28,8 +30,19 @@ The autopilot orchestrator (`scripts/autopilot/pr_triage_autopilot.py`) runs as
28
30
 
29
31
  Deploy the following layout on the VPS:
30
32
  - `/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
+ - `~hermes/.local/share/gflow-cli/memory`: Council memory namespace, mounted read-only into the sandbox for dimension D5.
34
+
35
+ Create the memory directory once, as the user the cron runs under:
36
+
37
+ ```bash
38
+ sudo -u hermes mkdir -p ~hermes/.local/share/gflow-cli/memory
39
+ ```
40
+
41
+ An **empty** directory is a valid deployment — D5 then reports that no memory is available, and the other 13 dimensions run normally. Populate it only if you want the council to consult durable project memory.
42
+
43
+ > **The memory path is resolved by the orchestrator, never hardcoded.** Precedence is `--memory-dir` > `$GFLOW_TRIAGE_MEMORY_DIR` > `$XDG_DATA_HOME/gflow-cli/memory` (XDG default, falling back to `~/.local/share`). `XDG_DATA_HOME` is the correct slot per the XDG Base Directory Specification: council memory is durable knowledge that should be backed up, not regenerable cache or throwaway state.
44
+ >
45
+ > The orchestrator validates the resolved path on the host and refuses to start with an actionable error if it is missing, rather than failing later inside the container.
33
46
 
34
47
  ---
35
48
 
@@ -51,7 +64,7 @@ Ensure `iptables` is installed on the host VPS. If `iptables` permissions are wi
51
64
  Configure a cron job checking every hour on the hour under the `hermes` system user:
52
65
 
53
66
  ```cron
54
- 0 * * * * set -a; . /opt/hermes/.env 2>/dev/null; set +a; 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
67
+ 0 * * * * set -a; . /opt/hermes/.env 2>/dev/null; set +a; cd /opt/gflow-cli && uv run python scripts/autopilot/pr_triage_autopilot.py --repo-dir /opt/gflow-cli >> /var/log/hermes/pr_triage.log 2>&1
55
68
  ```
56
69
 
57
70
  Sourcing `/opt/hermes/.env` first (`set -a` exports everything it defines) is what delivers `GH_COMMENT_TOKEN`, `TELEGRAM_*`, and the `RESEND_API_KEY` / `HERMES_NOTIFY_EMAIL_*` vars to the process. Without it the email channel silently disables itself, and without `GH_COMMENT_TOKEN` the run exits 1.
@@ -83,6 +96,17 @@ Do **NOT** register the orchestrator directly via `hermes cron create --script p
83
96
  - **(a) Plain crontab** — the line above, under the `hermes` system user.
84
97
  - **(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`.
85
98
 
99
+ ### Log rotation
100
+
101
+ `pr_triage.log` grows without bound otherwise. Install once, as root:
102
+
103
+ ```bash
104
+ install -m 644 /opt/gflow-cli/deploy/logrotate-pr-triage /etc/logrotate.d/pr-triage
105
+ logrotate --debug /etc/logrotate.d/pr-triage # dry-run
106
+ ```
107
+
108
+ Scoped to `pr_triage.log` alone — the rest of `/var/log/hermes/` belongs to hermes-ops, and two packages rotating one glob is how logs get silently truncated.
109
+
86
110
  ### Check Logs & Status
87
111
  - **Log Location**: `/var/log/hermes/pr_triage.log`
88
112
  - **Triage Ledger**: `/opt/gflow-cli/pr_triage_ledger.jsonl` tracks verdicts and failure states.
@@ -110,5 +134,5 @@ If a PR enters the `FAILED_PERMANENT` state in `pr_triage_ledger.jsonl` due to 3
110
134
  2. Fix the underlying environmental or syntax issue.
111
135
  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:
112
136
  ```bash
113
- 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
137
+ uv run python scripts/autopilot/pr_triage_autopilot.py --repo-dir /opt/gflow-cli
114
138
  ```
@@ -0,0 +1,21 @@
1
+ # logrotate config for the PR-Triage Autopilot log.
2
+ #
3
+ # Install on the VPS as root:
4
+ # install -m 644 /opt/gflow-cli/deploy/logrotate-pr-triage /etc/logrotate.d/pr-triage
5
+ # logrotate --debug /etc/logrotate.d/pr-triage # dry-run to verify
6
+ #
7
+ # Scoped to pr_triage.log alone, not /var/log/hermes/*.log: the rest of that
8
+ # directory belongs to hermes-ops, and two packages rotating the same glob is
9
+ # how you get silently truncated logs.
10
+ /var/log/hermes/pr_triage.log {
11
+ weekly
12
+ rotate 8
13
+ compress
14
+ delaycompress
15
+ missingok
16
+ notifempty
17
+ # The hourly cron reopens the file on each tick, but copytruncate keeps
18
+ # rotation safe if the orchestrator is ever run as a long-lived process.
19
+ copytruncate
20
+ su hermes hermes
21
+ }
@@ -149,6 +149,165 @@ See [DEVELOPMENT.md § E2e gate](DEVELOPMENT.md#e2e-gate-before-merging-develop-
149
149
 
150
150
  ---
151
151
 
152
+ ## Nightly canary (#502)
153
+
154
+ Between releases the live tiers are invisible, so Flow-side drift (cohort flaps,
155
+ selector renames, auth rot) surfaces ad-hoc during feature work instead of on a
156
+ schedule. The canary closes that gap.
157
+
158
+ It runs **locally, not in hosted CI** — the live tiers need a real authenticated
159
+ Chrome profile, and Google bot-detection plus reCAPTCHA make hosted auth
160
+ infeasible. Results are published to a single **rolling issue**; the canary never
161
+ opens new ones (issue spam trains red-blindness) and **gates nothing** (a gate on
162
+ a machine that might be off is self-DoS).
163
+
164
+ ### Four states
165
+
166
+ | State | Meaning | Action |
167
+ |---|---|---|
168
+ | `GREEN` | every selected $0 tier passed | none |
169
+ | `RED` | auth healthy, a $0 tier failed | **real drift or regression** — triage |
170
+ | `AUTH-EXPIRED` | session rot (expected) | `gflow auth login` |
171
+ | `DEFERRED` | nothing conclusive ran | fix the profile / config — says nothing about Flow |
172
+
173
+ Splitting the last two out of `RED` is the point: `RED` must always mean "code or
174
+ Flow drifted", never "please re-login" or "you had Chrome open". The classifier is
175
+ a pure function with all four states covered in
176
+ `tests/scripts/test_canary_classify.py`.
177
+
178
+ **Rot vs. drift is decided by a second probe, not by error names.** When a tier
179
+ fails for a reason other than a profile precondition, the canary re-runs
180
+ `gflow auth status`. Session still valid ⇒ the failure is
181
+ drift (`RED`); session now dead ⇒ genuine rot (`AUTH-EXPIRED`). The first live run
182
+ proved why this matters: an `AuthExpiredError` on `project.createProject`
183
+ *looked* exactly like session rot, but the session verified clean seconds later —
184
+ so it was a real divergence between two auth surfaces, and a name-matching
185
+ classifier would have buried it. The extra probe costs ~45s and only runs after a
186
+ failure.
187
+
188
+ > The route is `labs.google/fx/api/trpc/project.createProject` — the NextAuth
189
+ > **cookie** surface — not the aisandbox Bearer path. #561 originally recorded it
190
+ > as an `uploadImage` failure because the failing test is named for an upload;
191
+ > the traceback dies one line earlier, on the project-creation call. Corrected
192
+ > here so the next reader does not re-investigate the wrong host.
193
+
194
+ `DEFERRED` covers every run that **exercised nothing**: a held `ProfileLease`, a
195
+ `ProfileEngineDowngradeError` (profile written by a newer Chromium than the bundled
196
+ engine), a refused `--pull`, or a run where every selected test skipped. All fail
197
+ before reaching Flow, so none can evidence drift.
198
+
199
+ Two subtleties, both found by council review and both regression-tested:
200
+
201
+ - **A precondition is matched on the raised exception, never a substring.** Two
202
+ `e2e_auth` tests mention `ProfileLockedError` in ordinary source — one in an
203
+ assertion message, one in a comment — and pytest echoes the failing function's
204
+ source into its traceback. Substring matching therefore published a genuine
205
+ regression in those tests as `DEFERRED`, the one label that says "ignore me".
206
+ - **A green run that executed nothing is not green.** pytest exits 0 when every
207
+ test skips, and every e2e test skips on a missing profile directory. `GREEN`
208
+ requires `passed > 0`.
209
+
210
+ Because the issue carries a last-updated timestamp, a machine that was off is
211
+ *visibly stale* — unlike a lingering green commit status, which lies.
212
+
213
+ **A RED preserves its own evidence, logs included.** The run's JUnit is copied to
214
+ `tmp/canary-red-<stamp>.xml` (the live one is overwritten nightly), and pytest runs
215
+ with `-o junit_logging=all` so that copy carries the captured structlog output, not
216
+ just a traceback. This is not optional detail: the canary's failures reproduce only
217
+ unattended, so whatever the run does not record cannot be recovered afterwards. For
218
+ an auth 401 the deciding line is `client.context_cookie_state` — the #222
219
+ diagnostic, which reports whether the launched browser context actually loaded the
220
+ Flow session cookie. That single boolean separates "the browser never got the
221
+ cookie" from "the session was genuinely refused"; without it a 401 traceback is the
222
+ same shape either way. The copy stays **local** — it carries raw tracebacks and
223
+ profile paths, which the sanitization contract keeps off the public issue.
224
+
225
+ ### Scope
226
+
227
+ `-m e2e_auth` only ($0, no reCAPTCHA); fast-follow adds `e2e_scene` ($0). Credit
228
+ tiers (`e2e_image` / `e2e_video` / `smoke`) stay **strictly manual** via
229
+ `/gflow:live-verify` — no unattended credit spend on a personal account.
230
+
231
+ ### Run it
232
+
233
+ ```bash
234
+ # dry run — executes for real, prints the payload, touches nothing on GitHub
235
+ uv run python scripts/canary/run_canary.py --profile <name> --dry-run
236
+ ```
237
+
238
+ Credit-spending markers (`e2e_image`, `e2e_video`, `e2e_batch`, `e2e_character`,
239
+ `smoke`) are **refused outright** — the canary never spends credits unattended.
240
+ Run those manually via `/gflow:live-verify`.
241
+
242
+ ### Schedule it
243
+
244
+ ```powershell
245
+ .\scripts\canary\register_task.ps1 -Profile <name> -Issue <n> `
246
+ -RepoRoot C:\path\to\dedicated\clone
247
+ ```
248
+
249
+ Point `-RepoRoot` at a **dedicated clone**, never your working tree: the runner's
250
+ `--pull` refuses a dirty checkout rather than resetting over uncommitted work, and
251
+ reports that refusal as `DEFERRED` rather than exiting silently. `--pull` also
252
+ re-syncs dependencies, so a lockfile bump on `develop` cannot masquerade as a
253
+ `RED` import error.
254
+
255
+ Publishing uses your already-authenticated local `gh` — **no new secrets or
256
+ tokens**. Published content is sanitized for a public repo: SHA, pass/fail
257
+ counts, duration, failure class, and failing test *names* only — never raw logs,
258
+ profile paths, prompts, or signed URLs.
259
+
260
+ ## Selector drift probe (#563)
261
+
262
+ The canary answers *"does gflow still work on the maintainer's cohort?"*; the
263
+ probe answers *"which Flow DOM selector moved?"* — from hosted CI, with no
264
+ maintainer machine involved. It walks the structured selector inventory in
265
+ `gflow_cli.flow_selectors` (the incident families from #404/#493/#313) against
266
+ a live editor at the pinned 1920×1080 viewport: navigate and read only, **$0**,
267
+ never submits.
268
+
269
+ Runs via `.github/workflows/selector-probe.yml` on `schedule` (05:00 UTC daily)
270
+ plus `workflow_dispatch`. **Never add a `pull_request` trigger**: same-repo
271
+ branch PRs receive repository secrets while running attacker-editable probe
272
+ code (fork PRs are safe — GitHub withholds secrets — but the same-repo case is
273
+ not).
274
+
275
+ ### Exit contract
276
+
277
+ | Exit | Meaning | Action |
278
+ |---|---|---|
279
+ | `0` | every registered selector resolved (`ok` / `FALLBACK[n]` / `n/a`) | none |
280
+ | `1` | **drift** — a selector graded MISS or AMBIGUOUS; the report names its key | re-derive that selector, ship a registry edit |
281
+ | `2` | **inconclusive** — expired token, dead project, known alternate UI state, or no recognizable editor arm | fix the credential/project; says nothing about Flow |
282
+
283
+ Keeping `1` and `2` apart is the whole design: an expired credential must never
284
+ be published as "Google changed the page". The deciding gate is a poll on
285
+ production's own arm indicators (the six `crop_*` variants ⇒ classic, the
286
+ agentic ligatures ⇒ agentic); a page showing neither within 25 s — a sign-in
287
+ wall renders neither — is inconclusive, not drift. Mode-scoped selectors absent
288
+ on the observed arm grade `n/a` (`EXPECTED_ABSENT`), never drift — the probe's
289
+ first two live runs landed on opposite arms (classic locally, agentic on the
290
+ runner) and both graded clean.
291
+
292
+ ### Secrets and token care
293
+
294
+ Two repository secrets, from a **dedicated throwaway Google account**, never
295
+ the maintainer's: `GFLOW_CI_SESSION_TOKEN` (the
296
+ `__Secure-next-auth.session-token` cookie) and `GFLOW_CI_PROJECT_ID` (any
297
+ project that account owns — a deleted id renders an error shell the probe
298
+ reports as exit 2).
299
+
300
+ The token **re-issues on every profile open** (observed live 2026-08-21: three
301
+ values in 15 minutes; the first CI dispatch failed exit 2 on a superseded
302
+ snapshot). Harvest accordingly: open the throwaway profile once, read the
303
+ cookie, close the browser, `gh secret set GFLOW_CI_SESSION_TOKEN` from stdin —
304
+ and never reopen that profile without re-syncing the secret afterwards. The
305
+ value also hard-dies at day 30 with no warning. Either way an aged token shows
306
+ as a red exit-2 run, never as drift, and the nightly schedule itself is the
307
+ aging test.
308
+
309
+ ---
310
+
152
311
  ## File map
153
312
 
154
313
  ```