gflow-cli 0.38.1__tar.gz → 0.40.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 (615) hide show
  1. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/AGENTS.md +1 -0
  2. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/CHANGELOG.md +60 -1
  3. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/CLAUDE.md +1 -0
  4. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/PKG-INFO +1 -1
  5. gflow_cli-0.40.0/docs/ASSET_TAGGING_RECON.md +203 -0
  6. {gflow_cli-0.38.1/website → gflow_cli-0.40.0}/docs/CHARACTER.md +25 -14
  7. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/DATA_LAYER.md +61 -2
  8. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/INDEX.md +7 -2
  9. gflow_cli-0.40.0/docs/LIVE_VERIFICATION_v0.39.0.md +70 -0
  10. gflow_cli-0.40.0/docs/LIVE_VERIFICATION_v0.40.0.md +96 -0
  11. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/PROJECT_STATUS.md +22 -1
  12. gflow_cli-0.40.0/docs/REFERENCE_STRATEGIES.md +113 -0
  13. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/USAGE.md +12 -0
  14. gflow_cli-0.40.0/docs/superpowers/plans/2026-07-18-asset-tagging/PLAN.md +306 -0
  15. gflow_cli-0.40.0/docs/superpowers/specs/2026-07-18-asset-tagging-design.md +202 -0
  16. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/pyproject.toml +1 -1
  17. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/ci/check_doc_links.py +2 -0
  18. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/__init__.py +1 -1
  19. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/api/transports/_common.py +25 -6
  20. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/api/transports/ui_automation_video.py +1 -1
  21. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/chain.py +47 -2
  22. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/cli_data.py +39 -0
  23. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/cli_image.py +84 -19
  24. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/cli_movie.py +29 -8
  25. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/cli_run.py +22 -10
  26. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/cli_video.py +71 -15
  27. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/data/queries.py +111 -1
  28. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/data/recorder.py +201 -9
  29. gflow_cli-0.40.0/src/gflow_cli/data/redaction.py +89 -0
  30. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/image_batch.py +56 -3
  31. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/mcp/tools.py +16 -2
  32. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/observability.py +10 -2
  33. gflow_cli-0.40.0/src/gflow_cli/services/mentions.py +415 -0
  34. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/worker/daemon.py +74 -14
  35. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/transports/test_common.py +20 -0
  36. gflow_cli-0.40.0/tests/cli/test_cli_data_errors.py +84 -0
  37. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/cli/test_cli_image.py +3 -2
  38. gflow_cli-0.40.0/tests/cli/test_failure_funnel.py +154 -0
  39. gflow_cli-0.40.0/tests/data/test_failure_recording.py +392 -0
  40. gflow_cli-0.40.0/tests/e2e/test_asset_tagging_e2e.py +160 -0
  41. gflow_cli-0.40.0/tests/features/asset_tagging.feature +39 -0
  42. gflow_cli-0.40.0/tests/features/test_asset_tagging_steps.py +283 -0
  43. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/features/test_image_steps.py +1 -0
  44. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/features/test_locale_picker_include_steps.py +1 -0
  45. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/mcp/test_cli_parity.py +1 -0
  46. gflow_cli-0.40.0/tests/services/test_mentions_observability.py +92 -0
  47. gflow_cli-0.40.0/tests/services/test_mentions_parse.py +92 -0
  48. gflow_cli-0.40.0/tests/services/test_mentions_resolve.py +242 -0
  49. gflow_cli-0.40.0/tests/services/test_resolve_and_apply.py +100 -0
  50. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/test_chain.py +36 -0
  51. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/test_data_queries.py +45 -0
  52. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/worker/test_daemon.py +38 -2
  53. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/uv.lock +1 -1
  54. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/website/docs/DATA_LAYER.md +57 -2
  55. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/website/docs/USAGE.md +14 -2
  56. gflow_cli-0.38.1/src/gflow_cli/data/redaction.py +0 -48
  57. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/.claude/README.md +0 -0
  58. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/.claude/commands/gflow/active.md +0 -0
  59. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/.claude/commands/gflow/branch-review.md +0 -0
  60. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/.claude/commands/gflow/changelog.md +0 -0
  61. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/.claude/commands/gflow/check.md +0 -0
  62. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/.claude/commands/gflow/doc-review.md +0 -0
  63. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/.claude/commands/gflow/issue-assessment.md +0 -0
  64. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/.claude/commands/gflow/issue-resolve.md +0 -0
  65. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/.claude/commands/gflow/known-issues.md +0 -0
  66. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/.claude/commands/gflow/llm-council.md +0 -0
  67. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/.claude/commands/gflow/next.md +0 -0
  68. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/.claude/commands/gflow/plan.md +0 -0
  69. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/.claude/commands/gflow/pr-council-review.md +0 -0
  70. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/.claude/commands/gflow/predict.md +0 -0
  71. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/.claude/commands/gflow/release.md +0 -0
  72. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/.claude/commands/gflow/scenario.md +0 -0
  73. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/.claude/commands/gflow/sonar.md +0 -0
  74. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/.claude/commands/gflow/status.md +0 -0
  75. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/.env.template +0 -0
  76. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/.gitattributes +0 -0
  77. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/.github/CODEOWNERS +0 -0
  78. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  79. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/.github/copilot-instructions.md +0 -0
  80. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/.github/dependabot.yml +0 -0
  81. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/.github/workflows/ci.yml +0 -0
  82. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/.github/workflows/external-pr-triage.yml +0 -0
  83. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/.github/workflows/governance-advisory.yml +0 -0
  84. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/.github/workflows/governance-benchmark.yml +0 -0
  85. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/.github/workflows/main-base-guard.yml +0 -0
  86. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/.github/workflows/pages.yml +0 -0
  87. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/.github/workflows/release.yml +0 -0
  88. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/.gitignore +0 -0
  89. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/.gitleaks.toml +0 -0
  90. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/.pre-commit-config.yaml +0 -0
  91. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/.secrets.baseline +0 -0
  92. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/CONFIGURATION.md +0 -0
  93. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/CONTRIBUTING.md +0 -0
  94. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/DISCLAIMER.md +0 -0
  95. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/GEMINI.md +0 -0
  96. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/KNOWN_ISSUES.md +0 -0
  97. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/LICENSE +0 -0
  98. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/PLAN.md +0 -0
  99. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/README.md +0 -0
  100. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/RELEASE.md +0 -0
  101. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/ROADMAP.md +0 -0
  102. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/conftest.py +0 -0
  103. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/deploy/PR-TRIAGE-AUTOPILOT-OPS.md +0 -0
  104. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docker-compose.yml +0 -0
  105. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/AGENT_GUIDE.md +0 -0
  106. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/AGENT_UI_E2E.md +0 -0
  107. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/AGENT_UI_RECON.md +0 -0
  108. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/ARCHITECTURE.md +0 -0
  109. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/AUTHENTICATION.md +0 -0
  110. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/CHARACTER_RECON.md +0 -0
  111. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/CONFIGURATION.md +0 -0
  112. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/DEBUGGING.md +0 -0
  113. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/DEMOS.md +0 -0
  114. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/DEVELOPMENT.md +0 -0
  115. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/E2E_TESTING.md +0 -0
  116. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/EXTERNAL_STORAGE.md +0 -0
  117. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/GITHUB.md +0 -0
  118. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
  119. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
  120. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/INSTRUCTIONS.md +0 -0
  121. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
  122. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
  123. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
  124. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
  125. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
  126. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
  127. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
  128. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
  129. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
  130. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
  131. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
  132. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
  133. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_v0.21.0.md +0 -0
  134. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_v0.22.0.md +0 -0
  135. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_v0.23.0.md +0 -0
  136. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_v0.24.0.md +0 -0
  137. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_v0.25.0.md +0 -0
  138. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_v0.26.0.md +0 -0
  139. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_v0.27.0.md +0 -0
  140. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_v0.27.1.md +0 -0
  141. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_v0.28.0.md +0 -0
  142. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_v0.29.0.md +0 -0
  143. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_v0.30.0.md +0 -0
  144. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_v0.31.0.md +0 -0
  145. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_v0.32.0.md +0 -0
  146. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_v0.32.1.md +0 -0
  147. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_v0.33.0.md +0 -0
  148. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_v0.34.0.md +0 -0
  149. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_v0.35.0.md +0 -0
  150. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_v0.36.0.md +0 -0
  151. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_v0.37.0.md +0 -0
  152. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_v0.38.0.md +0 -0
  153. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_v0.38.1.md +0 -0
  154. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
  155. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
  156. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
  157. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
  158. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
  159. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/MCP.md +0 -0
  160. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/MOVIE.md +0 -0
  161. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/PROMPT_EXPANSION.md +0 -0
  162. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/SECURITY.md +0 -0
  163. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/TOOLS.md +0 -0
  164. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/USER_GUIDE.md +0 -0
  165. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/assets/demo-split-pf.gif +0 -0
  166. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/assets/example-run.gif +0 -0
  167. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/assets/examples.webp +0 -0
  168. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/medium_tutorial.md +0 -0
  169. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/schemas/movie-handoff.schema.json +0 -0
  170. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/sonar-cleanup-tracker.md +0 -0
  171. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
  172. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +0 -0
  173. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +0 -0
  174. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +0 -0
  175. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +0 -0
  176. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +0 -0
  177. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +0 -0
  178. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +0 -0
  179. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +0 -0
  180. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +0 -0
  181. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/superpowers/plans/2026-07-08-pr-triage-autopilot/PLAN.md +0 -0
  182. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/superpowers/plans/2026-07-09-camoufox-adoption/PLAN.md +0 -0
  183. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/superpowers/plans/2026-07-14-storyboarding-and-visual-curation/PLAN.md +0 -0
  184. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/superpowers/research/2026-06-27-tool-abstraction-evaluation.md +0 -0
  185. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/superpowers/specs/2026-06-29-issue-assessment-workflow-design.md +0 -0
  186. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/superpowers/specs/2026-07-04-pr-triage-autopilot-design.md +0 -0
  187. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/superpowers/spikes/2026-07-09-camoufox-waf-403.md +0 -0
  188. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/superpowers/spikes/2026-07-12-ui-cohort-backend-config.md +0 -0
  189. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/docs/superpowers/spikes/2026-07-17-production-readiness-assessment.md +0 -0
  190. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/eval/pr_triage_eval.py +0 -0
  191. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/eval/pr_triage_fixtures.json +0 -0
  192. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/examples/README.md +0 -0
  193. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/examples/batch_from_config.py +0 -0
  194. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/examples/multi_prompt_t2i.py +0 -0
  195. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/examples/sample_config.json +0 -0
  196. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/examples/sample_prompts.txt +0 -0
  197. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/examples/single_image_t2i.py +0 -0
  198. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/examples/workflow_chain.py +0 -0
  199. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/index.html +0 -0
  200. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/llms.txt +0 -0
  201. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/samples/README.md +0 -0
  202. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/samples/captured/01_upload_image.json +0 -0
  203. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
  204. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
  205. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/samples/captured/04_archive_workflow.json +0 -0
  206. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/samples/captured/05_createProject.json +0 -0
  207. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/samples/captured/06_batchGenerateImages.json +0 -0
  208. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
  209. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
  210. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
  211. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
  212. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
  213. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/samples/captured/12_create_scene.json +0 -0
  214. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
  215. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/samples/captured/14_get_scene_workflows.json +0 -0
  216. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
  217. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/autopilot/Dockerfile.triage +0 -0
  218. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/autopilot/entrypoint.sh +0 -0
  219. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/autopilot/pr_triage_autopilot.py +0 -0
  220. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/autopilot/pr_triage_gate.py +0 -0
  221. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/autopilot/run_sandboxed_review.sh +0 -0
  222. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/ci/check_materiality.py +0 -0
  223. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/ci/check_release_artifacts.py +0 -0
  224. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/ci/check_repo_hygiene.py +0 -0
  225. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/debug_editor.py +0 -0
  226. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/debug_gen_settings.py +0 -0
  227. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/debug_settings.py +0 -0
  228. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/_recording_client.py +0 -0
  229. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/_spike_common.py +0 -0
  230. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/active_plan.py +0 -0
  231. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/analyze_agent_ui_capture.py +0 -0
  232. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
  233. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
  234. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
  235. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
  236. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
  237. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/capture_locale_invariants.py +0 -0
  238. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
  239. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/character_create_spike.py +0 -0
  240. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/character_create_spike_v2.py +0 -0
  241. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/dump_character_selectors.js +0 -0
  242. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/make_project.py +0 -0
  243. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/materiality_backtest.py +0 -0
  244. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/monitor_pr_38.py +0 -0
  245. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/patch_character.py +0 -0
  246. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/skillopt/README.md +0 -0
  247. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/skillopt/harness.py +0 -0
  248. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/skillopt/tasks.json +0 -0
  249. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/sonar-local-scan.sh +0 -0
  250. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/sonar-pre-push-gate.sh +0 -0
  251. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/spike_char_editor_dom.py +0 -0
  252. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/spike_char_gen_capture.py +0 -0
  253. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
  254. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
  255. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
  256. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
  257. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
  258. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
  259. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/spike_issue313_agent_mode_controls.py +0 -0
  260. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/spike_issue314_picker_filename_search.py +0 -0
  261. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/spike_mode_roundtrip.py +0 -0
  262. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/spike_mode_switch_agentic_to_classic.py +0 -0
  263. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
  264. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
  265. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
  266. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/spike_movie_picker_select.py +0 -0
  267. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/spike_movie_voice_list.py +0 -0
  268. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/spike_patch_entity.py +0 -0
  269. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/dev/spike_patchright.py +0 -0
  270. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/diag/README.md +0 -0
  271. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/diag/capture_flow_traffic.py +0 -0
  272. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/diag/memory_profile.py +0 -0
  273. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/diag/recaptcha_mint.py +0 -0
  274. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
  275. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/e2e/capture_agent_toggle.py +0 -0
  276. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/record_demo.ps1 +0 -0
  277. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/smoke_image.py +0 -0
  278. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/smoke_real_chrome_image.py +0 -0
  279. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/smoke_video_editor.py +0 -0
  280. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/smoke_worker_style.py +0 -0
  281. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/spike_waf_camoufox.py +0 -0
  282. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/scripts/verify_chrome_auth_viability.py +0 -0
  283. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/skills/README.md +0 -0
  284. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/skills/changelog/SKILL.md +0 -0
  285. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/skills/check/SKILL.md +0 -0
  286. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/skills/doc-review/SKILL.md +0 -0
  287. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/skills/gflow-cli/SKILL.md +0 -0
  288. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/skills/issue-assessment/SKILL.md +0 -0
  289. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/skills/issue-resolve/SKILL.md +0 -0
  290. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/skills/known-issues/SKILL.md +0 -0
  291. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/skills/llm-council/SKILL.md +0 -0
  292. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/skills/plan/SKILL.md +0 -0
  293. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/skills/pr-council-review/SKILL.md +0 -0
  294. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/skills/predict/SKILL.md +0 -0
  295. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/skills/release/SKILL.md +0 -0
  296. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/skills/scenario/SKILL.md +0 -0
  297. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/skills/sonar/SKILL.md +0 -0
  298. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/skills/status/SKILL.md +0 -0
  299. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/sonar-project.properties +0 -0
  300. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/__main__.py +0 -0
  301. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/_cli_helpers.py +0 -0
  302. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/api/__init__.py +0 -0
  303. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/api/_engine.py +0 -0
  304. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/api/_retry.py +0 -0
  305. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
  306. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/api/character.py +0 -0
  307. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/api/client.py +0 -0
  308. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/api/dto.py +0 -0
  309. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/api/image.py +0 -0
  310. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/api/image_upscale.py +0 -0
  311. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/api/recaptcha.py +0 -0
  312. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/api/routes.py +0 -0
  313. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/api/scene.py +0 -0
  314. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/api/transports/__init__.py +0 -0
  315. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
  316. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/api/transports/base.py +0 -0
  317. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
  318. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/api/transports/drivers/agentic.py +0 -0
  319. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/api/transports/drivers/base.py +0 -0
  320. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/api/transports/drivers/classic.py +0 -0
  321. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/api/transports/drivers/factory.py +0 -0
  322. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
  323. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
  324. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
  325. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
  326. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/api/transports/mode_control.py +0 -0
  327. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/api/transports/ui_automation.py +0 -0
  328. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/api/video.py +0 -0
  329. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/auth/__init__.py +0 -0
  330. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/auth/base.py +0 -0
  331. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/auth/cookies.py +0 -0
  332. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/auth/factory.py +0 -0
  333. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
  334. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/auth/real_chrome.py +0 -0
  335. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/auth/strategies.py +0 -0
  336. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/auth/verification.py +0 -0
  337. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/browser_manager.py +0 -0
  338. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/chain_manifest.py +0 -0
  339. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/cli.py +0 -0
  340. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/cli_character.py +0 -0
  341. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/cli_instructions.py +0 -0
  342. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/cli_models.py +0 -0
  343. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/cli_scene.py +0 -0
  344. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/cli_tools.py +0 -0
  345. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/composition.py +0 -0
  346. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/config.py +0 -0
  347. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/data/__init__.py +0 -0
  348. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/data/chain_repo.py +0 -0
  349. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
  350. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
  351. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
  352. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
  353. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
  354. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
  355. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/data/migrations/0007_queue.sql +0 -0
  356. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/data/migrations/0008_add_operation_expanded_prompt.sql +0 -0
  357. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
  358. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/data/models.py +0 -0
  359. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/data/repository.py +0 -0
  360. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/data/store.py +0 -0
  361. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/errors.py +0 -0
  362. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/exceptions.py +0 -0
  363. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/json_output.py +0 -0
  364. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/manifest.py +0 -0
  365. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/mcp/__init__.py +0 -0
  366. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/mcp/prompts.py +0 -0
  367. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/mcp/resources.py +0 -0
  368. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/mcp/server.py +0 -0
  369. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/media.py +0 -0
  370. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/movie_manifest.py +0 -0
  371. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/paths.py +0 -0
  372. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/profile_store.py +0 -0
  373. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/services/__init__.py +0 -0
  374. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/services/character_create.py +0 -0
  375. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/storage.py +0 -0
  376. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/tools/__init__.py +0 -0
  377. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/tools/banned.py +0 -0
  378. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/tools/builtin/__init__.py +0 -0
  379. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/tools/builtin/creative-director.toml +0 -0
  380. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/tools/builtin/reverse-engineer.toml +0 -0
  381. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/tools/builtin/storyboard.toml +0 -0
  382. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/tools/expander.py +0 -0
  383. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/tools/invocation.py +0 -0
  384. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/tools/loader.py +0 -0
  385. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/tools/registry.py +0 -0
  386. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/tools/runtime.py +0 -0
  387. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/tools/spec.py +0 -0
  388. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/ui/app.py +0 -0
  389. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/ui/server.py +0 -0
  390. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/src/gflow_cli/worker/queue.py +0 -0
  391. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tasks/lessons.md +0 -0
  392. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/test_assets/sample_batch.json +0 -0
  393. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/test_assets/sample_batch.tsv +0 -0
  394. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/test_assets/sample_batch_invalid.tsv +0 -0
  395. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/__init__.py +0 -0
  396. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/__init__.py +0 -0
  397. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/fixtures/character_gen_response.json +0 -0
  398. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/fixtures/patch_entity_response.json +0 -0
  399. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/test_aisandbox_auth_error.py +0 -0
  400. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
  401. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/test_bearer_redaction.py +0 -0
  402. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/test_character.py +0 -0
  403. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/test_client.py +0 -0
  404. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/test_client_character.py +0 -0
  405. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/test_client_delete_characters.py +0 -0
  406. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/test_client_generate_character.py +0 -0
  407. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/test_client_image.py +0 -0
  408. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/test_client_launch_kwargs.py +0 -0
  409. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/test_client_patch_entity.py +0 -0
  410. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/test_client_scene.py +0 -0
  411. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/test_client_upscale.py +0 -0
  412. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/test_concurrency.py +0 -0
  413. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/test_dto.py +0 -0
  414. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/test_engine.py +0 -0
  415. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/test_image.py +0 -0
  416. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/test_image_dto.py +0 -0
  417. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/test_image_upscale.py +0 -0
  418. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/test_post_json_aisandbox_auth.py +0 -0
  419. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/test_recaptcha.py +0 -0
  420. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/test_retry.py +0 -0
  421. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/test_routes.py +0 -0
  422. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/test_routes_character.py +0 -0
  423. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/test_routes_scene.py +0 -0
  424. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/test_sapisidhash_helper.py +0 -0
  425. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/test_scene_models.py +0 -0
  426. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/test_video.py +0 -0
  427. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/test_video_request.py +0 -0
  428. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/transports/__init__.py +0 -0
  429. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/transports/conftest.py +0 -0
  430. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/transports/drivers/__init__.py +0 -0
  431. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/transports/drivers/test_agentic.py +0 -0
  432. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/transports/drivers/test_classic.py +0 -0
  433. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/transports/drivers/test_factory.py +0 -0
  434. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/transports/drivers/test_ui_mode.py +0 -0
  435. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/transports/test_base.py +0 -0
  436. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/transports/test_bearer.py +0 -0
  437. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
  438. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/transports/test_factory.py +0 -0
  439. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/transports/test_fingerprint.py +0 -0
  440. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/transports/test_mode_control.py +0 -0
  441. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/transports/test_sapisidhash.py +0 -0
  442. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/transports/test_selector_symmetry.py +0 -0
  443. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/transports/test_transport_timeout.py +0 -0
  444. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/transports/test_ui_automation.py +0 -0
  445. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/transports/test_ui_automation_batch.py +0 -0
  446. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
  447. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/transports/test_ui_automation_video.py +0 -0
  448. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/api/transports/test_ui_character_editor.py +0 -0
  449. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/auth/strategies/test_factory.py +0 -0
  450. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/auth/strategies/test_strategies.py +0 -0
  451. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/auth/test_cookies.py +0 -0
  452. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/auth/test_verification.py +0 -0
  453. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/autopilot/test_pr_triage_autopilot.py +0 -0
  454. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/cli/__init__.py +0 -0
  455. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/cli/test_cli_auth_list.py +0 -0
  456. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/cli/test_cli_character.py +0 -0
  457. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/cli/test_cli_character_create.py +0 -0
  458. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/cli/test_cli_data.py +0 -0
  459. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
  460. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/cli/test_cli_image_selector_drift.py +0 -0
  461. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/cli/test_cli_image_upscale.py +0 -0
  462. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/cli/test_cli_instructions.py +0 -0
  463. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/cli/test_cli_models.py +0 -0
  464. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/cli/test_cli_movie.py +0 -0
  465. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/cli/test_cli_run.py +0 -0
  466. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/cli/test_cli_scene.py +0 -0
  467. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/cli/test_cli_tools.py +0 -0
  468. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/cli/test_cli_video.py +0 -0
  469. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/cli/test_cli_video_chain.py +0 -0
  470. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/cli/test_error_handling.py +0 -0
  471. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/cli/test_helpers.py +0 -0
  472. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/cli/test_movie_manifest.py +0 -0
  473. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/cli/test_movie_manifest_style_variants.py +0 -0
  474. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/cli/test_settings_validation.py +0 -0
  475. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
  476. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/composition/test_character.py +0 -0
  477. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/composition/test_compose_prompt.py +0 -0
  478. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/composition/test_handoff.py +0 -0
  479. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/composition/test_style_variants.py +0 -0
  480. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/composition/test_style_variants_e2e.py +0 -0
  481. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/conftest.py +0 -0
  482. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/data/__init__.py +0 -0
  483. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/data/test_chain_repo.py +0 -0
  484. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/data/test_find_incomplete_character.py +0 -0
  485. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/data/test_models.py +0 -0
  486. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/data/test_packaging.py +0 -0
  487. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/data/test_recorder.py +0 -0
  488. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/data/test_recorder_character.py +0 -0
  489. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/data/test_redaction.py +0 -0
  490. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/data/test_repository.py +0 -0
  491. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/data/test_scene_persistence.py +0 -0
  492. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/data/test_settings_and_errors.py +0 -0
  493. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/data/test_store_migrations.py +0 -0
  494. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/dev/test_recording_client.py +0 -0
  495. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/e2e/__init__.py +0 -0
  496. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/e2e/conftest.py +0 -0
  497. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/e2e/test_agentic_count_enforcement_e2e.py +0 -0
  498. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
  499. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
  500. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/e2e/test_chain_e2e.py +0 -0
  501. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/e2e/test_character_create_e2e.py +0 -0
  502. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/e2e/test_daemon_e2e.py +0 -0
  503. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/e2e/test_data_layer_e2e.py +0 -0
  504. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/e2e/test_entity_smuggling_e2e.py +0 -0
  505. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/e2e/test_i2v_flags_e2e.py +0 -0
  506. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/e2e/test_image_batch_e2e.py +0 -0
  507. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
  508. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/e2e/test_json_output_e2e.py +0 -0
  509. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/e2e/test_live_agentic_instructions.py +0 -0
  510. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
  511. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/e2e/test_scene_compose_live.py +0 -0
  512. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/e2e/test_tools_e2e.py +0 -0
  513. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/e2e/test_transports_e2e.py +0 -0
  514. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
  515. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
  516. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/features/__init__.py +0 -0
  517. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/features/auth.feature +0 -0
  518. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/features/auth_login.feature +0 -0
  519. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/features/character_create.feature +0 -0
  520. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/features/character_read.feature +0 -0
  521. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/features/conftest.py +0 -0
  522. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/features/image.feature +0 -0
  523. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/features/image_upscale.feature +0 -0
  524. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/features/instructions.feature +0 -0
  525. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/features/locale_picker_include.feature +0 -0
  526. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/features/test_auth_login_steps.py +0 -0
  527. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/features/test_auth_steps.py +0 -0
  528. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/features/test_character_create_steps.py +0 -0
  529. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/features/test_character_read_steps.py +0 -0
  530. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/features/test_image_upscale_steps.py +0 -0
  531. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/features/test_instructions_steps.py +0 -0
  532. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/features/test_step_collision_guard.py +0 -0
  533. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/features/test_video_agent_ui_steps.py +0 -0
  534. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/features/test_video_chain_steps.py +0 -0
  535. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/features/video_agent_ui.feature +0 -0
  536. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/features/video_chain.feature +0 -0
  537. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/fixtures/__init__.py +0 -0
  538. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/fixtures/seeded_catalog.py +0 -0
  539. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/image_batch/__init__.py +0 -0
  540. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/image_batch/test_image_manifest.py +0 -0
  541. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/image_batch/test_jitter_config.py +0 -0
  542. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/image_batch/test_observability_events.py +0 -0
  543. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/integration/__init__.py +0 -0
  544. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/integration/conftest.py +0 -0
  545. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/integration/constants.py +0 -0
  546. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/integration/test_storage_gcs.py +0 -0
  547. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/integration/test_storage_s3.py +0 -0
  548. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/mcp/__init__.py +0 -0
  549. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/mcp/conftest.py +0 -0
  550. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/mcp/test_server.py +0 -0
  551. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/mcp/test_stdio_transport.py +0 -0
  552. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/mcp/test_tools_helpers.py +0 -0
  553. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/mcp/test_tools_instructions.py +0 -0
  554. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/mcp/test_tools_wired.py +0 -0
  555. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
  556. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
  557. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/scripts/test_check_materiality.py +0 -0
  558. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/scripts/test_check_release_artifacts.py +0 -0
  559. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/scripts/test_check_repo_hygiene.py +0 -0
  560. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/scripts/test_materiality_backtest.py +0 -0
  561. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/services/__init__.py +0 -0
  562. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/services/test_character_create_redaction.py +0 -0
  563. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/services/test_character_create_saga.py +0 -0
  564. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
  565. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/smoke/__init__.py +0 -0
  566. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/smoke/test_profile_account_smoke.py +0 -0
  567. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/smoke/test_real_flow.py +0 -0
  568. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/test_auth.py +0 -0
  569. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/test_browser_manager.py +0 -0
  570. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/test_chain_manifest.py +0 -0
  571. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/test_cli_data.py +0 -0
  572. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/test_config.py +0 -0
  573. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/test_conftest_isolation.py +0 -0
  574. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/test_documentation_gate.py +0 -0
  575. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/test_errors.py +0 -0
  576. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/test_errors_403.py +0 -0
  577. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/test_json_output.py +0 -0
  578. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/test_manifest.py +0 -0
  579. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/test_marker_registry.py +0 -0
  580. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/test_media.py +0 -0
  581. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/test_observability.py +0 -0
  582. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/test_paths.py +0 -0
  583. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/test_profile_store.py +0 -0
  584. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/test_smoke.py +0 -0
  585. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/tools/__init__.py +0 -0
  586. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/tools/test_banned.py +0 -0
  587. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/tools/test_expander.py +0 -0
  588. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/tools/test_invocation.py +0 -0
  589. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/tools/test_loader.py +0 -0
  590. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/tools/test_registry.py +0 -0
  591. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/tools/test_runtime.py +0 -0
  592. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/tools/test_spec.py +0 -0
  593. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/tests/ui/test_app.py +0 -0
  594. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/website/docs/ARCHITECTURE.md +0 -0
  595. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/website/docs/AUTHENTICATION.md +0 -0
  596. {gflow_cli-0.38.1 → gflow_cli-0.40.0/website}/docs/CHARACTER.md +0 -0
  597. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/website/docs/CONFIGURATION.md +0 -0
  598. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/website/docs/DEBUGGING.md +0 -0
  599. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/website/docs/DEVELOPMENT.md +0 -0
  600. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/website/docs/E2E_TESTING.md +0 -0
  601. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/website/docs/EXTERNAL_STORAGE.md +0 -0
  602. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/website/docs/INSTRUCTIONS.md +0 -0
  603. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/website/docs/KNOWN_ISSUES.md +0 -0
  604. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/website/docs/MCP.md +0 -0
  605. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/website/docs/MOVIE.md +0 -0
  606. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/website/docs/PROMPT_EXPANSION.md +0 -0
  607. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/website/docs/SECURITY.md +0 -0
  608. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/website/docs/TOOLS.md +0 -0
  609. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/website/docs/USER_GUIDE.md +0 -0
  610. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/website/docs/agents.md +0 -0
  611. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/website/docs/index.md +0 -0
  612. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/website/docs/installation.md +0 -0
  613. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/website/docs/quickstart.md +0 -0
  614. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/website/docs/stylesheets/extra.css +0 -0
  615. {gflow_cli-0.38.1 → gflow_cli-0.40.0}/website/mkdocs.yml +0 -0
@@ -116,6 +116,7 @@ The SkillOpt harness at `scripts/dev/skillopt/` measures how accurately each ski
116
116
 
117
117
  - **Architecture & target shape** → [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)
118
118
  - **Mandates & routing rules** → [docs/AGENT_GUIDE.md](docs/AGENT_GUIDE.md)
119
+ - **Referencing assets** (`@Name` mention vs `--reference-entity` vs `--ref`) → [docs/REFERENCE_STRATEGIES.md](docs/REFERENCE_STRATEGIES.md)
119
120
  - **Full docs index** → [docs/INDEX.md](docs/INDEX.md)
120
121
  - **Known issues** (read before touching auth / reCAPTCHA) → [KNOWN_ISSUES.md](KNOWN_ISSUES.md)
121
122
  - **Current task** → `/gflow:status` · **Create a feature plan** → `/gflow:plan <feature>` · **Full roadmap** → [PLAN.md](PLAN.md)
@@ -7,6 +7,63 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.40.0] — 2026-07-19
11
+
12
+ ### Added
13
+
14
+ - **Prompt `@`-mention resolution for asset tagging** ([#344]): `@Name` in a
15
+ t2i/i2i/video prompt resolves to a staged, taggable character entity
16
+ (`services/mentions.py`), across the `image`/`video` CLI paths, the async
17
+ worker, and MCP tools. Media-asset (non-character) `@`-mentions also work,
18
+ but on the **image path only** — video-path media mentions are Phase 3. A
19
+ bare character with no reference images is rejected early with a clear
20
+ error instead of failing deep in the UI attach. De-tagged prompts are
21
+ persisted to the catalog. See
22
+ [`docs/REFERENCE_STRATEGIES.md`](docs/REFERENCE_STRATEGIES.md) for
23
+ `@`-mention vs `--reference-entity` vs `--ref`, and
24
+ [`docs/LIVE_VERIFICATION_v0.40.0.md`](docs/LIVE_VERIFICATION_v0.40.0.md)
25
+ for the live e2e evidence.
26
+
27
+ [#344]: https://github.com/ffroliva/gflow-cli/issues/344
28
+
29
+ ## [0.39.0] — 2026-07-19
30
+
31
+ ### Added
32
+
33
+ - **Failed generations are now persisted to the local catalog** ([#341]):
34
+ every paid-generation path (`video t2v/i2v/r2v`, `video chain`,
35
+ `image t2i/i2i`, multi-prompt t2i, `gflow run`, `image batch`, `movie run`,
36
+ and the async worker) records a terminal `status="failed"` operation row —
37
+ with a stable `error_type` derived from the exception's RFC 9457
38
+ `problem_type` (`waf-rejection`, `content-policy`, `auth-expired`, ...) and
39
+ a redacted `error_detail` — before the error propagates. WAF-403 block
40
+ onset, duration, and recovery windows are now measurable instead of
41
+ reconstructed from memory.
42
+ - New `gflow data list errors [--profile] [--limit] [--offset] [--json]`
43
+ subcommand: browse failed operations newest-first (Rich table on a TTY,
44
+ JSONL otherwise).
45
+ - Videos whose poll completes with a Flow-reported failure
46
+ (`succeeded=false`, e.g. `PUBLIC_ERROR_UNSAFE_GENERATION`) are now recorded
47
+ as `failed` with `error_type=generation-failed` — previously they were
48
+ recorded as `succeeded` (all paths: CLI, chain, movie, worker).
49
+
50
+ ### Security
51
+
52
+ - `error_detail` values are scrubbed before persistence
53
+ (`Bearer`/`SAPISIDHASH` tokens, auth-cookie pairs, signed URLs; 500-char
54
+ cap) and non-`GFlowError` messages are stored only as SHA-256 hashes.
55
+ Prompts on failed rows honor `GFLOW_CLI_HISTORY_PROMPTS`; note `store` mode
56
+ therefore also stores prompts of content-policy-rejected generations.
57
+ - The experimental REST transports (`bearer`, `sapisidhash`,
58
+ `evaluate_fetch`) now redact response bodies BEFORE truncating them into
59
+ exception messages, closing a partial-secret leak into logs and (new) the
60
+ catalog DB.
61
+ - The worker queue's `generation_queue.error_json` now applies the same
62
+ redaction: `GFlowError` details are scrubbed and non-`GFlowError` messages
63
+ are stored as SHA-256 hashes instead of raw text.
64
+
65
+ [#341]: https://github.com/ffroliva/gflow-cli/issues/341
66
+
10
67
  ## [0.38.1] — 2026-07-17
11
68
 
12
69
  ### Fixed
@@ -2053,7 +2110,9 @@ shell-script template that branches on these codes.
2053
2110
 
2054
2111
  First skeleton. Not functional end-to-end yet.
2055
2112
 
2056
- [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.38.1...HEAD
2113
+ [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.40.0...HEAD
2114
+ [0.40.0]: https://github.com/ffroliva/gflow-cli/compare/v0.39.0...v0.40.0
2115
+ [0.39.0]: https://github.com/ffroliva/gflow-cli/compare/v0.38.1...v0.39.0
2057
2116
  [0.38.1]: https://github.com/ffroliva/gflow-cli/compare/v0.38.0...v0.38.1
2058
2117
  [0.38.0]: https://github.com/ffroliva/gflow-cli/compare/v0.37.0...v0.38.0
2059
2118
  [0.37.0]: https://github.com/ffroliva/gflow-cli/compare/v0.36.0...v0.37.0
@@ -14,6 +14,7 @@
14
14
  - Current task / where we left off → `/gflow:status`
15
15
  - Starting a new feature → `/gflow:predict` → `/gflow:scenario` → `/gflow:plan <feature>`
16
16
  - Touching auth or reCAPTCHA → `/gflow:known-issues`
17
+ - Referencing a saved asset (`@Name` mention vs `--ref`/`--reference-entity`) → [docs/REFERENCE_STRATEGIES.md](docs/REFERENCE_STRATEGIES.md)
17
18
  - Cutting a release → `/gflow:release`
18
19
  - Before any commit → `/gflow:check`
19
20
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gflow-cli
3
- Version: 0.38.1
3
+ Version: 0.40.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
@@ -0,0 +1,203 @@
1
+ # Asset tagging (`@` mentions) — research & integration design
2
+
3
+ > **Status:** VERIFIED-with-capture · **Branch:** `claude/google-flow-asset-tagging-r3aqjb`
4
+ > **Convention:** this is the integration recon doc for the `@`-mention surface, following the
5
+ > `<FEATURE>_RECON.md` pattern ([INDEX § recon docs](INDEX.md)). Wire-payload sections are
6
+ > VERIFIED as of 2026-07-18.
7
+ > **Related:** [CHARACTER.md](CHARACTER.md) (entity model, `referenceEntities` wire), [MOVIE.md](MOVIE.md)
8
+ > (entity-attach mechanism), [AGENT_UI_RECON.md](AGENT_UI_RECON.md) (agentic cohort), [INSTRUCTIONS.md](INSTRUCTIONS.md).
9
+
10
+ ## 1. What the feature is (product research)
11
+
12
+ In Flow's prompt box, typing **`@`** opens a dropdown of the project's assets. Selecting one inserts a
13
+ mention chip into the prompt text; the model then anchors on that specific asset instead of inventing a
14
+ new one. Three asset classes are taggable:
15
+
16
+ | Tag | Asset class | gflow equivalent today |
17
+ |---|---|---|
18
+ | `@CharacterName` | Saved project **Character** (entity) | `gflow character` entities — `referenceEntities` on the wire (VERIFIED, [CHARACTER § 6.6](CHARACTER.md#66-videobatchasyncgeneratevideoreferenceimages-reuse)) |
19
+ | `@me` | Personal **Avatar / likeness** (face + voice scan, I/O 2026) | `referenceLikenesses` — **region-gated**; `GET /v1/flow/likeness:checkEligibility` returns `REGION` for our accounts ([CHARACTER § 1.1](CHARACTER.md#11-how-it-works-plain-language)) |
20
+ | `@AssetName` | Uploaded/generated **ingredient** (image, object, style ref) | `--ref` on `video r2v` (local path only, upload-every-time — #314) and `image i2i` (path **or** in-project media UUID, zero re-upload) — `referenceImages[{mediaId, imageUsageType:IMAGE_USAGE_TYPE_ASSET}]` (VERIFIED wire shape) |
21
+
22
+ Product-side facts from public sources (Google Flow Help, blog.google "5 tips for Flow", I/O 2026
23
+ coverage):
24
+
25
+ - The dropdown **searches uploaded assets by name** — it is a name→asset resolver over the project's
26
+ asset library, the same library the "Video Ingredients" mode and SceneBuilder draw from.
27
+ - `@me` requires the one-time avatar scan (read numbers aloud + head turn); the likeness is stored on the
28
+ Google Account and referenced across Gemini/Flow. Regional gating applies (matches our
29
+ `likeness:checkEligibility` finding).
30
+ - Community guidance: consistency holds best when the reference image has a **clean, uncluttered
31
+ background**; drift (clothing/face shifts) still occurs under heavy motion — tagging anchors identity,
32
+ it does not eliminate drift.
33
+
34
+ Sources: [Google Flow Help — Create videos](https://support.google.com/flow/answer/16353334?hl=en) ·
35
+ [blog.google — 5 tips for Flow](https://blog.google/technology/ai/flow-video-tips/) ·
36
+ [I/O 2026 avatar coverage](https://nokiapoweruser.com/google-io-gemini-avatar-web-flow-android-update/) ·
37
+ [vidau.ai Flow 2026 guide](https://www.vidau.ai/google-flow-ai-update-2026-complete-guide/).
38
+ (Several guides are WAF-walled to bots; facts above were cross-checked across at least two sources.)
39
+
40
+ ## 2. What gflow already owns (VERIFIED against shipped code)
41
+
42
+ The `@` feature is **not a new wire capability** — it is a new *UI affordance* over reference mechanisms
43
+ gflow has already reverse-engineered and partially shipped:
44
+
45
+ 1. **Entity references ride today.** `gflow movie run` attaches a CHARACTER entity by opening the
46
+ resource picker, right-clicking the tile addressed as `data-tile-id="fe_id_<entityId>"`, and choosing
47
+ the include-in-prompt action (`PICKER_CONTEXT_INCLUDE`, locale-free icon tier — `ui_automation_video.py`).
48
+ The submit then carries `referenceEntities:[{entityId}]`, echoed back in
49
+ `workflows[].videoData.videoGenerationEntityInputs[].entityId`, asserted by `_assert_entities_attached`
50
+ ([MOVIE § Character consistency](MOVIE.md#character-consistency-how-the-entity-rides)).
51
+ 2. **Image references ride today — with one path-specific gap.** `gflow video r2v --ref` stages
52
+ `referenceImages` from **local paths only** (`click.Path(exists=True)`; upload-every-time by design —
53
+ #314). UUID-addressed zero-re-upload selection of existing assets is live-verified on
54
+ `image i2i --ref` (v0.26.0) and `video i2v` frame refs (shipped v0.32.0, live-verified v0.33.0 —
55
+ #287) — but an **r2v** UUID-selection
56
+ primitive does not exist yet, so media mentions on the *video* path are net-new transport work.
57
+ 3. **Image-path character reuse already ships.** `gflow image t2i/i2i --reference-entity` puts
58
+ `referenceEntities:[{entityId}]` on the image submit — wire shape captured live 2026-06-08
59
+ (`api/image.py`) and asserted by `_assert_image_entities_attached`. (CHARACTER.md §14's
60
+ "image-path `referenceEntities` uncaptured" bullet was stale; corrected in this PR.) What's missing
61
+ is only the name-based `@` syntax over it.
62
+ 4. **Name→asset resolution exists.** `flow.projectInitialData` returns entities with `displayName`
63
+ ([CHARACTER § 6.5](CHARACTER.md#65-flowprojectinitialdata-listshow)); the local catalog records
64
+ generated-image `display_name` (v0.26.0). This is exactly the lookup the `@` dropdown performs.
65
+ 5. **The prompt box is a Slate editor.** `_send_prompt` targets
66
+ `div[role="textbox"][data-slate-editor="true"]` and uses `keyboard.insert_text` (one `beforeinput`
67
+ event, Slate-native). A mention chip is a **non-text Slate node** — `insert_text` alone can never
68
+ create one.
69
+ 6. **Diagnostics are pre-staged.** The image-submit capture already probes for `referenceEntit` in POST
70
+ bodies (`mentions_reference_entities`, `ui_automation.py`) — built for the #170 submit backstop and
71
+ directly reusable here.
72
+
73
+ **Gaps the `@` feature would close:**
74
+
75
+ - `gflow video --character` (Phase 3 backlog, [CHARACTER § 14](CHARACTER.md#14-backlog--not-yet-implemented)) — single-command character reuse outside the movie pipeline.
76
+ - Name-based reference syntax everywhere — the image path already has id-based `--reference-entity`;
77
+ nothing accepts an asset *name*.
78
+ - Inline, per-prompt asset naming (`"@Zoro hands @Mika the sword"`) — today references are flag-level
79
+ (whole-generation), not positional in the prompt text.
80
+ - Media mentions on the **video** path — requires the missing r2v UUID-selection primitive (item 2).
81
+
82
+ ## 3. Wire serialization verdict (VERIFIED — H1)
83
+
84
+ Spike results confirmed:
85
+
86
+ - **H1 — flags-equivalent (VERIFIED):** the chip's display text lands as plain text inside
87
+ `structuredPrompt.parts[].text`, and the referenced asset is added to `referenceEntities` /
88
+ `referenceImages` exactly as the picker path does. The chip is UI sugar; position in the prompt is not
89
+ semantically encoded on the wire. Thus, gflow can synthesize identical payloads with the
90
+ **already-live-verified attach primitives** (Option B) and does not need to drive the dropdown.
91
+ - **H2 — positional parts (REJECTED):** `structuredPrompt.parts` does not interleave mention parts; it is plain text.
92
+ - `@me` maps to `referenceLikenesses` — **held** as region-ineligible.
93
+
94
+
95
+ Agent-mode nuance: in the **agentic cohort** ([AGENT_UI_RECON.md](AGENT_UI_RECON.md)) the prompt feeds a
96
+ reasoning agent, which may resolve `@Name` text itself even without a chip. The spike should test both
97
+ cohorts; classic is the contract-bearing path.
98
+
99
+ ## 4. Integration options
100
+
101
+ > Option letters below are local to this doc — they do **not** correspond to CHARACTER.md § 11's
102
+ > "Option A/B" (which named direct-REST vs UI-driven *generation* transports).
103
+
104
+ | | Option A — drive the dropdown | Option B — CLI-side mention parsing → existing attach primitives | Option C — direct REST |
105
+ |---|---|---|---|
106
+ | Mechanism | Type prompt up to `@`, pause, let Flow's dropdown open, select entry (structural selectors), continue typing | Parse `@Name` tokens CLI-side; resolve names via `projectInitialData` + media catalog; attach via shipped picker/UUID primitives; submit prompt with names as plain text | Build `referenceEntities`/mention parts ourselves and POST |
107
+ | Fidelity | Exact — Flow's JS builds the chip | Equivalent **iff H1**; loses positional semantics if H2 | n/a |
108
+ | New selector surface | High (dropdown container, search behavior, per-type entries, both cohorts, all locales) | **Zero** — reuses `fe_id_<entityId>` tiles + `PICKER_CONTEXT_INCLUDE` + UUID picker, all live-verified | n/a |
109
+ | Risk | New drift surface; dropdown is keystroke-timing sensitive (Slate `insert_text` won't trigger it — needs real per-char typing around `@`) | Name-resolution ambiguity (duplicate display names) — solvable with exit-11 disambiguation, same as `character show --name` | **DEAD** — generation POSTs are reCAPTCHA-walled (403, spike-proven) |
110
+
111
+ **Recommendation: Option B first, gated on a capture spike that decides H1 vs H2.** If H1 holds
112
+ (likely — the picker path already produces accepted `referenceEntities` submits), gflow gets `@` mentions
113
+ with no new UI automation at all: the feature becomes a *prompt-syntax resolver* in front of
114
+ live-verified machinery. Option A is the fallback only if H2 is proven **and** positional semantics
115
+ demonstrably change output.
116
+
117
+ ## 5. Proposed CLI surface (Phase 1, post-spike)
118
+
119
+ Inline mentions in the prompt on generation commands, mirroring Flow's own syntax:
120
+
121
+ ```bash
122
+ gflow video t2v "@CaptainZoro walking through a rain-soaked neon city, tracking shot" --project <id>
123
+ gflow video r2v "@Zoro hands @Mika the sword" --project <id> # multi-ref (cap-checked)
124
+ gflow image i2i "@logo on a black tee, studio light" --project <id>
125
+ gflow movie run film.toml # scene prompts may carry @mentions
126
+ ```
127
+
128
+ Rules:
129
+
130
+ - **Grammar:** `@` + longest match against project asset names (chip names may contain spaces —
131
+ resolver tries greedy longest-match, then falls back to single-token). `@@` escapes a literal `@`;
132
+ email-like tokens (`a@b.com`) are never treated as mentions (require `@` at token start).
133
+ - **Resolution order:** CHARACTER entities (`projectInitialData.displayName`, case-insensitive) →
134
+ project media assets by `display_name` (catalog first, live listing fallback). Unknown mention →
135
+ exit 11 `ConfigurationError` listing available names; ambiguous → exit 11 with disambiguation
136
+ (same contract as `character show --name`).
137
+ - **`@me`:** check `likeness:checkEligibility` and fail with a clear "avatar likeness is region-gated /
138
+ not supported yet" hint (exit 11). Never silently drop.
139
+ - **Semantics:** each resolved mention stages the corresponding reference (entity-attach or UUID
140
+ `--ref`), deduped against explicitly passed `--ref` / `--reference-entity` flags; model reference caps
141
+ (`reference_cap_for`) enforced pre-submit. Prompt text keeps the name (minus `@`) so the model sees the
142
+ sentence Flow's chip would render.
143
+ - **Provenance:** record resolved mentions in `metadata_json` as `{name, kind, id}` (ids always;
144
+ names hashed under `GFLOW_CLI_HISTORY_PROMPTS=redacted` — see the spec § 6); structlog event per
145
+ resolution (`mention_resolved`, `mention_unresolved`).
146
+ - **MCP & CLI symmetry:** mention parsing lives in a shared service (`services/`), so the MCP generation
147
+ tools get it for free; parity enforced by `tests/mcp/test_cli_parity.py` (AGENTS.md § MCP & CLI Schema
148
+ Symmetry).
149
+ - Optional explicit form for scripts that don't want magic prompt parsing: `--tag NAME` (repeatable),
150
+ semantically identical to an `@NAME` mention — **Phase 3** (see § 8); not part of the first delivery.
151
+
152
+ ## 6. Spike plan (pre-implementation, ~1–2 Veo/Imagen credits)
153
+
154
+ `scripts/dev/spike_mention_capture.py`, run live on denon82 (same pattern as
155
+ `spike_movie_attach_payload.py`):
156
+
157
+ 1. **T-1 (0 credits):** in a crowded project, focus the prompt box, real-keystroke `@` (per-char
158
+ `keyboard.type`, not `insert_text`), dump the dropdown DOM (container role, tile addressing — is it
159
+ `fe_id_<id>` again?, search filtering, asset-type sections). *(Agentic-cohort repeat: optional —
160
+ Option-A prep only; run it only if H2 is proven.)*
161
+ 2. **T-2 (0 credits, optional):** select a character mention, then dump the Slate document (chip node
162
+ shape) — `document.querySelector('[data-slate-editor]')` innerHTML + Slate data attrs. *Only needed
163
+ if the T-3/T-4 POST captures are ambiguous, or if Option A is ever pursued.*
164
+ 3. **T-3 (1 credit, image):** submit with one character mention; capture the POST body
165
+ (`mentions_reference_entities` probe + full `requests[0]` keys) and diff it against a
166
+ `--reference-entity` submit body (already-captured shape, `api/image.py`). **Decides H1 vs H2** for
167
+ the image path: an identical body = H1.
168
+ 4. **T-4 (1 credit, video, optional if T-3 is conclusive):** same for `t2v`; diff against the known
169
+ picker-attach body from the movie captures.
170
+ 5. **T-5 (0 credits):** mention an *uploaded ingredient* (not a character); capture whether it lands in
171
+ `referenceImages` and with which `imageUsageType`.
172
+
173
+ Exit criteria: **one of three verdicts recorded here** — H1, H2, or **INCONCLUSIVE** (no chip could be
174
+ produced under automation, or captures ambiguous, or mixed per-path results — record per-path verdicts
175
+ separately in that case). INCONCLUSIVE or mixed is treated like H2 for gating: STOP and re-run
176
+ `/gflow:predict` with the evidence before implementation. Dropdown selector table (locale-free tiers)
177
+ appended if — and only if — Option A is ever needed.
178
+
179
+ ## 7. Risks & open questions
180
+
181
+ - **H2 positional parts** would force dropdown automation (Option A) — new selector surface on a
182
+ keystroke-sensitive widget, both cohorts, plus locale variance. Mitigated by spike-first gating.
183
+ - **Name collisions / renames:** display names are not unique; Flow's dropdown disambiguates visually,
184
+ a CLI cannot — exit-11 disambiguation (by id) is mandatory, and manifests should prefer ids.
185
+ - **Agentic cohort drift:** the agentic composer may render mentions differently or resolve them
186
+ server-side; the #174 include-lands-but-never-submits A/B applies to any staged-reference path —
187
+ reuse `ENTITY_ATTACH_DRIFT_HINT` backstops.
188
+ - **`@me`:** blocked on likeness eligibility (REGION) — ship detection + honest error only.
189
+ - **Prompt-expansion interaction:** `--tool creative-director` rewrites prompts — mentions must be
190
+ extracted **before** expansion and re-validated after (the expander must not invent or destroy tags);
191
+ simplest rule: resolve mentions first, pass the de-tagged text to the tool.
192
+ - **Movie style blocks / instructions cards:** `[style]` composition appends text — ensure composition
193
+ never corrupts `@` tokens (escaping tests).
194
+
195
+ ## 8. Phasing
196
+
197
+ | Phase | Deliverable | Gate |
198
+ |---|---|---|
199
+ | 0 | This recon doc | — |
200
+ | 1 | Capture spike (§6) → H1/H2 verdict recorded here | `/gflow:predict` on the chosen option |
201
+ | 2 | Mention resolver service + inline mentions — characters on `video t2v/r2v` (entity attach) and characters + media on `image t2i/i2i` (`--reference-entity` / UUID `--ref` paths) — + MCP parity + docs/tests | `/gflow:plan asset-tagging`, TDD, live e2e per verification-ledger norms |
202
+ | 3 | `movie` manifest mentions; `--tag` explicit form; **video-path media mentions** (requires the new r2v UUID-selection primitive); close `video --character` backlog via the same resolver | live e2e |
203
+ | 4 (held) | `@me` likeness — revisit when `checkEligibility` stops returning `REGION` | — |
@@ -8,9 +8,11 @@
8
8
  > built **greenfield off `develop`, NOT stacked on #123** (that branch is CONFLICTING and likeness-specific;
9
9
  > see [Design decisions](#11-design-decisions-post-predict)).
10
10
 
11
- > **Shipped scope:** `gflow character create` + `list` + `show` + `voices` + `rm`. The reuse path
12
- > `gflow video --character` (Phase 3) and `gflow image --character` are **not yet
13
- > implemented** — see [Backlog](#14-backlog--not-yet-implemented).
11
+ > **Shipped scope:** `gflow character create` + `list` + `show` + `voices` + `rm`. Name-based reuse via
12
+ > `@Name` prompt mentions is **shipped** (v0.40.0, [#344](https://github.com/ffroliva/gflow-cli/issues/344))
13
+ > for both `image` and `video` paths — see [REFERENCE_STRATEGIES](REFERENCE_STRATEGIES.md). An explicit
14
+ > `--character <id>` **flag** on `gflow video` (a separate, repeatable-ref delivery mechanism) remains
15
+ > **not yet implemented** — see [Backlog](#14-backlog--not-yet-implemented).
14
16
 
15
17
  > **Status (2026-06-02, LIVE-VERIFIED):** the create saga + character-editor UI generation are **shipped**
16
18
  > and verified end-to-end on denon82 (face + front/side/back triptych body, both reference slots bound,
@@ -259,9 +261,11 @@ both normalize to the canonical `Charon`) and sets `audioReferences[].presetVoic
259
261
 
260
262
  The `create` / `list` / `show` / `voices` commands below are **shipped and
261
263
  live-verified in v0.12.0** (the user-facing reference lives in
262
- [USAGE § `gflow character`](USAGE.md#gflow-character)). The `gflow video --character`
263
- reuse path and `gflow image --character` remain **backlog** (rows marked *not
264
- yet implemented*). `gflow character rm` is **shipped** (see the table below).
264
+ [USAGE § `gflow character`](USAGE.md#gflow-character)). Name-based reuse via
265
+ `@Name` prompt mentions is **shipped** (v0.40.0, #344) on both the image and
266
+ video paths. An explicit `--character <id>` **flag** on `gflow video`
267
+ remains **backlog** (row marked *not yet implemented*). `gflow character rm`
268
+ is **shipped** (see the table below).
265
269
 
266
270
  | Command | Maps to |
267
271
  |---|---|
@@ -269,9 +273,10 @@ yet implemented*). `gflow character rm` is **shipped** (see the table below).
269
273
  | `gflow character list --project <id> [--json]` *(SHIPPED v0.12.0)* | projectInitialData → entities[CHARACTER] |
270
274
  | `gflow character show --project <id> (--id <entityId> \| --name <displayName>) [--json]` *(SHIPPED v0.12.0)* | projectInitialData (single); name collision → exit 11 with disambiguation hint |
271
275
  | `gflow character voices [--json]` *(SHIPPED v0.12.0)* | list the 29 preset voices (name / description / sample-url); language-agnostic discovery, mirrors `gflow models --json` |
272
- | `gflow video … --character <id>` *(repeatable → multi-ref)* | **not yet implemented** (Phase 3) — `referenceEntities` on `video:batchAsyncGenerateVideoReferenceImages` |
276
+ | `gflow video … --character <id>` *(repeatable → multi-ref, explicit flag)* | **not yet implemented** (Phase 3) — `referenceEntities` on `video:batchAsyncGenerateVideoReferenceImages` |
273
277
  | `gflow character rm` (`--id`/`--name`) | **Shipped v0.13.0 (#150)** — `POST flow:batchDeleteAssets` (Bearer; FREE — no reCAPTCHA/credit) |
274
- | `gflow image … --character <id>` | **not yet implemented** — image-path `referenceEntities` uncaptured |
278
+ | `gflow image … --character <id>` *(explicit flag)* | id-based reuse **shipped** as `gflow image t2i/i2i --reference-entity <id>` (wire captured 2026-06-08, `api/image.py`) |
279
+ | `@Name` in a t2i/i2i/video prompt | name-based mention resolution **shipped v0.40.0 (#344)** — resolves to the staged character entity, works on both image and video paths; see [REFERENCE_STRATEGIES](REFERENCE_STRATEGIES.md) |
275
280
 
276
281
  All commands take **`--project <id>` (required)** — every endpoint (`createEntity`, `projectInitialData`,
277
282
  reuse) is project-scoped; mirrors `gflow scene` / `gflow data` ergonomics. Use `--id`/`--name` flags, never a
@@ -305,7 +310,8 @@ never hard-code wire names in user-facing help — see [[cli-model-aliases-verif
305
310
  ## 10. Open items
306
311
 
307
312
  See [§14 Backlog — not yet implemented](#14-backlog--not-yet-implemented) for the consolidated list. In
308
- short: `gflow video --character` reuse (Phase 3), `gflow image --character`, live voice
313
+ short: an explicit `--character <id>` flag on `gflow video` reuse (Phase 3; `@Name` prompt mentions
314
+ already ship this on both image and video, see #344), live voice
309
315
  listing + `presetVoiceId` wire-case confirmation, custom-voice creation, `nanopro` picker live confirmation,
310
316
  and extra body angles. The optional creation-agent (`flowCreationAgent/sessions`,
311
317
  `flow.generateCharacterPrompt` archetypes) is not required for the scripted path; consider an `--archetype`
@@ -490,14 +496,19 @@ The following are explicitly **out of the shipped scope** and tracked for future
490
496
  - **Model-picker live confirmation.** `--model nanopro` is wired **best-effort / non-fatal** (a picker miss
491
497
  warns and continues rather than failing); an explicit live run is needed to confirm `nanopro` is actually
492
498
  selected in the character editor.
493
- - **`gflow video --character` (Phase 3).** Reuse a character in a video generation via `referenceEntities`
494
- on `video:batchAsyncGenerateVideoReferenceImages` (repeatable → multi-reference). Wire protocol is captured
495
- (§5, §6.6) but the command is **not yet built**.
499
+ - **`gflow video --character <id>` (explicit flag, Phase 3).** Reuse a character in a video generation via
500
+ an explicit repeatable `--character <id>` flag, as a `referenceEntities` alternative to `@Name` prompt
501
+ mentions (which already work on the video path, shipped v0.40.0/#344). Wire protocol is captured (§5,
502
+ §6.6) but the flag-based command is **not yet built**.
496
503
  - **Extra body angles beyond the built-in triptych.** The shipped body slot generates a single front/side/back
497
504
  triptych. Generating additional angles/poses (e.g. re-feeding the front view as a reference seed for a new
498
505
  slot) is a future enhancement.
499
- - **`gflow image --character`.** The **image-path** reuse (`referenceEntities` on the image endpoint) is
500
- uncaptured — deferred until its wire shape is reverse-engineered. (`gflow character rm` is now shipped, #150.)
506
+ - ~~**`gflow image --character` (name-based).**~~ **Shipped v0.40.0 (#344)** as `@Name` prompt mentions
507
+ (`services/mentions.py`), on both image and video paths for character references. The image-path wire
508
+ shape (`gflow image t2i/i2i --reference-entity <id>`) shipped earlier (live capture 2026-06-08,
509
+ `api/image.py`; asserted by `_assert_image_entities_attached`). See
510
+ [REFERENCE_STRATEGIES](REFERENCE_STRATEGIES.md) for the decision guide across all three mechanisms.
511
+ (`gflow character rm` is now shipped, #150.)
501
512
  - **Set the Flow editor title field** so the editor isn't "Untitled Character" (see [§13.1 Known issues](#131-known-issues)).
502
513
  Investigate either the UI title box (with a Ctrl+A merge-bug workaround) or finding the dedicated title
503
514
  field/endpoint that the editor widget reads from, distinct from `entityInfo.displayName`.
@@ -133,6 +133,39 @@ For T2V the sequence is split: `record_started_video(...)` fires the moment the
133
133
 
134
134
  For batches, each row is recorded individually in a per-row `try/except DataStoreError`, so one row's persistence failure does not stop the rest of the batch.
135
135
 
136
+ ### Failure recording (#341, v0.39.0+)
137
+
138
+ Failed generations are first-class catalog citizens: every paid-generation
139
+ orchestrator records a terminal `status="failed"` operation row before
140
+ re-raising the error. The funnel covers `video t2v/i2v/r2v`, `video chain`
141
+ (per-link, via the `on_link_failed` hook), `image t2i/i2i`, multi-prompt
142
+ t2i / `gflow run` / `image batch` manifest rows, `movie run` scenes, and the
143
+ async worker (which mirrors its `generation_queue.error_json` failure into
144
+ `operations` — the operations table owns terminal truth).
145
+
146
+ - `error_type` is the last segment of the exception's RFC 9457 `problem_type`
147
+ URI (`waf-rejection`, `content-policy`, `auth-expired`,
148
+ `transport-timeout`, ...) — the taxonomy is declared per `GFlowError`
149
+ subclass, never hand-mapped. Non-`GFlowError` exceptions store the class
150
+ name, with `error_detail` reduced to a SHA-256 hash of the message (never
151
+ the text — it may carry tokens).
152
+ - Video failures UPDATE every `on_started` STARTED row to `failed` (a
153
+ `count>1` request fires the callback per output — no sibling row is
154
+ stranded); failures before `on_started`, and all image failures, INSERT a
155
+ fresh row with full request metadata.
156
+ - A poll that COMPLETES with a Flow-reported failure (`succeeded=false`) is
157
+ recorded as `failed` with `error_type=generation-failed` and the
158
+ `failure_reasons` as detail — not as a success.
159
+ - The write itself is best-effort: `record_failed_operation_safe` wraps it in
160
+ a broad warn-only guard (`failure_record_skipped` structlog event) so a
161
+ data-layer fault can never mask the generation error or change the exit code.
162
+ - The character-create saga deliberately keeps its STARTED rows for resume —
163
+ it is excluded from the failure funnel by design.
164
+ - `failed` rows accumulate without an automatic cap in this release: `gflow
165
+ data prune` targets stale in-flight/completed entries, not failed-operation
166
+ history. Bounded retention and a dedicated export are tracked in
167
+ [#345](https://github.com/ffroliva/gflow-cli/issues/345).
168
+
136
169
  ---
137
170
 
138
171
  ## Persistence-failure handling
@@ -179,6 +212,20 @@ The hash is always stored so you can correlate without the plaintext.
179
212
 
180
213
  This means the recorder OWNS redaction — call sites cannot leak signed URLs into the DB even by accident, because `OperationRecorder` always pipes metadata through `redact_metadata` before writing.
181
214
 
215
+ ### `error_detail` redaction (#341)
216
+
217
+ Failure rows persist the exception's Problem-Details `detail` string through
218
+ [`redact_error_detail`](../src/gflow_cli/data/redaction.py): free-text
219
+ `Bearer …` / `SAPISIDHASH …` tokens and auth-cookie pairs become
220
+ `<redacted:secret>`, URLs carrying signed-query markers become
221
+ `<redacted:url>`, and the result is truncated to 500 chars post-redaction as
222
+ defense-in-depth. The experimental REST transports also redact response bodies
223
+ BEFORE truncating them into exception messages, so a clipped secret can't
224
+ reach the DB. Non-`GFlowError` details are stored only as SHA-256 hashes.
225
+ Prompts on FAILED rows honor `GFLOW_CLI_HISTORY_PROMPTS` exactly like success
226
+ rows — note that in `store` mode this includes prompts of content-policy
227
+ REJECTED generations (the same opt-in that stores successful prompts).
228
+
182
229
  ### What the DB still contains
183
230
 
184
231
  Even with `redacted` mode and metadata stripping, the DB stores: profile names, Flow project/media/workflow/operation IDs, local file paths or cloud URIs, asset dimensions/seeds/timestamps, model and aspect choices, and prompt hashes. If your threat model requires hiding even profile-level activity, exclude `<GFLOW_CLI_HOME>/gflow.db` from backups or set `GFLOW_CLI_DB_PATH` to a per-task ephemeral location.
@@ -189,7 +236,7 @@ See [`SECURITY.md`](SECURITY.md) for the broader threat model.
189
236
 
190
237
  ## Querying the data layer
191
238
 
192
- ### `gflow data list {projects,images,videos,profiles}` — browse the catalog (v0.9.0+)
239
+ ### `gflow data list {projects,images,videos,profiles,errors}` — browse the catalog (v0.9.0+)
193
240
 
194
241
  ```bash
195
242
  # Newest 20 projects across all profiles
@@ -206,9 +253,14 @@ gflow data list videos --json | jq '.media_id'
206
253
 
207
254
  # Profiles with at least one recorded generation
208
255
  gflow data list profiles
256
+
257
+ # Failed generations, newest first (#341): when, which command/mode/model,
258
+ # stable error_type (waf-rejection, content-policy, ...) + redacted detail.
259
+ # The dataset for WAF-cadence and reliability analysis.
260
+ gflow data list errors --profile denon82 --json | jq '{started_at, error_type}'
209
261
  ```
210
262
 
211
- Flags shared by all four subcommands:
263
+ Flags shared by all five subcommands:
212
264
 
213
265
  | Flag | Default | Notes |
214
266
  |---|---|---|
@@ -392,6 +444,13 @@ All three are subclasses of `GFlowError` and re-exported through `gflow_cli.exce
392
444
 
393
445
  See [`errors.py::EXIT_CODE_MAP`](../src/gflow_cli/errors.py) for the complete exit-code mapping.
394
446
 
447
+ Distinct from the above (which are errors OF the data layer), the
448
+ `operations.error_type` column stores the taxonomy of RECORDED generation
449
+ failures — the last segment of each exception's `problem_type` URI. Common
450
+ values: `waf-rejection` (HTTP 403 / WAF), `content-policy`, `auth-expired`,
451
+ `transport-timeout`, `wire-format`, `rate-limit`, `ui-mode-unavailable`
452
+ (cohort pin), `media-attribution`. Query them with `gflow data list errors`.
453
+
395
454
  ---
396
455
 
397
456
  ## Extending the data layer
@@ -36,6 +36,7 @@ Welcome to the `gflow-cli` documentation. This index is the routing layer: it te
36
36
  | **[docs/SECURITY.md](SECURITY.md)** | What secrets are stored where, threat model, hardening | Audit, code review, multi-user machines |
37
37
  | **[docs/DATA_LAYER.md](DATA_LAYER.md)** | Local SQLite catalog: goals, schema, recording flow, redaction, `gflow data` CLI, migrations, extension guide | Anything touching `gflow_cli.data`, debugging missing rows, building I2V/repair tooling, auditing what is stored |
38
38
  | **[docs/CHARACTER.md](CHARACTER.md)** | Characters feature spec & system design: domain model, endpoint/cost matrix, sequence diagrams, JSON payloads (I/O), CLI surface, reuse via `referenceEntities` (#145) | Working on `gflow character`, reusing a character in generations, or understanding Flow's character wire protocol |
39
+ | **[docs/REFERENCE_STRATEGIES.md](REFERENCE_STRATEGIES.md)** | How to reference an asset: `@Name` mention vs `--reference-entity` vs `--ref` — the two-axis model (identity vs image), same-wire+dedupe rule, per-path support matrix, image-less-entity prerequisite, agent rule | Deciding how to tag a saved character/asset in a prompt, or wiring `@`-mentions into a generation |
39
40
  | **[docs/MOVIE.md](MOVIE.md)** | `gflow movie` — multi-scene character-consistent films: manifest format, run lifecycle (browser stays open through generate→poll→download), entity-attach mechanism (Personagens right-click), resume/handoff, credits | Working on `gflow movie`, debugging scene generation, or understanding the character-entity attach + consistency model |
40
41
  | **[docs/TOOLS.md](TOOLS.md)** | Tools framework: the `gflow tools list/show/run` group, the `--tool/-t` option on generation commands, the TOML tool schema, how a tool is defined, "My Tools" user-authored tools, MCP exposure + §61 parity | Working on `gflow_cli.tools`, adding a built-in or user tool, or wiring `--tool` into a command |
41
42
  | **[docs/INSTRUCTIONS.md](INSTRUCTIONS.md)** | Agent Instructions: project-brief cards for Flow's Agent Mode — the mechanism (enabled cards steer generation via the reasoning path), ephemeral `-i` vs persistent cards, the `gflow instructions` CRUD surface with the single generic `--ref` (image **or** character), and the 3-layer pipeline | Working on `-i`/agent instructions, the `gflow instructions` group, or understanding how the project brief anchors generations |
@@ -43,12 +44,15 @@ Welcome to the `gflow-cli` documentation. This index is the routing layer: it te
43
44
  | **[docs/PROMPT_EXPANSION.md](PROMPT_EXPANSION.md)** | The `creative-director` tool: 5-component formula, 15 domain styles, banned-keyword policy, Gemini endpoint + I/O, never-fatal contract, `expanded_prompt` + `metadata_json.tool` provenance/redaction, config | Using or debugging `--tool creative-director`, editing the tool TOML, or auditing recorded prompt provenance |
44
45
  | **[docs/IMAGE_UPSCALE_RECON.md](IMAGE_UPSCALE_RECON.md)** | `gflow image upscale` wire protocol: `upsampleImage` endpoint, full clientContext (projectId/sessionId/tool/userPaygateTier), reCAPTCHA action `IMAGE_GENERATION`, inline base64 response, 4K Ultra-gating, REST-is-dead proof | Working on `gflow image upscale`, debugging the 403/reCAPTCHA path, or understanding Flow's image-upscale wire protocol (#171) |
45
46
  | **[docs/AGENT_UI_RECON.md](AGENT_UI_RECON.md)** | Agentic Flow UI cohort: classic-vs-agentic DOM signature, server-side + volatile (flapping) A/B gating (no client-readable flag), why `_exit_agent_mode` fails, runtime-DOM-detection recommendation | Touching `_exit_agent_mode` / composer mode-switch, diagnosing exit 23 selector drift, or understanding Flow's agentic-UI A/B (#183/#174) |
47
+ | **[docs/ASSET_TAGGING_RECON.md](ASSET_TAGGING_RECON.md)** | `@`-mention asset tagging research & integration design: what Flow's `@CharacterName`/`@me`/`@ingredient` tags are, how they map onto the already-verified `referenceEntities`/`referenceImages` wire, the H1-vs-H2 serialization hypothesis, the CLI-side mention-resolver proposal, and the pre-implementation capture spike plan | Working on inline `@` mentions in prompts, `video --character` reuse, or planning the mention-capture spike |
46
48
  | **[tasks/lessons.md](../tasks/lessons.md)** | Running notebook of patterns + reviewer findings, dated and traced to commits | Starting a new phase; debugging "why did the council flag this?" |
47
49
  | **[skills/README.md](../skills/README.md)** | Installable agent skill docs (gflow-cli, predict, pr-council-review, scenario) — cross-tool portable Markdown consumed by Claude Code, Cursor, Codex, Gemini CLI, Aider, etc. | Any agent wanting to use gflow-cli correctly |
48
50
  | **[scripts/dev/skillopt/README.md](../scripts/dev/skillopt/README.md)** | SkillOpt mock harness — rollout→score loop for measuring and improving skill doc accuracy across multiple LLM providers | Measuring a skill edit's impact; comparing Claude vs GPT-4o vs Gemini on gflow tasks |
49
51
  | **[scripts/diag/README.md](../scripts/diag/README.md)** | Diagnostic investigation scripts — run against a live authenticated profile to capture wire samples, measure Chrome memory, or mint reCAPTCHA tokens | Running a one-off investigation against a live Flow session; establishing baseline measurements for issue #155 |
50
52
  | [docs/superpowers/specs/2026-07-04-pr-triage-autopilot-design.md](superpowers/specs/2026-07-04-pr-triage-autopilot-design.md) | PR-triage autopilot design spec: Stage 0/1 gate, Docker sandboxing, Telegram and audit ledger | Reviewing or auditing the automated PR-triage setup |
51
53
  | [docs/superpowers/plans/2026-07-08-pr-triage-autopilot/PLAN.md](superpowers/plans/2026-07-08-pr-triage-autopilot/PLAN.md) | Implementation plan for the PR-Triage Autopilot | Tracking task-by-task execution |
54
+ | [docs/superpowers/specs/2026-07-18-asset-tagging-design.md](superpowers/specs/2026-07-18-asset-tagging-design.md) | Asset-tagging (`@`-mention) design spec: mention grammar, resolution contract, Option-B architecture, error taxonomy, spike gate | Reviewing or implementing the `@`-mention feature |
55
+ | [docs/superpowers/plans/2026-07-18-asset-tagging/PLAN.md](superpowers/plans/2026-07-18-asset-tagging/PLAN.md) | Task-by-task implementation plan for asset tagging (spike gate → resolver → CLI/MCP → live e2e) | Tracking task-by-task execution of the `@`-mention feature |
52
56
 
53
57
  ## Agent commands
54
58
 
@@ -84,6 +88,7 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
84
88
  **"How do I chain clips into one continuous video (initial-frame I2V)?"** → [USAGE § `gflow video chain`](USAGE.md#gflow-video-chain)
85
89
  **"How do I stitch existing clips into one extended .mp4 (credit-free, no ffmpeg)?"** → [USAGE § `gflow scene`](USAGE.md#gflow-scene)
86
90
  **"How do I create a reusable character (face + body) I can reuse across generations?"** → [USAGE § `gflow character`](USAGE.md#gflow-character) · design: [CHARACTER](CHARACTER.md)
91
+ **"Should I use an `@mention`, `--reference-entity`, or `--ref` to tag an asset?"** → [REFERENCE_STRATEGIES](REFERENCE_STRATEGIES.md) — saved named identity → `@Name`/`--reference-entity`; one-off image → `--ref`
87
92
  **"How do I turn a terse prompt into a vivid one before generating?"** → `--tool creative-director:style=cinema` on any generation command — see [PROMPT_EXPANSION](PROMPT_EXPANSION.md) · framework: [TOOLS](TOOLS.md)
88
93
  **"What tools are available and what styles do they support?"** → run `gflow tools list` / `gflow tools show creative-director` — see [TOOLS](TOOLS.md)
89
94
  **"How do I make Flow's agent follow a style/reference across a project's generations?"** → agent instruction cards — ephemeral `-i "text"` (shipped) or the persistent `gflow instructions` group with a generic `--ref` (image or character), see [INSTRUCTIONS](INSTRUCTIONS.md)
@@ -125,8 +130,8 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
125
130
  **"A gflow command hangs / fails — where do I start?"** → [DEBUGGING § Quick reference](DEBUGGING.md#quick-reference)
126
131
  **"Flow's UI broke a selector — how do I diagnose it?"** → [DEBUGGING § Inspecting Flow's live UI](DEBUGGING.md#inspecting-flows-live-ui)
127
132
  **"What does each `ui_automation.*` log event mean?"** → [DEBUGGING § Listener & HTTP-layer debugging](DEBUGGING.md#listener--http-layer-debugging)
128
- **What was actually live-verified for the latest release?** → latest: [LIVE_VERIFICATION_v0.38.1](LIVE_VERIFICATION_v0.38.1.md) (**#338 agentic-pin recovery proven live ON the pinned account** — run 1 caught the composer-render race the unit suite could not [`ensure_media_incomplete` +115 ms, toggle never reached]; the readiness-wait fix landed and run 2 recovered classic on denon82 after ~2h of pin [`ui_driver.bound mode=classic`, real 768×1376 JPEG, exact prompt adherence]; reload branch unit-locked, live trigger not observed this cycle — recorded, not omitted). Prior: [v0.38.0](LIVE_VERIFICATION_v0.38.0.md) (**#332 mode control + #314 i2i ref dedup proven live e2e** — `image t2i --ui-mode classic` recovered agentic→classic in a real run [`ui_mode.attempt_exit_agent` → full classic chain, 1376×768 JPEG]; two identical `image i2i` runs proved the dedup contract [run 1: picker miss → `image_uploaded`; run 2: `reference_deduped_by_filename`, ZERO uploads]; `video t2v` veo-fast [`MEDIA_GENERATION_STATUS_SUCCESSFUL`, 15.2 MB `ftyp` mp4]; autopilot #333 recorded deferred-with-reason [hermes-ops deployment staged separately]). Prior: [v0.37.0](LIVE_VERIFICATION_v0.37.0.md) (**viewport 1920×1080 + agentic count enforcement + FIPS-safe SAPISIDHASH proven live e2e** — `image t2i` [classic cohort, real 1376×768 JPEG] and `video t2v` veo-fast [`MEDIA_GENERATION_STATUS_SUCCESSFUL`, 11.5 MB `ftyp` mp4] both succeeded end-to-end at the new 1920×1080 viewport with every selector resolving [no drift]; SAPISIDHASH digest verified byte-identical [FIPS-safe `usedforsecurity=False`], auth unchanged). Prior: [v0.36.0](LIVE_VERIFICATION_v0.36.0.md) (**#316 diagnostic tooling live-verified against real Flow traffic** — `GFLOW_CLI_HAR_PATH` captured a real 54-entry HAR [real Flow domains, 34× 200s, and a genuine 401 the tool exists to diagnose]; `GFLOW_CLI_DEBUG_TRACEBACK`'s typed-error scoping confirmed live [console output identical with/without the flag on a `GFlowError`]; unhandled-path behavior covered by 6 new tests (30 total across both files) + SDD task review; #312 reference-entity-smuggling fix covered by its own dedicated e2e test). Prior: [v0.35.0](LIVE_VERIFICATION_v0.35.0.md) (**#305-follow-up multimodal reverse-engineering & storyboard tool proven live e2e** — `gflow tools run storyboard` successfully deconstructed a cyberpunk scene into a cohesive 4-panel sequence; `reverse-engineer` tool extracts frames from video streams/URLs using `claude-video`'s `watch.py` and produces structured prompt components using Gemini multimodal models; dynamic token budgeting and strict Pyright types verified via test suite). Prior: [v0.34.0](LIVE_VERIFICATION_v0.34.0.md) (**#299 `--ui-mode` gate proven live, ZERO credits** — drove `get_ui_driver` directly over 4 real editor loads, never generated: bidirectional switch works [classic→agentic via `_force_agent_mode`, agentic→classic via `_exit_agent_mode`, each DOM-reverified], `agentic`-when-already-agentic is idempotent, and a timed-out toggle → **exit-28 fail-fast before submission**; deprecation behavior-change [`prefer_classic`→exit 28] confirmed). Prior: [v0.33.0](LIVE_VERIFICATION_v0.33.0.md) (**#287-follow-up picker fix proven live on the original repro** — the v0.32.1-failing `i2v <uuid> --project <crowded>` command now exits 0 with a real 3.0 MB `ftyp` mp4, `frame_ref_attached` + `video_saved`, zero uploads; **#241 jitter live-verified on both paths** — flag `--jitter 4-6` → `batch_jitter_sleep seconds=4.98`, and the new 0.5–1.5 s default → `seconds=1.47`, each firing exactly once between two t2i submissions; environment note: the denon82 cohort is now natively agentic and round-2 generations hit the pre-existing #281 `MediaAttributionError`, not a regression). Prior: [v0.32.1](LIVE_VERIFICATION_v0.32.1.md) (**#293 teardown fix live-verified credit-free** — error-path aborts leave ZERO chrome.exe holding the profile [3× leak reproduced pre-fix same day]; force-close fallback + ProfileLockedError translation unit-pinned; #283 wave logic fixes mock-verified to exact call counts). Prior: [v0.32.0](LIVE_VERIFICATION_v0.32.0.md) (**#287 UUID i2v frames proven live e2e** — an in-project asset selected by media UUID in the frame-slot dialog [frame_ref_attached, startImage bound on the wire, ZERO upload events] produced a real 720×1280 interpolation, resolving the #237 negative prior; foreign UUID → exit 9 pre-generation with screenshot; **#288 duration fail-fast proven live** — exit 23 pre-submit saved a 10-credit generation, and the debug screenshot confirmed the duration control is ABSENT from the cohort's settings popover [locale hypothesis refuted]; upload-400 exit-27 repro deferred-with-reason — the original rejected JPEG no longer exists). Prior: [v0.31.0](LIVE_VERIFICATION_v0.31.0.md) (**#281 wrong-media defenses live-verified in BOTH directions, credit-free** — correct attribution downloads with real wire metadata [seed, 768×1376]; the incident-class lazy-render ambiguity reproduced live and hard-stopped with `MediaAttributionError` exit 26 naming every candidate UUID, no file written; **#282 two-UUID-ref i2i proven e2e** — both freshly generated portrait UUIDs picker-selected into one scene with both canonical identities visually transferred). Prior: [v0.30.0](LIVE_VERIFICATION_v0.30.0.md) (**agentic-cohort image path + both fixes live-verified credit-free** — native 768×1376 stills, i2i-chain + canonical-ref identity hold; the character-create `DataIntegrityError` and the `prefer_classic` WARNING were observed live then fixed [recorder idempotent + INFO log]; MCP video-param feature deferred-with-reason on Veo credits, per the stills-only goal). Prior: [v0.29.0](LIVE_VERIFICATION_v0.29.0.md) (**persistent `gflow instructions` CRUD proven live e2e GREEN, credit-free** — 11-command sequence on a fresh project: add incl. `--ref <image-UUID>` attach, list/enable/disable, master toggle both ways, TOML `apply` destructive full-sync with `enabled=false` honored, `rm` with server card-id preserved across mutations; movie brief-sync code-path-verified via the same primitives, deferred-with-reason on credits; MCP `gflow_instructions_*` tools are thin adapters over the live-verified primitives). Prior: [v0.28.0](LIVE_VERIFICATION_v0.28.0.md) (**agent instructions `-i` now steer agentic generation — crayon e2e GREEN**: a style-neutral prompt + an enabled "crayon" card produced an unmistakable crayon drawing through the real transport; root causes were conversational phrasing + the `project_brief.enabled` master switch). Prior: [v0.27.1](LIVE_VERIFICATION_v0.27.1.md) (**v0.27.0 release follow-up fixes and documentation sync**). Prior: [v0.27.0](LIVE_VERIFICATION_v0.27.0.md) (**`[style]` block with named variants + prompt-aware resume — credit-free CLI verification**: real `movie run --dry-run` 3-way ledger proving resolved-style display, `skip (done)` on matching `style_hash`, and `re-run (style changed)` after a style edit; composition is local, wire path untouched, so no Veo credits spent — first credited styled run will confirm visually). Prior: [v0.26.0](LIVE_VERIFICATION_v0.26.0.md) (**image i2i by generated-image UUID proven live e2e GREEN** — the existing asset is *selected in place* by its media UUID, no duplicate upload, producing an i2i output that references it; plus generated-image `display_name` capture, credited @C1ph3r404). Prior: [v0.25.0](LIVE_VERIFICATION_v0.25.0.md) (**#237 remote-UUID i2v proven live e2e GREEN** — a real 8s 720×1280 interpolation from a generated image's UUID, after the picker-search attach was reworked to local upload; #240 home-`.env` matrix live; plus two silent-failure guards root-caused live: video-as-image download rejection and rejected-upload fail-loud). Prior: [v0.24.0](LIVE_VERIFICATION_v0.24.0.md) (--project parity across CLI + MCP — automated coverage; live gen auth-gated). Prior: [v0.23.0](LIVE_VERIFICATION_v0.23.0.md) (MCP generation wiring proven live end-to-end — tool→worker→real Flow REST→structured-error translation; final image-write blocked by an expired session, environmental. #222 macOS fix reporter-verified e2e on Apple Silicon). Prior: [v0.22.0](LIVE_VERIFICATION_v0.22.0.md) (Tools framework — automated/CI coverage complete; credit/key-gated live feature run is a pending owner gate, see the doc) · [v0.21.0](LIVE_VERIFICATION_v0.21.0.md) (MCP server over stdio + HTTP/SSE — credit-free protocol handshake; 4 tools / 2 prompts / 3 resources confirmed on stdout) · [v0.20.1](LIVE_VERIFICATION_v0.20.1.md) · [v0.20.0](LIVE_VERIFICATION_v0.20.0.md) · [v0.19.0](LIVE_VERIFICATION_v0.19.0.md) · [v0.18.0](LIVE_VERIFICATION_v0.18.0.md) · [v0.17.0](LIVE_VERIFICATION_v0.17.0.md) · [v0.16.0](LIVE_VERIFICATION_v0.16.0.md) · [v0.13.0](LIVE_VERIFICATION_v0.13.0.md) · [v0.12.0](LIVE_VERIFICATION_v0.12.0.md) · [v0.11.0](LIVE_VERIFICATION_v0.11.0.md) · [v0.10.0](LIVE_VERIFICATION_v0.10.0.md) · [v0.9.1](LIVE_VERIFICATION_v0.9.1.md) · [v0.9.0](LIVE_VERIFICATION_v0.9.0.md) · [v0.8.1](LIVE_VERIFICATION_v0.8.1.md) · [v0.7.0](LIVE_VERIFICATION_v0.7.0.md)
129
- **"Where is the reverse-engineered wire protocol for a feature?"** → the `*_RECON.md` design docs: [CHARACTER_RECON](CHARACTER_RECON.md) (Flow character entity protocol), [IMAGE_UPSCALE_RECON](IMAGE_UPSCALE_RECON.md) (`/v1/flow/upsampleImage` wire). Naming convention: one `<FEATURE>_RECON.md` per reverse-engineered surface, kept as the durable spec after the feature ships.
133
+ **What was actually live-verified for the latest release?** → latest: [LIVE_VERIFICATION_v0.40.0](LIVE_VERIFICATION_v0.40.0.md) (**#344 `@`-mention asset-tagging resolution proven live e2e, ~2 Imagen credits** — `gflow character create` staged a real taggable character [bound reference images, `has_reference_images` guard], the e2e test's documented propagation wait cleared Flow's `projectInitialData` lag, and `gflow image t2i "@Zoro …"` passed with returncode 0, a real generated image, and the correctly de-tagged prompt in the catalog — no code changes needed, `resolve_and_apply` as merged in #344 already works end-to-end; pre-existing unrelated issue #174 [Flow media-library A/B flake] can still intermittently block generation regardless of this feature — recorded, not omitted). Prior: [v0.39.0](LIVE_VERIFICATION_v0.39.0.md) (**#341 failed-generation persistence proven live** — a real `image t2i` on denon82 failed at the wire [`batchGenerateImages` HTTP 400 → `WireFormatError`] and the record-on-catch funnel wrote the **first-ever `failed` row** into the production catalog [`error_type=wire-format`, redacted `error_detail`, browsable via `gflow data list errors`], **$0**; the remaining paid paths [video/chain/batch/movie/worker] are funnel-regression-tested, not force-failed live [would cost credits], and the status-aware `succeeded=false` video-poll fix is unit-locked — recorded, not omitted). Prior: [v0.38.1](LIVE_VERIFICATION_v0.38.1.md) (**#338 agentic-pin recovery proven live ON the pinned account** — run 1 caught the composer-render race the unit suite could not [`ensure_media_incomplete` +115 ms, toggle never reached]; the readiness-wait fix landed and run 2 recovered classic on denon82 after ~2h of pin [`ui_driver.bound mode=classic`, real 768×1376 JPEG, exact prompt adherence]; reload branch unit-locked, live trigger not observed this cycle — recorded, not omitted). Prior: [v0.38.0](LIVE_VERIFICATION_v0.38.0.md) (**#332 mode control + #314 i2i ref dedup proven live e2e** — `image t2i --ui-mode classic` recovered agentic→classic in a real run [`ui_mode.attempt_exit_agent` → full classic chain, 1376×768 JPEG]; two identical `image i2i` runs proved the dedup contract [run 1: picker miss → `image_uploaded`; run 2: `reference_deduped_by_filename`, ZERO uploads]; `video t2v` veo-fast [`MEDIA_GENERATION_STATUS_SUCCESSFUL`, 15.2 MB `ftyp` mp4]; autopilot #333 recorded deferred-with-reason [hermes-ops deployment staged separately]). Prior: [v0.37.0](LIVE_VERIFICATION_v0.37.0.md) (**viewport 1920×1080 + agentic count enforcement + FIPS-safe SAPISIDHASH proven live e2e** — `image t2i` [classic cohort, real 1376×768 JPEG] and `video t2v` veo-fast [`MEDIA_GENERATION_STATUS_SUCCESSFUL`, 11.5 MB `ftyp` mp4] both succeeded end-to-end at the new 1920×1080 viewport with every selector resolving [no drift]; SAPISIDHASH digest verified byte-identical [FIPS-safe `usedforsecurity=False`], auth unchanged). Prior: [v0.36.0](LIVE_VERIFICATION_v0.36.0.md) (**#316 diagnostic tooling live-verified against real Flow traffic** — `GFLOW_CLI_HAR_PATH` captured a real 54-entry HAR [real Flow domains, 34× 200s, and a genuine 401 the tool exists to diagnose]; `GFLOW_CLI_DEBUG_TRACEBACK`'s typed-error scoping confirmed live [console output identical with/without the flag on a `GFlowError`]; unhandled-path behavior covered by 6 new tests (30 total across both files) + SDD task review; #312 reference-entity-smuggling fix covered by its own dedicated e2e test). Prior: [v0.35.0](LIVE_VERIFICATION_v0.35.0.md) (**#305-follow-up multimodal reverse-engineering & storyboard tool proven live e2e** — `gflow tools run storyboard` successfully deconstructed a cyberpunk scene into a cohesive 4-panel sequence; `reverse-engineer` tool extracts frames from video streams/URLs using `claude-video`'s `watch.py` and produces structured prompt components using Gemini multimodal models; dynamic token budgeting and strict Pyright types verified via test suite). Prior: [v0.34.0](LIVE_VERIFICATION_v0.34.0.md) (**#299 `--ui-mode` gate proven live, ZERO credits** — drove `get_ui_driver` directly over 4 real editor loads, never generated: bidirectional switch works [classic→agentic via `_force_agent_mode`, agentic→classic via `_exit_agent_mode`, each DOM-reverified], `agentic`-when-already-agentic is idempotent, and a timed-out toggle → **exit-28 fail-fast before submission**; deprecation behavior-change [`prefer_classic`→exit 28] confirmed). Prior: [v0.33.0](LIVE_VERIFICATION_v0.33.0.md) (**#287-follow-up picker fix proven live on the original repro** — the v0.32.1-failing `i2v <uuid> --project <crowded>` command now exits 0 with a real 3.0 MB `ftyp` mp4, `frame_ref_attached` + `video_saved`, zero uploads; **#241 jitter live-verified on both paths** — flag `--jitter 4-6` → `batch_jitter_sleep seconds=4.98`, and the new 0.5–1.5 s default → `seconds=1.47`, each firing exactly once between two t2i submissions; environment note: the denon82 cohort is now natively agentic and round-2 generations hit the pre-existing #281 `MediaAttributionError`, not a regression). Prior: [v0.32.1](LIVE_VERIFICATION_v0.32.1.md) (**#293 teardown fix live-verified credit-free** — error-path aborts leave ZERO chrome.exe holding the profile [3× leak reproduced pre-fix same day]; force-close fallback + ProfileLockedError translation unit-pinned; #283 wave logic fixes mock-verified to exact call counts). Prior: [v0.32.0](LIVE_VERIFICATION_v0.32.0.md) (**#287 UUID i2v frames proven live e2e** — an in-project asset selected by media UUID in the frame-slot dialog [frame_ref_attached, startImage bound on the wire, ZERO upload events] produced a real 720×1280 interpolation, resolving the #237 negative prior; foreign UUID → exit 9 pre-generation with screenshot; **#288 duration fail-fast proven live** — exit 23 pre-submit saved a 10-credit generation, and the debug screenshot confirmed the duration control is ABSENT from the cohort's settings popover [locale hypothesis refuted]; upload-400 exit-27 repro deferred-with-reason — the original rejected JPEG no longer exists). Prior: [v0.31.0](LIVE_VERIFICATION_v0.31.0.md) (**#281 wrong-media defenses live-verified in BOTH directions, credit-free** — correct attribution downloads with real wire metadata [seed, 768×1376]; the incident-class lazy-render ambiguity reproduced live and hard-stopped with `MediaAttributionError` exit 26 naming every candidate UUID, no file written; **#282 two-UUID-ref i2i proven e2e** — both freshly generated portrait UUIDs picker-selected into one scene with both canonical identities visually transferred). Prior: [v0.30.0](LIVE_VERIFICATION_v0.30.0.md) (**agentic-cohort image path + both fixes live-verified credit-free** — native 768×1376 stills, i2i-chain + canonical-ref identity hold; the character-create `DataIntegrityError` and the `prefer_classic` WARNING were observed live then fixed [recorder idempotent + INFO log]; MCP video-param feature deferred-with-reason on Veo credits, per the stills-only goal). Prior: [v0.29.0](LIVE_VERIFICATION_v0.29.0.md) (**persistent `gflow instructions` CRUD proven live e2e GREEN, credit-free** — 11-command sequence on a fresh project: add incl. `--ref <image-UUID>` attach, list/enable/disable, master toggle both ways, TOML `apply` destructive full-sync with `enabled=false` honored, `rm` with server card-id preserved across mutations; movie brief-sync code-path-verified via the same primitives, deferred-with-reason on credits; MCP `gflow_instructions_*` tools are thin adapters over the live-verified primitives). Prior: [v0.28.0](LIVE_VERIFICATION_v0.28.0.md) (**agent instructions `-i` now steer agentic generation — crayon e2e GREEN**: a style-neutral prompt + an enabled "crayon" card produced an unmistakable crayon drawing through the real transport; root causes were conversational phrasing + the `project_brief.enabled` master switch). Prior: [v0.27.1](LIVE_VERIFICATION_v0.27.1.md) (**v0.27.0 release follow-up fixes and documentation sync**). Prior: [v0.27.0](LIVE_VERIFICATION_v0.27.0.md) (**`[style]` block with named variants + prompt-aware resume — credit-free CLI verification**: real `movie run --dry-run` 3-way ledger proving resolved-style display, `skip (done)` on matching `style_hash`, and `re-run (style changed)` after a style edit; composition is local, wire path untouched, so no Veo credits spent — first credited styled run will confirm visually). Prior: [v0.26.0](LIVE_VERIFICATION_v0.26.0.md) (**image i2i by generated-image UUID proven live e2e GREEN** — the existing asset is *selected in place* by its media UUID, no duplicate upload, producing an i2i output that references it; plus generated-image `display_name` capture, credited @C1ph3r404). Prior: [v0.25.0](LIVE_VERIFICATION_v0.25.0.md) (**#237 remote-UUID i2v proven live e2e GREEN** — a real 8s 720×1280 interpolation from a generated image's UUID, after the picker-search attach was reworked to local upload; #240 home-`.env` matrix live; plus two silent-failure guards root-caused live: video-as-image download rejection and rejected-upload fail-loud). Prior: [v0.24.0](LIVE_VERIFICATION_v0.24.0.md) (--project parity across CLI + MCP — automated coverage; live gen auth-gated). Prior: [v0.23.0](LIVE_VERIFICATION_v0.23.0.md) (MCP generation wiring proven live end-to-end — tool→worker→real Flow REST→structured-error translation; final image-write blocked by an expired session, environmental. #222 macOS fix reporter-verified e2e on Apple Silicon). Prior: [v0.22.0](LIVE_VERIFICATION_v0.22.0.md) (Tools framework — automated/CI coverage complete; credit/key-gated live feature run is a pending owner gate, see the doc) · [v0.21.0](LIVE_VERIFICATION_v0.21.0.md) (MCP server over stdio + HTTP/SSE — credit-free protocol handshake; 4 tools / 2 prompts / 3 resources confirmed on stdout) · [v0.20.1](LIVE_VERIFICATION_v0.20.1.md) · [v0.20.0](LIVE_VERIFICATION_v0.20.0.md) · [v0.19.0](LIVE_VERIFICATION_v0.19.0.md) · [v0.18.0](LIVE_VERIFICATION_v0.18.0.md) · [v0.17.0](LIVE_VERIFICATION_v0.17.0.md) · [v0.16.0](LIVE_VERIFICATION_v0.16.0.md) · [v0.13.0](LIVE_VERIFICATION_v0.13.0.md) · [v0.12.0](LIVE_VERIFICATION_v0.12.0.md) · [v0.11.0](LIVE_VERIFICATION_v0.11.0.md) · [v0.10.0](LIVE_VERIFICATION_v0.10.0.md) · [v0.9.1](LIVE_VERIFICATION_v0.9.1.md) · [v0.9.0](LIVE_VERIFICATION_v0.9.0.md) · [v0.8.1](LIVE_VERIFICATION_v0.8.1.md) · [v0.7.0](LIVE_VERIFICATION_v0.7.0.md)
134
+ **"Where is the reverse-engineered wire protocol for a feature?"** → the `*_RECON.md` design docs: [CHARACTER_RECON](CHARACTER_RECON.md) (Flow character entity protocol), [IMAGE_UPSCALE_RECON](IMAGE_UPSCALE_RECON.md) (`/v1/flow/upsampleImage` wire). Naming convention: one `<FEATURE>_RECON.md` per reverse-engineered surface, kept as the durable spec after the feature ships. Pre-capture research recons: [ASSET_TAGGING_RECON](ASSET_TAGGING_RECON.md) (`@`-mention asset tagging — shipped in v0.40.0, see [LIVE_VERIFICATION_v0.40.0](LIVE_VERIFICATION_v0.40.0.md)).
130
135
  **"What was live-verified for the data layer (PR #58)?"** → [LIVE_VERIFICATION_data_layer](LIVE_VERIFICATION_data_layer.md) — 1 Imagen + 1 Veo credit on denon82, 6-layer ledger (file + magic + Pillow + DB rows + CLI round-trip + structlog)
131
136
  **"What was live-verified for the video-download feature (#29)?"** → [LIVE_VERIFICATION_video_download](LIVE_VERIFICATION_video_download.md)
132
137
  **"What is the jitter matrix evidence for `gflow image batch`?"** → [`LIVE_VERIFICATION_image_batch.md`](LIVE_VERIFICATION_image_batch.md) — jitter matrix evidence for `gflow image batch` (always-same-project mode)