gflow-cli 0.44.0__tar.gz → 0.45.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.
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.codex-plugin/plugin.json +1 -1
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.pre-commit-config.yaml +3 -1
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/AGENTS.md +17 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/CHANGELOG.md +84 -1
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/KNOWN_ISSUES.md +28 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/PKG-INFO +2 -2
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/CHARACTER_RECON.md +70 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/CONFIGURATION.md +3 -3
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/INDEX.md +3 -1
- gflow_cli-0.45.0/docs/LIVE_VERIFICATION_v0.45.0.md +138 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/MOVIE.md +6 -3
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/PROJECT_STATUS.md +8 -1
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/USAGE.md +10 -7
- gflow_cli-0.45.0/docs/superpowers/plans/2026-07-26-character-prompt-polishing/PLAN.md +130 -0
- gflow_cli-0.45.0/docs/superpowers/plans/2026-07-26-self-documenting-errors/PLAN.md +126 -0
- gflow_cli-0.45.0/docs/superpowers/plans/2026-07-27-overlay-banner-dismissal/PLAN.md +49 -0
- gflow_cli-0.45.0/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/PLAN.md +198 -0
- gflow_cli-0.45.0/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/SCENARIO.md +90 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/pyproject.toml +3 -3
- gflow_cli-0.45.0/scripts/dev/spike_character_prompt_format.py +121 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/skills/gflow-cli/SKILL.md +2 -1
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/__init__.py +1 -1
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/api/client.py +85 -10
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/api/transports/ui_automation.py +183 -4
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/cli_character.py +14 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/cli_image.py +52 -2
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/cli_movie.py +17 -12
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/cli_video.py +23 -16
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/errors.py +22 -19
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/mcp/tools.py +21 -1
- gflow_cli-0.45.0/src/gflow_cli/redaction.py +14 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/services/character_create.py +6 -0
- gflow_cli-0.45.0/tests/api/test_client_errors.py +113 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/test_client_generate_character.py +14 -2
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/transports/test_ui_character_editor.py +199 -1
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/cli/test_cli_character_create.py +51 -0
- gflow_cli-0.45.0/tests/cli/test_cli_image_uuid_ref_enrichment.py +218 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/cli/test_cli_movie.py +51 -8
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/cli/test_cli_video_chain.py +166 -7
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/cli/test_error_handling.py +2 -2
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/cli/test_helpers.py +27 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/e2e/test_chain_e2e.py +4 -2
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/e2e/test_character_create_e2e.py +84 -0
- gflow_cli-0.45.0/tests/e2e/test_image_uuid_ref_e2e.py +207 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/features/test_video_agent_ui_steps.py +15 -1
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/features/test_video_chain_steps.py +54 -6
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/features/video_chain.feature +12 -2
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/mcp/test_tools_helpers.py +34 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/services/test_character_create_saga.py +34 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/services/test_character_gen_no_direct_post.py +1 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/test_errors.py +69 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/test_json_output.py +2 -0
- gflow_cli-0.45.0/tests/test_overlay_banner_dismissal.py +174 -0
- gflow_cli-0.45.0/tests/test_self_documenting_errors.py +114 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/uv.lock +25 -25
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/website/docs/CONFIGURATION.md +3 -3
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/website/docs/KNOWN_ISSUES.md +28 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/website/docs/MOVIE.md +6 -3
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/website/docs/USAGE.md +10 -7
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.agents/plugins/marketplace.json +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.claude/README.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.claude/commands/gflow/active.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.claude/commands/gflow/branch-review.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.claude/commands/gflow/changelog.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.claude/commands/gflow/check.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.claude/commands/gflow/doc-review.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.claude/commands/gflow/issue-assessment.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.claude/commands/gflow/issue-resolve.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.claude/commands/gflow/known-issues.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.claude/commands/gflow/live-verify.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.claude/commands/gflow/llm-council.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.claude/commands/gflow/next.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.claude/commands/gflow/plan.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.claude/commands/gflow/pr-council-review.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.claude/commands/gflow/predict.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.claude/commands/gflow/release.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.claude/commands/gflow/scenario.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.claude/commands/gflow/sonar.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.claude/commands/gflow/status.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.env.template +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.gitattributes +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.github/CODEOWNERS +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.github/copilot-instructions.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.github/dependabot.yml +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.github/workflows/ci.yml +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.github/workflows/external-pr-triage.yml +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.github/workflows/governance-advisory.yml +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.github/workflows/governance-benchmark.yml +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.github/workflows/main-base-guard.yml +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.github/workflows/pages.yml +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.github/workflows/release.yml +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.gitignore +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.gitleaks.toml +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/.secrets.baseline +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/CLAUDE.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/CONFIGURATION.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/CONTRIBUTING.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/DISCLAIMER.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/LICENSE +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/PLAN.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/README.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/RELEASE.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/ROADMAP.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/conftest.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/deploy/PR-TRIAGE-AUTOPILOT-OPS.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docker-compose.yml +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/AGENT_GUIDE.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/AGENT_UI_E2E.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/AGENT_UI_RECON.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/ASSET_TAGGING_RECON.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/CHARACTER.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/DATA_LAYER.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/DEMOS.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/E2E_TESTING.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/GITHUB.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/INSTRUCTIONS.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.21.0.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.22.0.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.23.0.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.24.0.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.25.0.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.26.0.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.27.0.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.27.1.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.28.0.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.29.0.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.30.0.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.31.0.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.32.0.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.32.1.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.33.0.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.34.0.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.35.0.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.36.0.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.37.0.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.38.0.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.38.1.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.39.0.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.40.0-production-readiness.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.40.0.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.41.0.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.42.0.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.43.0.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.44.0.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/MCP.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/PROMPT_EXPANSION.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/REFERENCE_STRATEGIES.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/SECURITY.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/TOOLS.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/USER_GUIDE.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/assets/demo-split-pf.gif +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/assets/example-run.gif +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/assets/examples.webp +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/medium_tutorial.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/schemas/movie-handoff.schema.json +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/sonar-cleanup-tracker.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/superpowers/plans/2026-07-08-pr-triage-autopilot/PLAN.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/superpowers/plans/2026-07-09-camoufox-adoption/PLAN.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/superpowers/plans/2026-07-14-storyboarding-and-visual-curation/PLAN.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/superpowers/plans/2026-07-18-asset-tagging/PLAN.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/superpowers/plans/2026-07-19-live-verify/PLAN.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/superpowers/plans/2026-07-19-production-readiness-browser-lifecycle.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/superpowers/plans/2026-07-19-production-readiness-driver-cdp-verification.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/superpowers/plans/2026-07-19-production-readiness-public-truth.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/superpowers/plans/2026-07-19-production-readiness-queue-safety.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/superpowers/plans/2026-07-26-project-name-management/PLAN.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/superpowers/research/2026-06-27-tool-abstraction-evaluation.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/superpowers/specs/2026-06-29-issue-assessment-workflow-design.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/superpowers/specs/2026-07-04-pr-triage-autopilot-design.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/superpowers/specs/2026-07-18-asset-tagging-design.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/superpowers/specs/2026-07-19-live-verify-design.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/superpowers/specs/2026-07-19-production-readiness-hardening-design.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/superpowers/spikes/2026-07-09-camoufox-waf-403.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/superpowers/spikes/2026-07-12-ui-cohort-backend-config.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/docs/superpowers/spikes/2026-07-17-production-readiness-assessment.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/eval/pr_triage_eval.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/eval/pr_triage_fixtures.json +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/examples/README.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/examples/batch_from_config.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/examples/multi_prompt_t2i.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/examples/sample_config.json +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/examples/sample_prompts.txt +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/examples/single_image_t2i.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/examples/workflow_chain.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/index.html +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/llms.txt +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/samples/README.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/samples/captured/01_upload_image.json +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/samples/captured/04_archive_workflow.json +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/samples/captured/05_createProject.json +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/samples/captured/06_batchGenerateImages.json +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/samples/captured/12_create_scene.json +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/samples/captured/14_get_scene_workflows.json +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/autopilot/Dockerfile.triage +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/autopilot/entrypoint.sh +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/autopilot/pr_triage_autopilot.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/autopilot/pr_triage_gate.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/autopilot/run_sandboxed_review.sh +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/ci/check_doc_links.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/ci/check_materiality.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/ci/check_release_artifacts.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/ci/check_repo_hygiene.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/ci/check_website_docs_pii.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/ci/generate_website_docs.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/debug_editor.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/debug_gen_settings.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/debug_settings.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/_recording_client.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/_spike_common.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/active_plan.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/capture_locale_invariants.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/character_create_spike.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/character_create_spike_v2.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/dump_character_selectors.js +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/incident_bundle_quality.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/make_project.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/materiality_backtest.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/monitor_pr_38.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/patch_character.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/skillopt/README.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/skillopt/harness.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/skillopt/tasks.json +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/sonar-local-scan.sh +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/sonar-pre-push-gate.sh +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/spike_char_editor_dom.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/spike_char_gen_capture.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/spike_incident_live.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/spike_issue313_agent_mode_controls.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/spike_issue314_picker_filename_search.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/spike_mode_roundtrip.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/spike_mode_switch_agentic_to_classic.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/spike_movie_picker_select.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/spike_movie_voice_list.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/spike_patch_entity.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/dev/spike_patchright.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/diag/README.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/diag/capture_flow_traffic.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/diag/memory_profile.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/diag/recaptcha_mint.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/e2e/capture_agent_toggle.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/record_demo.ps1 +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/smoke_image.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/smoke_video_editor.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/smoke_worker_style.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/spike_waf_camoufox.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/scripts/verify_chrome_auth_viability.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/skills/README.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/skills/changelog/SKILL.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/skills/check/SKILL.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/skills/doc-review/SKILL.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/skills/issue-assessment/SKILL.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/skills/issue-resolve/SKILL.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/skills/known-issues/SKILL.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/skills/live-verify/SKILL.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/skills/llm-council/SKILL.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/skills/plan/SKILL.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/skills/pr-council-review/SKILL.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/skills/predict/SKILL.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/skills/release/SKILL.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/skills/scenario/SKILL.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/skills/sonar/SKILL.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/skills/status/SKILL.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/sonar-project.properties +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/__main__.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/_cli_helpers.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/api/__init__.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/api/_engine.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/api/_retry.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/api/character.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/api/dto.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/api/image.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/api/image_upscale.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/api/recaptcha.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/api/routes.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/api/scene.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/api/transports/__init__.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/api/transports/_common.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/api/transports/base.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/api/transports/drivers/agentic.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/api/transports/drivers/base.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/api/transports/drivers/classic.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/api/transports/drivers/factory.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/api/transports/mode_control.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/api/transports/ui_automation_video.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/api/video.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/auth/__init__.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/auth/base.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/auth/cookies.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/auth/factory.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/auth/real_chrome.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/auth/strategies.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/auth/verification.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/browser_manager.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/chain.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/chain_manifest.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/cli.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/cli_data.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/cli_instructions.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/cli_models.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/cli_project.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/cli_run.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/cli_scene.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/cli_tools.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/composition.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/config.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/data/__init__.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/data/chain_repo.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/data/migrations/0007_queue.sql +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/data/migrations/0008_add_operation_expanded_prompt.sql +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/data/migrations/0009_queue_claims.sql +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/data/models.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/data/queries.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/data/recorder.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/data/redaction.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/data/repository.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/data/store.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/diagnostics.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/exceptions.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/image_batch.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/json_output.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/mcp/__init__.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/mcp/prompts.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/mcp/resources.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/mcp/server.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/media.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/movie_manifest.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/observability.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/paths.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/profile_lease.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/profile_store.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/services/__init__.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/services/mentions.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/storage.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/tools/__init__.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/tools/banned.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/tools/builtin/__init__.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/tools/builtin/creative-director.toml +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/tools/builtin/reverse-engineer.toml +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/tools/builtin/storyboard.toml +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/tools/expander.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/tools/invocation.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/tools/loader.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/tools/registry.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/tools/runtime.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/tools/spec.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/ui/app.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/ui/server.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/worker/codec.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/worker/daemon.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/src/gflow_cli/worker/queue.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tasks/lessons.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/test_assets/sample_batch.json +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/test_assets/sample_batch.tsv +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/test_assets/sample_batch_invalid.tsv +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/__init__.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/__init__.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/fixtures/character_gen_response.json +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/fixtures/patch_entity_response.json +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/test_aisandbox_auth_error.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/test_bearer_redaction.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/test_character.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/test_client.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/test_client_character.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/test_client_delete_characters.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/test_client_image.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/test_client_incidents.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/test_client_launch_kwargs.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/test_client_patch_entity.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/test_client_scene.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/test_client_upscale.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/test_concurrency.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/test_dto.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/test_engine.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/test_image.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/test_image_dto.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/test_image_upscale.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/test_post_json_aisandbox_auth.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/test_recaptcha.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/test_retry.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/test_routes.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/test_routes_character.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/test_routes_scene.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/test_sapisidhash_helper.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/test_scene_models.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/test_video.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/test_video_request.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/transports/__init__.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/transports/conftest.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/transports/drivers/test_agentic.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/transports/drivers/test_classic.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/transports/drivers/test_factory.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/transports/drivers/test_ui_mode.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/transports/test_agentic_cohort_detection.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/transports/test_base.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/transports/test_bearer.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/transports/test_common.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/transports/test_factory.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/transports/test_fingerprint.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/transports/test_mode_control.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/transports/test_sapisidhash.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/transports/test_selector_symmetry.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/transports/test_transport_timeout.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/transports/test_ui_automation.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/transports/test_ui_automation_batch.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/api/transports/test_ui_automation_video.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/auth/strategies/test_factory.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/auth/strategies/test_strategies.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/auth/test_cookies.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/auth/test_real_chrome.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/auth/test_verification.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/autopilot/test_pr_triage_autopilot.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/cli/__init__.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/cli/test_cli_auth_list.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/cli/test_cli_character.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/cli/test_cli_data.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/cli/test_cli_data_errors.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/cli/test_cli_data_errors_retention.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/cli/test_cli_image.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/cli/test_cli_image_selector_drift.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/cli/test_cli_image_upscale.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/cli/test_cli_instructions.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/cli/test_cli_models.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/cli/test_cli_run.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/cli/test_cli_scene.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/cli/test_cli_tools.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/cli/test_cli_video.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/cli/test_failure_funnel.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/cli/test_incident_output.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/cli/test_movie_manifest.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/cli/test_movie_manifest_style_variants.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/cli/test_settings_validation.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/composition/test_character.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/composition/test_compose_prompt.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/composition/test_handoff.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/composition/test_style_variants.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/composition/test_style_variants_e2e.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/conftest.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/data/__init__.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/data/test_chain_repo.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/data/test_failure_recording.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/data/test_find_incomplete_character.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/data/test_models.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/data/test_packaging.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/data/test_recorder.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/data/test_recorder_character.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/data/test_redaction.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/data/test_repository.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/data/test_scene_persistence.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/data/test_settings_and_errors.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/data/test_store_migrations.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/dev/test_recording_client.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/e2e/__init__.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/e2e/conftest.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/e2e/test_agentic_count_enforcement_e2e.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/e2e/test_asset_tagging_e2e.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/e2e/test_cancellation_e2e.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/e2e/test_crash_recovery_e2e.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/e2e/test_daemon_e2e.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/e2e/test_data_layer_e2e.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/e2e/test_entity_smuggling_e2e.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/e2e/test_i2v_flags_e2e.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/e2e/test_image_batch_e2e.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/e2e/test_incident_quality_e2e.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/e2e/test_json_output_e2e.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/e2e/test_live_agentic_instructions.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/e2e/test_project_naming_e2e.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/e2e/test_scene_compose_live.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/e2e/test_tools_e2e.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/e2e/test_transports_e2e.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/features/__init__.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/features/asset_tagging.feature +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/features/auth.feature +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/features/auth_login.feature +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/features/character_create.feature +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/features/character_read.feature +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/features/conftest.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/features/image.feature +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/features/image_upscale.feature +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/features/incident_diagnostics.feature +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/features/instructions.feature +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/features/locale_picker_include.feature +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/features/test_asset_tagging_steps.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/features/test_auth_login_steps.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/features/test_auth_steps.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/features/test_character_create_steps.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/features/test_character_read_steps.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/features/test_image_steps.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/features/test_image_upscale_steps.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/features/test_incident_diagnostics_steps.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/features/test_instructions_steps.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/features/test_locale_picker_include_steps.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/features/test_step_collision_guard.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/features/video_agent_ui.feature +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/fixtures/__init__.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/fixtures/seeded_catalog.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/image_batch/__init__.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/image_batch/test_image_manifest.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/image_batch/test_jitter_config.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/image_batch/test_observability_events.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/integration/__init__.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/integration/conftest.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/integration/constants.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/integration/test_storage_gcs.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/integration/test_storage_s3.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/mcp/__init__.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/mcp/conftest.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/mcp/test_cli_parity.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/mcp/test_server.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/mcp/test_stdio_transport.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/mcp/test_tools_instructions.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/mcp/test_tools_wired.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/scripts/test_check_materiality.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/scripts/test_check_release_artifacts.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/scripts/test_check_repo_hygiene.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/scripts/test_check_website_docs_pii.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/scripts/test_codex_plugin.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/scripts/test_generate_website_docs.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/scripts/test_incident_bundle_quality.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/scripts/test_materiality_backtest.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/services/__init__.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/services/test_character_create_redaction.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/services/test_mentions_observability.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/services/test_mentions_parse.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/services/test_mentions_resolve.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/services/test_resolve_and_apply.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/smoke/__init__.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/smoke/test_profile_account_smoke.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/smoke/test_real_flow.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/test_auth.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/test_browser_manager.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/test_chain.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/test_chain_manifest.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/test_cli_data.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/test_cli_project.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/test_config.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/test_conftest_isolation.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/test_data_queries.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/test_diagnostics_bundle.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/test_diagnostics_events.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/test_diagnostics_journal.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/test_diagnostics_recorder.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/test_diagnostics_retention.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/test_diagnostics_sanitize.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/test_documentation_gate.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/test_errors_classification.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/test_marker_registry.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/test_media.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/test_observability.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/test_paths.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/test_profile_lease.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/test_profile_lease_subprocess.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/test_profile_store.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/test_smoke.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/tools/__init__.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/tools/test_banned.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/tools/test_expander.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/tools/test_invocation.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/tools/test_loader.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/tools/test_registry.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/tools/test_runtime.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/tools/test_spec.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/ui/test_app.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/worker/test_codec.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/worker/test_daemon.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/worker/test_mcp_daemon_race.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/worker/test_queue.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/worker/test_queue_multiprocess.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/tests/worker/test_queue_reconciliation.py +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/website/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/website/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/website/docs/CHARACTER.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/website/docs/DATA_LAYER.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/website/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/website/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/website/docs/E2E_TESTING.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/website/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/website/docs/INSTRUCTIONS.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/website/docs/MCP.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/website/docs/PROMPT_EXPANSION.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/website/docs/SECURITY.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/website/docs/TOOLS.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/website/docs/USER_GUIDE.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/website/docs/agents.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/website/docs/index.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/website/docs/installation.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/website/docs/onboarding-mockup.html +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/website/docs/onboarding.md +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/website/docs/stylesheets/extra.css +0 -0
- {gflow_cli-0.44.0 → gflow_cli-0.45.0}/website/mkdocs.yml +0 -0
|
@@ -23,8 +23,10 @@
|
|
|
23
23
|
default_stages: [pre-commit]
|
|
24
24
|
|
|
25
25
|
repos:
|
|
26
|
+
# Keep this rev in lockstep with the `ruff==` pin in pyproject.toml. A hook that
|
|
27
|
+
# formats with an older ruff than CI checks with will fight CI on every commit.
|
|
26
28
|
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
27
|
-
rev: v0.
|
|
29
|
+
rev: v0.16.0
|
|
28
30
|
hooks:
|
|
29
31
|
- id: ruff
|
|
30
32
|
args: [--fix]
|
|
@@ -81,6 +81,23 @@ These rules exist because docs alone don't bind under momentum: a "check open PR
|
|
|
81
81
|
- **If a claim can't be verified in the current environment, it's LIKELY — not CONFIRMED.** Keep the issue open, reference it with `Refs #N` (not `Closes #N`), and ship diagnostics rather than a blind fix. When you can't reproduce it, hand the fix to whoever can.
|
|
82
82
|
- **This project reverse-engineers a blackbox.** gflow-cli doesn't own Google Flow — it drives real Flow through inspected HAR/DOM/browser-log behavior. Offline checks (types, lint, unit/BDD tests) verify *our* code does what we think it does; they cannot verify Flow still behaves the way we captured it. Every feature that touches a generation path is **live-verified**, not just offline-tested, before it's called done — see `/gflow:live-verify`.
|
|
83
83
|
|
|
84
|
+
## Standard Workflow Sequence
|
|
85
|
+
|
|
86
|
+
All AI agents and harnesses working on `gflow-cli` follow this standard 10-phase pipeline from issue discovery to public release:
|
|
87
|
+
|
|
88
|
+
| Phase | Skill / Command | Purpose | Output Artifact |
|
|
89
|
+
|---|---|---|---|
|
|
90
|
+
| 1. Triage | `/gflow:issue-assessment <N>` | Read-only issue analysis & root cause hypothesis | `issue_assessment_<N>.md` |
|
|
91
|
+
| 2. Pre-Implementation | `/gflow:predict <proposal>` | Adversarial audit (D14 YAGNI, security, risks) | GO / CAUTION / STOP verdict |
|
|
92
|
+
| 3. BDD Scaffolding | `/gflow:scenario <feature>` | Edge-case explorer & BDD Gherkin spec | `Scenario:` blocks & test scaffold |
|
|
93
|
+
| 4. Implementation Plan | `/gflow:plan <feature>` | Task-by-task atomic implementation plan | `docs/superpowers/plans/<date>-<slug>/PLAN.md` |
|
|
94
|
+
| 5. Council Review | `/gflow:pr-council-review` / `llm-council` | Multi-dimensional audit across 6 core dimensions | Consensus verdict report |
|
|
95
|
+
| 6. Task Execution | `/gflow:status` | Track unchecked tasks during TDD execution | Next unchecked task |
|
|
96
|
+
| 7. Pre-Commit Quality | `/gflow:check` | The Impeccable Routine (hygiene, ruff, pyright, pytest) | All green local checks |
|
|
97
|
+
| 8. Live Verification | `/gflow:live-verify` | 5-layer proof against real Flow transport | `docs/LIVE_VERIFICATION_vX.Y.Z.md` |
|
|
98
|
+
| 9. PR & Issue Close | `/gflow:issue-resolve <N>` | PR, SonarCloud 0-issue gate, merge to develop | Closed GitHub issue |
|
|
99
|
+
| 10. Release Pipeline | `/gflow:release` | Version bump, signed tag (`git tag -s`), PyPI publish | Shipped release & back-merge |
|
|
100
|
+
|
|
84
101
|
## Skills reference (cross-tool)
|
|
85
102
|
|
|
86
103
|
The `skills/` directory ships installable agent skill docs in plain Markdown with YAML frontmatter. Any agent can consume them directly:
|
|
@@ -7,6 +7,88 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.45.0] — 2026-07-28
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- **`gflow character create` binds portraits to the character again (#395).**
|
|
15
|
+
Two independent defects made every character generation land as a plain
|
|
16
|
+
project image, leaving the character empty:
|
|
17
|
+
1. **Overlay dismissal Escaped Flow's own UI.** `[role='dialog']` and
|
|
18
|
+
`[role='alert']` had been added to the overlay detector, but Flow's
|
|
19
|
+
character composer (and the media picker) carry those roles — so gflow
|
|
20
|
+
pressed Escape on the app itself, the generation went out without
|
|
21
|
+
`entityContext`, and Flow filed the image against the project with no
|
|
22
|
+
`parentEntityId`. Those two selectors are removed; `[role='banner']` and
|
|
23
|
+
the announcement matcher remain, so the original banner-dismissal intent
|
|
24
|
+
is intact.
|
|
25
|
+
2. **The character route could bounce back to the project page.** Flow
|
|
26
|
+
redirects `/project/{id}/character/{entityId}` when the entity is not yet
|
|
27
|
+
queryable — a race gflow loses by navigating immediately after
|
|
28
|
+
`flow.createEntity`. Because the project page also mounts a prompt box,
|
|
29
|
+
the old readiness check was satisfied on the wrong surface and the prompt
|
|
30
|
+
was typed into the **project** composer. gflow now verifies it actually
|
|
31
|
+
came to rest on the character route, re-navigating a few times and failing
|
|
32
|
+
loudly rather than generating on the wrong surface.
|
|
33
|
+
|
|
34
|
+
Verified live 2026-07-28 in both directions on the same account, plus a
|
|
35
|
+
read-back showing the character carrying its name and `thumbnail_media_id`.
|
|
36
|
+
The wire contract is documented in
|
|
37
|
+
[CHARACTER_RECON](docs/CHARACTER_RECON.md#entity-binding-entitycontext-captured-live-2026-07-28).
|
|
38
|
+
|
|
39
|
+
- **`gflow image i2i --ref <UUID>` no longer fails when the asset is out of the
|
|
40
|
+
picker's reach (#393).** Flow's media picker is scoped to the active project
|
|
41
|
+
and its search does **not** index media UUIDs (confirmed live 2026-07-27:
|
|
42
|
+
both UUID search tiers returned zero tiles), so a `--ref` pointing at an asset
|
|
43
|
+
in another project — or buried deep in a virtualised grid — could not be
|
|
44
|
+
selected, and a bare `--ref <uuid>` carried no local file to fall back on. The
|
|
45
|
+
CLI now resolves each UUID ref against the local catalog and attaches its
|
|
46
|
+
recorded file, so the transport uploads those exact bytes instead of failing
|
|
47
|
+
the run. Verified live as a controlled A/B on identical input: exit 9 before,
|
|
48
|
+
exit 0 with the upload fallback after. Enrichment is best-effort (unknown
|
|
49
|
+
asset, unavailable catalog, or deleted file leaves the ref untouched) and the
|
|
50
|
+
**fail-loud contract is unchanged** — a reference that cannot be bound still
|
|
51
|
+
aborts the generation rather than silently producing an unreferenced image.
|
|
52
|
+
- **A Flow web-app crash on the character-editor route is now reported as
|
|
53
|
+
such.** `gflow character create` surfaced Flow's client-side crash as
|
|
54
|
+
`RuntimeError: Character editor not ready: prompt textbox not visible`, which
|
|
55
|
+
blames a selector that was never on the page. The existing crash classifier is
|
|
56
|
+
now consulted at that gate too, yielding the typed, retryable `FlowAppError`
|
|
57
|
+
(exit 31). Observed live 2026-07-27 via the incident bundle's `ui.json`
|
|
58
|
+
(`title.category: flow_app_crash`).
|
|
59
|
+
- **Character binding failures say what actually happened.** When Flow returns a
|
|
60
|
+
workflow that is not bound to the character entity, the error read "Unexpected
|
|
61
|
+
response shape from Flow", sending readers after a wire-format bug. It now
|
|
62
|
+
states that Flow filed the image as a plain project image and the character
|
|
63
|
+
has no portrait. The guard remains strict — verified live that unbound runs
|
|
64
|
+
leave the entity as "Untitled Character" with a null thumbnail.
|
|
65
|
+
- **Tier-aware credit confirmations:** `gflow video chain` and `gflow movie run`
|
|
66
|
+
no longer present pending work as an exact one-credit-per-link/scene charge.
|
|
67
|
+
Plans, confirmation prompts, `--dry-run` output, Click help, and current docs
|
|
68
|
+
now report the count of *pending video operations* and direct operators to
|
|
69
|
+
Google Flow for current model/duration/tier pricing, which varies by account
|
|
70
|
+
tier and Flow policy. Execution, resume/stale accounting, `--yes`, JSON
|
|
71
|
+
output, flags, and exit codes are unchanged.
|
|
72
|
+
|
|
73
|
+
### Added
|
|
74
|
+
|
|
75
|
+
- **Top Banner & Modal Dismissal (#369):** Expanded `_detect_overlay` and
|
|
76
|
+
`_dismiss_blocking_overlays` in `ui_automation.py` to detect top banners,
|
|
77
|
+
alert bars, and announcement dialogs (`[role='banner']`, `[role='alert']`,
|
|
78
|
+
`[role='dialog']`, `div:has-text('What\'s new')`), force-clicking locale-stable
|
|
79
|
+
close/clear/Got-it buttons and falling back to Escape before automation tasks.
|
|
80
|
+
- **`gflow character create --format-prompt` (#383):** Opt-in flag that clicks
|
|
81
|
+
Flow's in-editor **Format** button before submitting, letting Flow rewrite the
|
|
82
|
+
prompt into its character prompt-engineering shape. Applies to both the face and
|
|
83
|
+
body slots. Best-effort by design — if the button is not found the prompt is
|
|
84
|
+
submitted as typed rather than failing the generation. The selector cascade is
|
|
85
|
+
anchored on the locale-stable `personal_recommendations` Material Symbols
|
|
86
|
+
ligature (confirmed against live DOM 2026-07-27), not the "Format" label, which
|
|
87
|
+
Flow localises to the Chrome profile language. Flow ships the button `disabled`
|
|
88
|
+
on an empty prompt, so the driver checks enabled-ness — a disabled button is
|
|
89
|
+
still *visible*, and clicking one would stall on Playwright's actionability wait.
|
|
90
|
+
- **Self-documenting error remediation & provider message pass-through (#380):** Added default `remediation_hint` strings across domain exception classes (`WireFormatError`, `ContentPolicyError`, `RateLimitError`, `DataStoreError`, `SceneConcatError`, `FrameExtractionError`), extracted and sanitized provider error messages from Google Flow tRPC/REST responses, and enriched MCP tool error envelopes and Rich CLI error displays with actionable recovery guidance at failure time.
|
|
91
|
+
|
|
10
92
|
## [0.44.0] — 2026-07-26
|
|
11
93
|
|
|
12
94
|
### Added
|
|
@@ -2384,7 +2466,8 @@ shell-script template that branches on these codes.
|
|
|
2384
2466
|
|
|
2385
2467
|
First skeleton. Not functional end-to-end yet.
|
|
2386
2468
|
|
|
2387
|
-
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.
|
|
2469
|
+
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.45.0...HEAD
|
|
2470
|
+
[0.45.0]: https://github.com/ffroliva/gflow-cli/compare/v0.44.0...v0.45.0
|
|
2388
2471
|
[0.44.0]: https://github.com/ffroliva/gflow-cli/compare/v0.43.0...v0.44.0
|
|
2389
2472
|
[0.43.0]: https://github.com/ffroliva/gflow-cli/compare/v0.42.0...v0.43.0
|
|
2390
2473
|
[0.42.0]: https://github.com/ffroliva/gflow-cli/compare/v0.41.0...v0.42.0
|
|
@@ -824,6 +824,34 @@ gflow image batch ./batch-b.tsv --profile personal
|
|
|
824
824
|
|
|
825
825
|
## Resolved
|
|
826
826
|
|
|
827
|
+
### `character create` generated portraits that never bound to the character — RESOLVED in v0.45.0
|
|
828
|
+
|
|
829
|
+
- **Status:** Resolved ([#395](https://github.com/ffroliva/gflow-cli/issues/395)) · **Severity:** Was-High · **Was-affecting:** v0.44.0 and unreleased `develop` · **Fixed in:** v0.45.0
|
|
830
|
+
|
|
831
|
+
Every `gflow character create` spent an Imagen credit, produced an image, and
|
|
832
|
+
left the character empty ("Untitled Character", null thumbnail). Flow filed the
|
|
833
|
+
generation as an ordinary project image because the request carried no
|
|
834
|
+
`entityContext`. Two independent gflow defects caused it:
|
|
835
|
+
|
|
836
|
+
1. **Overlay dismissal Escaped Flow's own UI.** `[role='dialog']` and
|
|
837
|
+
`[role='alert']` had been added to the overlay detector, but Flow's character
|
|
838
|
+
composer — and the media picker — carry those roles. gflow pressed Escape on
|
|
839
|
+
the app itself and the submit lost its entity context.
|
|
840
|
+
2. **The character route could bounce to the project page.** Flow redirects
|
|
841
|
+
`/project/{id}/character/{entityId}` while the entity is not yet queryable
|
|
842
|
+
(gflow navigates immediately after `flow.createEntity`). The project page
|
|
843
|
+
also mounts a prompt box, so the readiness gate passed on the wrong surface
|
|
844
|
+
and the prompt was typed into the **project** composer.
|
|
845
|
+
|
|
846
|
+
Both are fixed: the two over-broad selectors are gone (banner detection intact),
|
|
847
|
+
and the transport now verifies it came to rest on the character route,
|
|
848
|
+
re-navigating and then failing loudly instead of generating on the wrong
|
|
849
|
+
surface. The `parentEntityId` guard that surfaced this was correct throughout —
|
|
850
|
+
it refused to report a portrait-less character as success.
|
|
851
|
+
|
|
852
|
+
Wire contract: [CHARACTER_RECON § entity binding](docs/CHARACTER_RECON.md#entity-binding-entitycontext-captured-live-2026-07-28).
|
|
853
|
+
Evidence: [LIVE_VERIFICATION_v0.45.0 §2](docs/LIVE_VERIFICATION_v0.45.0.md).
|
|
854
|
+
|
|
827
855
|
### `gflow video`'s manifest-driven batch subcommand didn't skip already-completed entries — RESOLVED as obsolete
|
|
828
856
|
|
|
829
857
|
- **Status:** Resolved (obsolete) · **Severity:** Was-Medium · **Was-affecting:** v0.2.0a1 through the command's removal · **Fixed in:** n/a — removed in production-readiness hardening (see `fix: remove nonfunctional video batch command`)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gflow-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.45.0
|
|
4
4
|
Summary: Unofficial CLI for Google Flow — drive Veo image-to-video generations from the terminal.
|
|
5
5
|
Project-URL: Homepage, https://github.com/ffroliva/gflow-cli
|
|
6
6
|
Project-URL: Issues, https://github.com/ffroliva/gflow-cli/issues
|
|
@@ -58,7 +58,7 @@ Requires-Dist: numpy>=1.24; extra == 'dev'
|
|
|
58
58
|
Requires-Dist: pyright>=1.1.0; extra == 'dev'
|
|
59
59
|
Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
|
|
60
60
|
Requires-Dist: pytest>=8.0.0; extra == 'dev'
|
|
61
|
-
Requires-Dist: ruff==0.
|
|
61
|
+
Requires-Dist: ruff==0.16.0; extra == 'dev'
|
|
62
62
|
Provides-Extra: gcs
|
|
63
63
|
Requires-Dist: gcsfs>=2024.2.0; extra == 'gcs'
|
|
64
64
|
Requires-Dist: universal-pathlib>=0.2.5; extra == 'gcs'
|
|
@@ -82,6 +82,76 @@ calls on the same `workflowId`, chaining `imageInputs` (BASE_IMAGE = prior outpu
|
|
|
82
82
|
This is the SAME endpoint family gflow's existing image transport already drives — the new bits are
|
|
83
83
|
`tool:"PINHOLE"`, `imageInputs` types, and the `parentEntityId`/workflow binding.
|
|
84
84
|
|
|
85
|
+
## Entity binding: `entityContext` (captured live 2026-07-28)
|
|
86
|
+
|
|
87
|
+
**The generation request must carry `entityContext`, or Flow files the image as a
|
|
88
|
+
plain project image and the character stays empty.** Captured from Flow's own UI
|
|
89
|
+
via a CDP-attached real Chrome (`gflow-agent-browser-spike`, `navigator.webdriver:
|
|
90
|
+
false`) while driving the plain **New Character** flow.
|
|
91
|
+
|
|
92
|
+
`POST /v1/projects/{projectId}/flowMedia:batchGenerateImages`
|
|
93
|
+
|
|
94
|
+
```jsonc
|
|
95
|
+
{
|
|
96
|
+
"clientContext": { "projectId": "…", "tool": "PINHOLE", "sessionId": "…" },
|
|
97
|
+
"mediaGenerationContext": {
|
|
98
|
+
"batchId": "…",
|
|
99
|
+
"entityContext": {
|
|
100
|
+
"entityId": "1e6c558e-87be-4aa7-8a21-ffb7efa43bbd",
|
|
101
|
+
"characterSlot": { "imageReferenceIndex": 0 } // 0 = portrait/face, 1 = body
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
"useNewMedia": true,
|
|
105
|
+
"requests": [ { "imageModelName": "NARWHAL", "structuredPrompt": {…}, "seed": …, "imageInputs": [] } ]
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Response — bound on the first try:
|
|
110
|
+
|
|
111
|
+
```jsonc
|
|
112
|
+
"workflows": [ { "name": "30551aa7-…", "projectId": "…", "parentEntityId": "1e6c558e-…" } ]
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Which surface produces it
|
|
116
|
+
|
|
117
|
+
The composer Flow renders depends on whether the character already HAS a
|
|
118
|
+
portrait, not on which URL you arrived by:
|
|
119
|
+
|
|
120
|
+
| Character state | Composer placeholder | Sends `entityContext`? |
|
|
121
|
+
|---|---|---|
|
|
122
|
+
| Empty (no portrait yet) | *"Describe your character…"* | **Yes** — this is the creation composer, on `/characters` **and** on `/character/{entityId}` |
|
|
123
|
+
| Populated (portrait exists) | *"What do you want to change?"* | Edit surface — refines the existing portrait |
|
|
124
|
+
|
|
125
|
+
Both entry points reach the creation composer for an empty character, and both
|
|
126
|
+
bind. Verified live 2026-07-28: driving `/project/{id}/character/{entityId}` for
|
|
127
|
+
a pre-created empty entity produced `entityContext` in the request and
|
|
128
|
+
`parentEntityId` in the response — including for an entity gflow itself had
|
|
129
|
+
created minutes earlier. Entity age is not a factor.
|
|
130
|
+
|
|
131
|
+
`flow.createEntity` may be called by Flow (the **New Character** flow does it
|
|
132
|
+
itself, returning `displayName: "Untitled Character"`) or by the client
|
|
133
|
+
beforehand; gflow pre-creates and deep-links, which is fine. After the
|
|
134
|
+
generation Flow issues `PATCH /v1/flowWorkflows/{id}` twice
|
|
135
|
+
(`metadata.displayName`, then `metadata.primaryMediaId`) — the same commit gflow
|
|
136
|
+
already performs. Flow never asks for a name up front: the user renames
|
|
137
|
+
afterwards via the ✏️ next to the title, and "Character Info (optional)"
|
|
138
|
+
(*"Describe how your character acts…"*) is a separate free-text field.
|
|
139
|
+
|
|
140
|
+
**What actually broke gflow (#395)** was therefore NOT the choice of entry
|
|
141
|
+
point. Two client-side defects suppressed `entityContext` on a surface that
|
|
142
|
+
would otherwise have sent it:
|
|
143
|
+
|
|
144
|
+
1. **Overlay dismissal pressed Escape on the composer.** `[role='dialog']` and
|
|
145
|
+
`[role='alert']` in the overlay detector matched Flow's own character
|
|
146
|
+
composer (and the media picker), so gflow dismissed the app itself.
|
|
147
|
+
2. **The character route could bounce back to the project page** while the
|
|
148
|
+
entity was not yet queryable. The project page also mounts a prompt box, so
|
|
149
|
+
the readiness gate passed on the wrong surface and the prompt was typed into
|
|
150
|
+
the **project** composer.
|
|
151
|
+
|
|
152
|
+
With both fixed, the deep-linked editor binds reliably. See
|
|
153
|
+
[LIVE_VERIFICATION_v0.45.0 §2](LIVE_VERIFICATION_v0.45.0.md).
|
|
154
|
+
|
|
85
155
|
## Gaps
|
|
86
156
|
|
|
87
157
|
1. ✅ **RESOLVED — Entity create.** `POST /fx/api/trpc/flow.createEntity` `{json:{projectId}}` →
|
|
@@ -343,9 +343,9 @@ each link in turn, so total wallclock is the sum of all link waits).
|
|
|
343
343
|
|---|---|---|
|
|
344
344
|
| `--model` | `veo-lite` | `veo-lite` / `veo-fast` / `veo-quality` / `veo-lite-lp`. `omni-flash` is rejected — it can't seed i2v links (issue #125). |
|
|
345
345
|
| `--max-links N` | unset | Cap link count; exit 11 (`ConfigurationError`) if the manifest has more. A spend guardrail. |
|
|
346
|
-
| `-y` / `--yes` | off | Skip the
|
|
347
|
-
| `--dry-run` | off | Print the
|
|
348
|
-
| `--resume-from CHAIN_ID` | unset | Resume a prior chain by its id; already-
|
|
346
|
+
| `-y` / `--yes` | off | Skip the pending video operation confirmation prompt. |
|
|
347
|
+
| `--dry-run` | off | Print the pending video operation plan and submit nothing. |
|
|
348
|
+
| `--resume-from CHAIN_ID` | unset | Resume a prior chain by its id; already-completed links are skipped (not regenerated). |
|
|
349
349
|
| `--jitter F` | `0.0` | Random `0..F` second pause **between** links (anti-bot cadence; never before link 0). |
|
|
350
350
|
| `--seed-offset MS` | `0` | Extract the seed frame this many ms before EOF (fade-to-black guard). |
|
|
351
351
|
| `--aspect` | `9:16` | `9:16` / `16:9`. Applied uniformly to every link (continuity requirement). |
|
|
@@ -55,6 +55,8 @@ Welcome to the `gflow-cli` documentation. This index is the routing layer: it te
|
|
|
55
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 |
|
|
56
56
|
| [docs/superpowers/specs/2026-07-19-live-verify-design.md](superpowers/specs/2026-07-19-live-verify-design.md) | `/gflow:live-verify` design spec: pre-flight state check + per-feature live-verification gate generalizing release step 4b, council-reviewed | Reviewing or implementing the live-verification enforcement skill |
|
|
57
57
|
| [docs/superpowers/plans/2026-07-19-live-verify/PLAN.md](superpowers/plans/2026-07-19-live-verify/PLAN.md) | Task-by-task implementation plan for `/gflow:live-verify` (skill file → AGENTS.md/check.md wiring → INDEX row) | Tracking task-by-task execution of the live-verify skill |
|
|
58
|
+
| [docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/SCENARIO.md](superpowers/plans/2026-07-27-tier-aware-credit-confirmations/SCENARIO.md) | Edge-case matrix for replacing fixed chain/movie credit estimates with truthful pending-operation guidance | Reviewing the financial-safety, resume, dry-run, and compatibility scenarios |
|
|
59
|
+
| [docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/PLAN.md](superpowers/plans/2026-07-27-tier-aware-credit-confirmations/PLAN.md) | TDD implementation plan for tier-aware chain/movie planning and confirmation output | Tracking the isolated runtime pricing-guidance bugfix |
|
|
58
60
|
|
|
59
61
|
## Agent commands
|
|
60
62
|
|
|
@@ -133,7 +135,7 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
|
|
|
133
135
|
**"A command failed — where is the incident bundle and what's in it?"** → [DEBUGGING § Automatic incident bundles](DEBUGGING.md#automatic-incident-bundles) (layout, triggers, review-before-sharing); privacy boundaries: [SECURITY § Automatic incident bundles](SECURITY.md#automatic-incident-bundles-gflow_cli_incident_capture-default-on); disable via [CONFIGURATION § GFLOW_CLI_INCIDENT_CAPTURE](CONFIGURATION.md#gflow_cli_incident_capture)
|
|
134
136
|
**"Flow's UI broke a selector — how do I diagnose it?"** → [DEBUGGING § Inspecting Flow's live UI](DEBUGGING.md#inspecting-flows-live-ui)
|
|
135
137
|
**"What does each `ui_automation.*` log event mean?"** → [DEBUGGING § Listener & HTTP-layer debugging](DEBUGGING.md#listener--http-layer-debugging)
|
|
136
|
-
**What was actually live-verified for the latest release?** → latest: [LIVE_VERIFICATION_v0.44.0](LIVE_VERIFICATION_v0.44.0.md) (**#381 dual-side project management & Playwright Chromium transport live-verified 2026-07-26** — real-editor project creation + rename tRPC server/DOM sync, prompt slugging, `gflow project` subcommand family, HTTP 429 adaptive backoff, and full E2E test suite). Prior: [v0.43.0](LIVE_VERIFICATION_v0.43.0.md) (**private incident diagnostics live-verified 2026-07-23, 1 Veo credit**). Prior: [v0.42.0](LIVE_VERIFICATION_v0.42.0.md) (**#361 production-readiness live-gaps confirmed live 2026-07-21, 1 Veo credit** — a real `veo-lite` t2v through the worker path persisted a real `remote_started` checkpoint [observer→checkpoint→DB chain confirmed], crash-recovery classified the task `indeterminate` without resubmitting, and mid-launch cancellation released the `ProfileLease` credit-free; full evidence in [v0.40.0-production-readiness § "2026-07-21 live follow-up"](LIVE_VERIFICATION_v0.40.0-production-readiness.md#2026-07-21-live-follow-up-0420-cycle); #359 content-safety `400`→`ContentPolicyError` classification is unit-covered, not live-triggered [would require a deliberate policy violation]; #360/#362 are docs-only, verified by the documentation gates). Prior: [v0.41.0](LIVE_VERIFICATION_v0.41.0.md) (**#357 production-readiness hardening — stale-session fail-fast, free image gen, paid veo-lite T2V all proven live**). Prior: [v0.40.0](LIVE_VERIFICATION_v0.40.0.md) (**#344 `@`-mention asset-tagging resolution proven live e2e, ~2 Imagen credits** — `gflow character create` staged a real taggable character [bound reference images, `has_reference_images` guard], the e2e test's documented propagation wait cleared Flow's `projectInitialData` lag, and `gflow image t2i "@Zoro …"` passed with returncode 0, a real generated image, and the correctly de-tagged prompt in the catalog — no code changes needed, `resolve_and_apply` as merged in #344 already works end-to-end; pre-existing unrelated issue #174 [Flow media-library A/B flake] can still intermittently block generation regardless of this feature — recorded, not omitted). Prior: [v0.39.0](LIVE_VERIFICATION_v0.39.0.md) (**#341 failed-generation persistence proven live** — a real `image t2i` on denon82 failed at the wire [`batchGenerateImages` HTTP 400 → `WireFormatError`] and the record-on-catch funnel wrote the **first-ever `failed` row** into the production catalog [`error_type=wire-format`, redacted `error_detail`, browsable via `gflow data list errors`], **$0**; the remaining paid paths [video/chain/batch/movie/worker] are funnel-regression-tested, not force-failed live [would cost credits], and the status-aware `succeeded=false` video-poll fix is unit-locked — recorded, not omitted). Prior: [v0.38.1](LIVE_VERIFICATION_v0.38.1.md) (**#338 agentic-pin recovery proven live ON the pinned account** — run 1 caught the composer-render race the unit suite could not [`ensure_media_incomplete` +115 ms, toggle never reached]; the readiness-wait fix landed and run 2 recovered classic on denon82 after ~2h of pin [`ui_driver.bound mode=classic`, real 768×1376 JPEG, exact prompt adherence]; reload branch unit-locked, live trigger not observed this cycle — recorded, not omitted). Prior: [v0.38.0](LIVE_VERIFICATION_v0.38.0.md) (**#332 mode control + #314 i2i ref dedup proven live e2e** — `image t2i --ui-mode classic` recovered agentic→classic in a real run [`ui_mode.attempt_exit_agent` → full classic chain, 1376×768 JPEG]; two identical `image i2i` runs proved the dedup contract [run 1: picker miss → `image_uploaded`; run 2: `reference_deduped_by_filename`, ZERO uploads]; `video t2v` veo-fast [`MEDIA_GENERATION_STATUS_SUCCESSFUL`, 15.2 MB `ftyp` mp4]; autopilot #333 recorded deferred-with-reason [hermes-ops deployment staged separately]). Prior: [v0.37.0](LIVE_VERIFICATION_v0.37.0.md) (**viewport 1920×1080 + agentic count enforcement + FIPS-safe SAPISIDHASH proven live e2e** — `image t2i` [classic cohort, real 1376×768 JPEG] and `video t2v` veo-fast [`MEDIA_GENERATION_STATUS_SUCCESSFUL`, 11.5 MB `ftyp` mp4] both succeeded end-to-end at the new 1920×1080 viewport with every selector resolving [no drift]; SAPISIDHASH digest verified byte-identical [FIPS-safe `usedforsecurity=False`], auth unchanged). Prior: [v0.36.0](LIVE_VERIFICATION_v0.36.0.md) (**#316 diagnostic tooling live-verified against real Flow traffic** — `GFLOW_CLI_HAR_PATH` captured a real 54-entry HAR [real Flow domains, 34× 200s, and a genuine 401 the tool exists to diagnose]; `GFLOW_CLI_DEBUG_TRACEBACK`'s typed-error scoping confirmed live [console output identical with/without the flag on a `GFlowError`]; unhandled-path behavior covered by 6 new tests (30 total across both files) + SDD task review; #312 reference-entity-smuggling fix covered by its own dedicated e2e test). Prior: [v0.35.0](LIVE_VERIFICATION_v0.35.0.md) (**#305-follow-up multimodal reverse-engineering & storyboard tool proven live e2e** — `gflow tools run storyboard` successfully deconstructed a cyberpunk scene into a cohesive 4-panel sequence; `reverse-engineer` tool extracts frames from video streams/URLs using `claude-video`'s `watch.py` and produces structured prompt components using Gemini multimodal models; dynamic token budgeting and strict Pyright types verified via test suite). Prior: [v0.34.0](LIVE_VERIFICATION_v0.34.0.md) (**#299 `--ui-mode` gate proven live, ZERO credits** — drove `get_ui_driver` directly over 4 real editor loads, never generated: bidirectional switch works [classic→agentic via `_force_agent_mode`, agentic→classic via `_exit_agent_mode`, each DOM-reverified], `agentic`-when-already-agentic is idempotent, and a timed-out toggle → **exit-28 fail-fast before submission**; deprecation behavior-change [`prefer_classic`→exit 28] confirmed). Prior: [v0.33.0](LIVE_VERIFICATION_v0.33.0.md) (**#287-follow-up picker fix proven live on the original repro** — the v0.32.1-failing `i2v <uuid> --project <crowded>` command now exits 0 with a real 3.0 MB `ftyp` mp4, `frame_ref_attached` + `video_saved`, zero uploads; **#241 jitter live-verified on both paths** — flag `--jitter 4-6` → `batch_jitter_sleep seconds=4.98`, and the new 0.5–1.5 s default → `seconds=1.47`, each firing exactly once between two t2i submissions; environment note: the denon82 cohort is now natively agentic and round-2 generations hit the pre-existing #281 `MediaAttributionError`, not a regression). Prior: [v0.32.1](LIVE_VERIFICATION_v0.32.1.md) (**#293 teardown fix live-verified credit-free** — error-path aborts leave ZERO chrome.exe holding the profile [3× leak reproduced pre-fix same day]; force-close fallback + ProfileLockedError translation unit-pinned; #283 wave logic fixes mock-verified to exact call counts). Prior: [v0.32.0](LIVE_VERIFICATION_v0.32.0.md) (**#287 UUID i2v frames proven live e2e** — an in-project asset selected by media UUID in the frame-slot dialog [frame_ref_attached, startImage bound on the wire, ZERO upload events] produced a real 720×1280 interpolation, resolving the #237 negative prior; foreign UUID → exit 9 pre-generation with screenshot; **#288 duration fail-fast proven live** — exit 23 pre-submit saved a 10-credit generation, and the debug screenshot confirmed the duration control is ABSENT from the cohort's settings popover [locale hypothesis refuted]; upload-400 exit-27 repro deferred-with-reason — the original rejected JPEG no longer exists). Prior: [v0.31.0](LIVE_VERIFICATION_v0.31.0.md) (**#281 wrong-media defenses live-verified in BOTH directions, credit-free** — correct attribution downloads with real wire metadata [seed, 768×1376]; the incident-class lazy-render ambiguity reproduced live and hard-stopped with `MediaAttributionError` exit 26 naming every candidate UUID, no file written; **#282 two-UUID-ref i2i proven e2e** — both freshly generated portrait UUIDs picker-selected into one scene with both canonical identities visually transferred). Prior: [v0.30.0](LIVE_VERIFICATION_v0.30.0.md) (**agentic-cohort image path + both fixes live-verified credit-free** — native 768×1376 stills, i2i-chain + canonical-ref identity hold; the character-create `DataIntegrityError` and the `prefer_classic` WARNING were observed live then fixed [recorder idempotent + INFO log]; MCP video-param feature deferred-with-reason on Veo credits, per the stills-only goal). Prior: [v0.29.0](LIVE_VERIFICATION_v0.29.0.md) (**persistent `gflow instructions` CRUD proven live e2e GREEN, credit-free** — 11-command sequence on a fresh project: add incl. `--ref <image-UUID>` attach, list/enable/disable, master toggle both ways, TOML `apply` destructive full-sync with `enabled=false` honored, `rm` with server card-id preserved across mutations; movie brief-sync code-path-verified via the same primitives, deferred-with-reason on credits; MCP `gflow_instructions_*` tools are thin adapters over the live-verified primitives). Prior: [v0.28.0](LIVE_VERIFICATION_v0.28.0.md) (**agent instructions `-i` now steer agentic generation — crayon e2e GREEN**: a style-neutral prompt + an enabled "crayon" card produced an unmistakable crayon drawing through the real transport; root causes were conversational phrasing + the `project_brief.enabled` master switch). Prior: [v0.27.1](LIVE_VERIFICATION_v0.27.1.md) (**v0.27.0 release follow-up fixes and documentation sync**). Prior: [v0.27.0](LIVE_VERIFICATION_v0.27.0.md) (**`[style]` block with named variants + prompt-aware resume — credit-free CLI verification**: real `movie run --dry-run` 3-way ledger proving resolved-style display, `skip (done)` on matching `style_hash`, and `re-run (style changed)` after a style edit; composition is local, wire path untouched, so no Veo credits spent — first credited styled run will confirm visually). Prior: [v0.26.0](LIVE_VERIFICATION_v0.26.0.md) (**image i2i by generated-image UUID proven live e2e GREEN** — the existing asset is *selected in place* by its media UUID, no duplicate upload, producing an i2i output that references it; plus generated-image `display_name` capture, credited @C1ph3r404). Prior: [v0.25.0](LIVE_VERIFICATION_v0.25.0.md) (**#237 remote-UUID i2v proven live e2e GREEN** — a real 8s 720×1280 interpolation from a generated image's UUID, after the picker-search attach was reworked to local upload; #240 home-`.env` matrix live; plus two silent-failure guards root-caused live: video-as-image download rejection and rejected-upload fail-loud). Prior: [v0.24.0](LIVE_VERIFICATION_v0.24.0.md) (--project parity across CLI + MCP — automated coverage; live gen auth-gated). Prior: [v0.23.0](LIVE_VERIFICATION_v0.23.0.md) (MCP generation wiring proven live end-to-end — tool→worker→real Flow REST→structured-error translation; final image-write blocked by an expired session, environmental. #222 macOS fix reporter-verified e2e on Apple Silicon). Prior: [v0.22.0](LIVE_VERIFICATION_v0.22.0.md) (Tools framework — automated/CI coverage complete; credit/key-gated live feature run is a pending owner gate, see the doc) · [v0.21.0](LIVE_VERIFICATION_v0.21.0.md) (MCP server over stdio + HTTP/SSE — credit-free protocol handshake; 4 tools / 2 prompts / 3 resources confirmed on stdout) · [v0.20.1](LIVE_VERIFICATION_v0.20.1.md) · [v0.20.0](LIVE_VERIFICATION_v0.20.0.md) · [v0.19.0](LIVE_VERIFICATION_v0.19.0.md) · [v0.18.0](LIVE_VERIFICATION_v0.18.0.md) · [v0.17.0](LIVE_VERIFICATION_v0.17.0.md) · [v0.16.0](LIVE_VERIFICATION_v0.16.0.md) · [v0.13.0](LIVE_VERIFICATION_v0.13.0.md) · [v0.12.0](LIVE_VERIFICATION_v0.12.0.md) · [v0.11.0](LIVE_VERIFICATION_v0.11.0.md) · [v0.10.0](LIVE_VERIFICATION_v0.10.0.md) · [v0.9.1](LIVE_VERIFICATION_v0.9.1.md) · [v0.9.0](LIVE_VERIFICATION_v0.9.0.md) · [v0.8.1](LIVE_VERIFICATION_v0.8.1.md) · [v0.7.0](LIVE_VERIFICATION_v0.7.0.md)
|
|
138
|
+
**What was actually live-verified for the latest release?** → latest: [LIVE_VERIFICATION_v0.45.0](LIVE_VERIFICATION_v0.45.0.md) (**#393 UUID `--ref` binding + #395 character-entity binding live-verified 2026-07-27/28** — a controlled A/B on identical input flipped `--ref` from exit 9 to exit 0 via the catalog-backed upload fallback, with the anti-silence guard [an unbindable ref aborts non-zero and writes no image] pinned by a live e2e; picker DOM + HAR showed Flow indexes a short auto-caption, NOT the prompt, so a prompt-derived search hint was dropped rather than shipped on assumption; a CDP spike against Flow's own character flow then captured the `entityContext` contract that gflow's generations were missing, root-causing #395 to two gflow defects [overlay dismissal Escaping Flow's own composer, and a character-route bounce that sent the prompt to the project composer] — both fixed, both character e2e tests now pass live, including `--format-prompt` [#383], with a read-back confirming the character carries its name and `thumbnail_media_id`). Prior: [v0.44.0](LIVE_VERIFICATION_v0.44.0.md) (**#381 dual-side project management & Playwright Chromium transport live-verified 2026-07-26** — real-editor project creation + rename tRPC server/DOM sync, prompt slugging, `gflow project` subcommand family, HTTP 429 adaptive backoff, and full E2E test suite). Prior: [v0.43.0](LIVE_VERIFICATION_v0.43.0.md) (**private incident diagnostics live-verified 2026-07-23, 1 Veo credit**). Prior: [v0.42.0](LIVE_VERIFICATION_v0.42.0.md) (**#361 production-readiness live-gaps confirmed live 2026-07-21, 1 Veo credit** — a real `veo-lite` t2v through the worker path persisted a real `remote_started` checkpoint [observer→checkpoint→DB chain confirmed], crash-recovery classified the task `indeterminate` without resubmitting, and mid-launch cancellation released the `ProfileLease` credit-free; full evidence in [v0.40.0-production-readiness § "2026-07-21 live follow-up"](LIVE_VERIFICATION_v0.40.0-production-readiness.md#2026-07-21-live-follow-up-0420-cycle); #359 content-safety `400`→`ContentPolicyError` classification is unit-covered, not live-triggered [would require a deliberate policy violation]; #360/#362 are docs-only, verified by the documentation gates). Prior: [v0.41.0](LIVE_VERIFICATION_v0.41.0.md) (**#357 production-readiness hardening — stale-session fail-fast, free image gen, paid veo-lite T2V all proven live**). Prior: [v0.40.0](LIVE_VERIFICATION_v0.40.0.md) (**#344 `@`-mention asset-tagging resolution proven live e2e, ~2 Imagen credits** — `gflow character create` staged a real taggable character [bound reference images, `has_reference_images` guard], the e2e test's documented propagation wait cleared Flow's `projectInitialData` lag, and `gflow image t2i "@Zoro …"` passed with returncode 0, a real generated image, and the correctly de-tagged prompt in the catalog — no code changes needed, `resolve_and_apply` as merged in #344 already works end-to-end; pre-existing unrelated issue #174 [Flow media-library A/B flake] can still intermittently block generation regardless of this feature — recorded, not omitted). Prior: [v0.39.0](LIVE_VERIFICATION_v0.39.0.md) (**#341 failed-generation persistence proven live** — a real `image t2i` on denon82 failed at the wire [`batchGenerateImages` HTTP 400 → `WireFormatError`] and the record-on-catch funnel wrote the **first-ever `failed` row** into the production catalog [`error_type=wire-format`, redacted `error_detail`, browsable via `gflow data list errors`], **$0**; the remaining paid paths [video/chain/batch/movie/worker] are funnel-regression-tested, not force-failed live [would cost credits], and the status-aware `succeeded=false` video-poll fix is unit-locked — recorded, not omitted). Prior: [v0.38.1](LIVE_VERIFICATION_v0.38.1.md) (**#338 agentic-pin recovery proven live ON the pinned account** — run 1 caught the composer-render race the unit suite could not [`ensure_media_incomplete` +115 ms, toggle never reached]; the readiness-wait fix landed and run 2 recovered classic on denon82 after ~2h of pin [`ui_driver.bound mode=classic`, real 768×1376 JPEG, exact prompt adherence]; reload branch unit-locked, live trigger not observed this cycle — recorded, not omitted). Prior: [v0.38.0](LIVE_VERIFICATION_v0.38.0.md) (**#332 mode control + #314 i2i ref dedup proven live e2e** — `image t2i --ui-mode classic` recovered agentic→classic in a real run [`ui_mode.attempt_exit_agent` → full classic chain, 1376×768 JPEG]; two identical `image i2i` runs proved the dedup contract [run 1: picker miss → `image_uploaded`; run 2: `reference_deduped_by_filename`, ZERO uploads]; `video t2v` veo-fast [`MEDIA_GENERATION_STATUS_SUCCESSFUL`, 15.2 MB `ftyp` mp4]; autopilot #333 recorded deferred-with-reason [hermes-ops deployment staged separately]). Prior: [v0.37.0](LIVE_VERIFICATION_v0.37.0.md) (**viewport 1920×1080 + agentic count enforcement + FIPS-safe SAPISIDHASH proven live e2e** — `image t2i` [classic cohort, real 1376×768 JPEG] and `video t2v` veo-fast [`MEDIA_GENERATION_STATUS_SUCCESSFUL`, 11.5 MB `ftyp` mp4] both succeeded end-to-end at the new 1920×1080 viewport with every selector resolving [no drift]; SAPISIDHASH digest verified byte-identical [FIPS-safe `usedforsecurity=False`], auth unchanged). Prior: [v0.36.0](LIVE_VERIFICATION_v0.36.0.md) (**#316 diagnostic tooling live-verified against real Flow traffic** — `GFLOW_CLI_HAR_PATH` captured a real 54-entry HAR [real Flow domains, 34× 200s, and a genuine 401 the tool exists to diagnose]; `GFLOW_CLI_DEBUG_TRACEBACK`'s typed-error scoping confirmed live [console output identical with/without the flag on a `GFlowError`]; unhandled-path behavior covered by 6 new tests (30 total across both files) + SDD task review; #312 reference-entity-smuggling fix covered by its own dedicated e2e test). Prior: [v0.35.0](LIVE_VERIFICATION_v0.35.0.md) (**#305-follow-up multimodal reverse-engineering & storyboard tool proven live e2e** — `gflow tools run storyboard` successfully deconstructed a cyberpunk scene into a cohesive 4-panel sequence; `reverse-engineer` tool extracts frames from video streams/URLs using `claude-video`'s `watch.py` and produces structured prompt components using Gemini multimodal models; dynamic token budgeting and strict Pyright types verified via test suite). Prior: [v0.34.0](LIVE_VERIFICATION_v0.34.0.md) (**#299 `--ui-mode` gate proven live, ZERO credits** — drove `get_ui_driver` directly over 4 real editor loads, never generated: bidirectional switch works [classic→agentic via `_force_agent_mode`, agentic→classic via `_exit_agent_mode`, each DOM-reverified], `agentic`-when-already-agentic is idempotent, and a timed-out toggle → **exit-28 fail-fast before submission**; deprecation behavior-change [`prefer_classic`→exit 28] confirmed). Prior: [v0.33.0](LIVE_VERIFICATION_v0.33.0.md) (**#287-follow-up picker fix proven live on the original repro** — the v0.32.1-failing `i2v <uuid> --project <crowded>` command now exits 0 with a real 3.0 MB `ftyp` mp4, `frame_ref_attached` + `video_saved`, zero uploads; **#241 jitter live-verified on both paths** — flag `--jitter 4-6` → `batch_jitter_sleep seconds=4.98`, and the new 0.5–1.5 s default → `seconds=1.47`, each firing exactly once between two t2i submissions; environment note: the denon82 cohort is now natively agentic and round-2 generations hit the pre-existing #281 `MediaAttributionError`, not a regression). Prior: [v0.32.1](LIVE_VERIFICATION_v0.32.1.md) (**#293 teardown fix live-verified credit-free** — error-path aborts leave ZERO chrome.exe holding the profile [3× leak reproduced pre-fix same day]; force-close fallback + ProfileLockedError translation unit-pinned; #283 wave logic fixes mock-verified to exact call counts). Prior: [v0.32.0](LIVE_VERIFICATION_v0.32.0.md) (**#287 UUID i2v frames proven live e2e** — an in-project asset selected by media UUID in the frame-slot dialog [frame_ref_attached, startImage bound on the wire, ZERO upload events] produced a real 720×1280 interpolation, resolving the #237 negative prior; foreign UUID → exit 9 pre-generation with screenshot; **#288 duration fail-fast proven live** — exit 23 pre-submit saved a 10-credit generation, and the debug screenshot confirmed the duration control is ABSENT from the cohort's settings popover [locale hypothesis refuted]; upload-400 exit-27 repro deferred-with-reason — the original rejected JPEG no longer exists). Prior: [v0.31.0](LIVE_VERIFICATION_v0.31.0.md) (**#281 wrong-media defenses live-verified in BOTH directions, credit-free** — correct attribution downloads with real wire metadata [seed, 768×1376]; the incident-class lazy-render ambiguity reproduced live and hard-stopped with `MediaAttributionError` exit 26 naming every candidate UUID, no file written; **#282 two-UUID-ref i2i proven e2e** — both freshly generated portrait UUIDs picker-selected into one scene with both canonical identities visually transferred). Prior: [v0.30.0](LIVE_VERIFICATION_v0.30.0.md) (**agentic-cohort image path + both fixes live-verified credit-free** — native 768×1376 stills, i2i-chain + canonical-ref identity hold; the character-create `DataIntegrityError` and the `prefer_classic` WARNING were observed live then fixed [recorder idempotent + INFO log]; MCP video-param feature deferred-with-reason on Veo credits, per the stills-only goal). Prior: [v0.29.0](LIVE_VERIFICATION_v0.29.0.md) (**persistent `gflow instructions` CRUD proven live e2e GREEN, credit-free** — 11-command sequence on a fresh project: add incl. `--ref <image-UUID>` attach, list/enable/disable, master toggle both ways, TOML `apply` destructive full-sync with `enabled=false` honored, `rm` with server card-id preserved across mutations; movie brief-sync code-path-verified via the same primitives, deferred-with-reason on credits; MCP `gflow_instructions_*` tools are thin adapters over the live-verified primitives). Prior: [v0.28.0](LIVE_VERIFICATION_v0.28.0.md) (**agent instructions `-i` now steer agentic generation — crayon e2e GREEN**: a style-neutral prompt + an enabled "crayon" card produced an unmistakable crayon drawing through the real transport; root causes were conversational phrasing + the `project_brief.enabled` master switch). Prior: [v0.27.1](LIVE_VERIFICATION_v0.27.1.md) (**v0.27.0 release follow-up fixes and documentation sync**). Prior: [v0.27.0](LIVE_VERIFICATION_v0.27.0.md) (**`[style]` block with named variants + prompt-aware resume — credit-free CLI verification**: real `movie run --dry-run` 3-way ledger proving resolved-style display, `skip (done)` on matching `style_hash`, and `re-run (style changed)` after a style edit; composition is local, wire path untouched, so no Veo credits spent — first credited styled run will confirm visually). Prior: [v0.26.0](LIVE_VERIFICATION_v0.26.0.md) (**image i2i by generated-image UUID proven live e2e GREEN** — the existing asset is *selected in place* by its media UUID, no duplicate upload, producing an i2i output that references it; plus generated-image `display_name` capture, credited @C1ph3r404). Prior: [v0.25.0](LIVE_VERIFICATION_v0.25.0.md) (**#237 remote-UUID i2v proven live e2e GREEN** — a real 8s 720×1280 interpolation from a generated image's UUID, after the picker-search attach was reworked to local upload; #240 home-`.env` matrix live; plus two silent-failure guards root-caused live: video-as-image download rejection and rejected-upload fail-loud). Prior: [v0.24.0](LIVE_VERIFICATION_v0.24.0.md) (--project parity across CLI + MCP — automated coverage; live gen auth-gated). Prior: [v0.23.0](LIVE_VERIFICATION_v0.23.0.md) (MCP generation wiring proven live end-to-end — tool→worker→real Flow REST→structured-error translation; final image-write blocked by an expired session, environmental. #222 macOS fix reporter-verified e2e on Apple Silicon). Prior: [v0.22.0](LIVE_VERIFICATION_v0.22.0.md) (Tools framework — automated/CI coverage complete; credit/key-gated live feature run is a pending owner gate, see the doc) · [v0.21.0](LIVE_VERIFICATION_v0.21.0.md) (MCP server over stdio + HTTP/SSE — credit-free protocol handshake; 4 tools / 2 prompts / 3 resources confirmed on stdout) · [v0.20.1](LIVE_VERIFICATION_v0.20.1.md) · [v0.20.0](LIVE_VERIFICATION_v0.20.0.md) · [v0.19.0](LIVE_VERIFICATION_v0.19.0.md) · [v0.18.0](LIVE_VERIFICATION_v0.18.0.md) · [v0.17.0](LIVE_VERIFICATION_v0.17.0.md) · [v0.16.0](LIVE_VERIFICATION_v0.16.0.md) · [v0.13.0](LIVE_VERIFICATION_v0.13.0.md) · [v0.12.0](LIVE_VERIFICATION_v0.12.0.md) · [v0.11.0](LIVE_VERIFICATION_v0.11.0.md) · [v0.10.0](LIVE_VERIFICATION_v0.10.0.md) · [v0.9.1](LIVE_VERIFICATION_v0.9.1.md) · [v0.9.0](LIVE_VERIFICATION_v0.9.0.md) · [v0.8.1](LIVE_VERIFICATION_v0.8.1.md) · [v0.7.0](LIVE_VERIFICATION_v0.7.0.md)
|
|
137
139
|
**"Where is the reverse-engineered wire protocol for a feature?"** → the `*_RECON.md` design docs: [CHARACTER_RECON](CHARACTER_RECON.md) (Flow character entity protocol), [IMAGE_UPSCALE_RECON](IMAGE_UPSCALE_RECON.md) (`/v1/flow/upsampleImage` wire). Naming convention: one `<FEATURE>_RECON.md` per reverse-engineered surface, kept as the durable spec after the feature ships. Pre-capture research recons: [ASSET_TAGGING_RECON](ASSET_TAGGING_RECON.md) (`@`-mention asset tagging — shipped in v0.40.0, see [LIVE_VERIFICATION_v0.40.0](LIVE_VERIFICATION_v0.40.0.md)).
|
|
138
140
|
**"What was live-verified for the data layer (PR #58)?"** → [LIVE_VERIFICATION_data_layer](LIVE_VERIFICATION_data_layer.md) — 1 Imagen + 1 Veo credit on denon82, 6-layer ledger (file + magic + Pillow + DB rows + CLI round-trip + structlog)
|
|
139
141
|
**"What was live-verified for the video-download feature (#29)?"** → [LIVE_VERIFICATION_video_download](LIVE_VERIFICATION_video_download.md)
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# Live verification — v0.45.0
|
|
2
|
+
|
|
3
|
+
> Evidence that v0.45.0's user-facing changes were exercised against **real**
|
|
4
|
+
> Google Flow, not just mocked tests. Profile `ffroliva`, 2026-07-27.
|
|
5
|
+
> See [E2E_TESTING.md](E2E_TESTING.md) for the marker/cost model.
|
|
6
|
+
|
|
7
|
+
Offline gates for the release: `ruff` clean, `pyright src` 0 errors, full
|
|
8
|
+
suite green (see §5).
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 1. `image i2i --ref <UUID>` reference binding (#393) — ✅ VERIFIED
|
|
13
|
+
|
|
14
|
+
The field report claimed a UUID `--ref` was **silently** dropped and the
|
|
15
|
+
generation "reported success" without the reference. Live investigation
|
|
16
|
+
disproved the silence and found the real defect.
|
|
17
|
+
|
|
18
|
+
### 1.1 What Flow actually does (measured, not assumed)
|
|
19
|
+
|
|
20
|
+
| Probe | Observation |
|
|
21
|
+
|---|---|
|
|
22
|
+
| `--ref <uuid>` of a recent in-project asset | Tile found in the picker's first viewport → `image_ref_selected_existing`, exit 0 |
|
|
23
|
+
| `--ref <uuid>` of an older in-project asset | Both UUID search tiers `found: false`; the **scroll fallback** located it → exit 0 |
|
|
24
|
+
| `--ref <uuid>` that cannot exist | Search tiers miss → scroll misses → **exit 9**, `TransportTimeoutError`. **Not silent.** |
|
|
25
|
+
| Picker DOM dump (`debug_picker_dom_*.json`) | Tiles carry `img src=…?name=<uuid>` **and** a short Flow-authored caption (`alt="Box tied with crimson ribbon"`) — **not** the generation prompt |
|
|
26
|
+
| HAR capture of `batchGenerateImages` | Response confirms the caption source: `workflows[0].metadata.displayName = "Calm woman natural light portrait"` |
|
|
27
|
+
|
|
28
|
+
Consequences for the fix: UUID-based tile matching is exact and stays; a
|
|
29
|
+
**prompt-derived search hint cannot work** on this surface (tried live, returned
|
|
30
|
+
zero tiles) and was therefore dropped from the change rather than shipped on the
|
|
31
|
+
strength of a plausible-sounding assumption.
|
|
32
|
+
|
|
33
|
+
### 1.2 Controlled A/B — identical input, fix toggled
|
|
34
|
+
|
|
35
|
+
Ref `61a0423e-…` (owned by the profile, cataloged with a local file, living in a
|
|
36
|
+
**different** project so its tile is unreachable from the target project's
|
|
37
|
+
picker):
|
|
38
|
+
|
|
39
|
+
| Build | Result |
|
|
40
|
+
|---|---|
|
|
41
|
+
| Pre-fix (fix stashed) | `existing_asset_not_found` → **exit 9**, `image_ref_upload_fallback` fired **0** times |
|
|
42
|
+
| Post-fix | `existing_asset_not_found` → **`image_ref_upload_fallback`** → **exit 0**, 774 KB `.jpg` written |
|
|
43
|
+
|
|
44
|
+
The 5 layers: file written (774 KB) · `.jpg` payload on disk · picker-miss and
|
|
45
|
+
upload-fallback events in the structlog stream · non-zero → zero exit-code flip
|
|
46
|
+
on identical input · the generated image is user-inspectable in the scratch
|
|
47
|
+
project.
|
|
48
|
+
|
|
49
|
+
### 1.3 Automated coverage
|
|
50
|
+
|
|
51
|
+
- `tests/cli/test_cli_image_uuid_ref_enrichment.py` — 8 unit tests (catalog hit,
|
|
52
|
+
missing file, absent file record, unknown asset, catalog failure, mention
|
|
53
|
+
display-name preserved, single catalog open for 10 refs, no open for zero refs).
|
|
54
|
+
- `tests/e2e/test_image_uuid_ref_e2e.py` — **2 live scenarios, both passing**:
|
|
55
|
+
- `test_e2e_unresolvable_uuid_ref_fails_loud` — the anti-silence guard: an
|
|
56
|
+
unbindable ref must abort non-zero and write no generated image (0 credits).
|
|
57
|
+
- `test_e2e_cross_project_uuid_ref_falls_back_to_upload` — seed image in
|
|
58
|
+
project A, referenced from a fresh project B, rescued by the upload fallback
|
|
59
|
+
(2 Imagen credits).
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## 2. `character create` binding + `--format-prompt` (#395, #383) — ✅ VERIFIED
|
|
64
|
+
|
|
65
|
+
Originally recorded here as *not verifiable this cycle*. That was wrong in an
|
|
66
|
+
important way: the cause was **ours**, not Flow's, and the spike below found it.
|
|
67
|
+
|
|
68
|
+
### 2.1 What the spike established
|
|
69
|
+
|
|
70
|
+
Drove Flow's own character flow in a CDP-attached real Chrome
|
|
71
|
+
(`gflow-agent-browser-spike`, `navigator.webdriver: false`) with full
|
|
72
|
+
request/response capture, then diffed it against gflow's traffic. The two
|
|
73
|
+
requests were byte-comparable except for one block:
|
|
74
|
+
|
|
75
|
+
```jsonc
|
|
76
|
+
"mediaGenerationContext": {
|
|
77
|
+
"entityContext": { "entityId": "…", "characterSlot": { "imageReferenceIndex": 0 } }
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
With it, the response carries `parentEntityId` and the portrait binds; without
|
|
82
|
+
it, Flow files a plain project image. Contract documented in
|
|
83
|
+
[CHARACTER_RECON](CHARACTER_RECON.md#entity-binding-entitycontext-captured-live-2026-07-28).
|
|
84
|
+
|
|
85
|
+
### 2.2 Two defects, both ours
|
|
86
|
+
|
|
87
|
+
| # | Defect | Evidence |
|
|
88
|
+
|---|---|---|
|
|
89
|
+
| 1 | Overlay dismissal pressed **Escape** on Flow's own composer — `[role='dialog']`/`[role='alert']` matched the app itself — so the submit lost `entityContext` | Removing those two selectors made the identical command bind on the first try (`entity_patched`, real `thumbnail_media_id`); with them present it failed every run |
|
|
90
|
+
| 2 | The character route can **bounce** back to the project page (entity not yet queryable after `createEntity`); the project page also mounts a prompt box, so the readiness gate passed on the wrong surface and the prompt went into the **project** composer | `character_editor_ready` logged with the *project* URL; the new guard logs `character_route_bounced` → `character_route_settled` and the URL is now the character route |
|
|
91
|
+
|
|
92
|
+
A third symptom seen on 2026-07-27 — Flow's app crashing on that route — was
|
|
93
|
+
real but intermittent and is now reported as the typed retryable `FlowAppError`
|
|
94
|
+
(§3).
|
|
95
|
+
|
|
96
|
+
### 2.3 Proof
|
|
97
|
+
|
|
98
|
+
- `gflow character create --name "Overlay Hypothesis"` → `"status": "ok"`,
|
|
99
|
+
`character_create.entity_patched`; read-back shows the character with its name
|
|
100
|
+
**and** `thumbnail_media_id: fdaea0d2-…` — the first fully successful create
|
|
101
|
+
since the breakage.
|
|
102
|
+
- `tests/e2e/test_character_create_e2e.py::test_character_create_binds_parent_entity`
|
|
103
|
+
— **passes live** (this is the #395 contract: entity bound, same project,
|
|
104
|
+
thumbnail attached).
|
|
105
|
+
- `tests/e2e/test_character_create_e2e.py::test_character_create_format_prompt_clicks_format_button`
|
|
106
|
+
— **passes live**, asserting the `ui_automation.prompt_formatted` event fired
|
|
107
|
+
(visible **and** enabled button clicked) and that neither skip-telemetry event
|
|
108
|
+
appeared, so a no-op flag cannot pass as success. This closes the
|
|
109
|
+
`--format-prompt` (#383) verification that was owed since 2026-07-26.
|
|
110
|
+
|
|
111
|
+
A harness bug was fixed on the way: `_character_env` inherited the isolated
|
|
112
|
+
`GFLOW_CLI_HOME`, so every subprocess test in that file exited 2 with
|
|
113
|
+
"No session" before reaching Flow.
|
|
114
|
+
|
|
115
|
+
## 3. Error-classification fixes — ✅ VERIFIED (observed live, unit-pinned)
|
|
116
|
+
|
|
117
|
+
| Change | Live basis |
|
|
118
|
+
|---|---|
|
|
119
|
+
| Flow app crash at the character-editor gate → typed retryable `FlowAppError` (exit 31) instead of a bare `RuntimeError` naming a selector | Incident `ui.json` `title.category: flow_app_crash` (§2.1) |
|
|
120
|
+
| Character binding failure message now states the image was filed as a plain project image | HAR + read-back showing unbound "Untitled Character" entities (§2.1) |
|
|
121
|
+
|
|
122
|
+
Unit coverage: `test_flow_app_crash_raises_typed_retryable_error`,
|
|
123
|
+
`test_non_crash_still_raises_selector_runtime_error`, plus tightened assertions
|
|
124
|
+
in `tests/api/test_client_generate_character.py` (the previous
|
|
125
|
+
`assert … or exc_info.value.detail` was vacuous — always truthy).
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## 4. Not exercised this cycle
|
|
130
|
+
|
|
131
|
+
- **Veo/video paths** — no video generation was run; this release changes none.
|
|
132
|
+
- **Top banner & modal dismissal (#369)** — exercised incidentally (overlay
|
|
133
|
+
detect/dismiss events fired during the image runs above) but not
|
|
134
|
+
purpose-tested against a real "What's new" banner, which cannot be summoned on
|
|
135
|
+
demand.
|
|
136
|
+
- **Self-documenting error remediation (#380)** — the remediation hint was
|
|
137
|
+
observed on a real `TransportTimeoutError` payload during §1.1; the full
|
|
138
|
+
matrix of exception classes is unit-covered only.
|
|
@@ -231,12 +231,15 @@ For each scene, `gflow movie` merges global manifest cards with scene overrides
|
|
|
231
231
|
|------|---------|--------|
|
|
232
232
|
| `--profile <name>` | default profile | Chrome profile to drive (must be a `chrome`-strategy profile). |
|
|
233
233
|
| `--out-dir <dir>` | manifest `output_dir` | Override the output directory. |
|
|
234
|
-
| `--dry-run` | off | Print the
|
|
234
|
+
| `--dry-run` | off | Print the pending video operation plan; make **no** API calls. |
|
|
235
235
|
| `--fail-fast` / `--continue-on-error` | continue | Stop on the first scene failure, or attempt the rest (default). |
|
|
236
236
|
| `--stitch` | off | After generating, hard-concat all clips into one preview mp4 (ffmpeg, no transitions). |
|
|
237
237
|
|
|
238
238
|
## Credits
|
|
239
239
|
|
|
240
240
|
- Character creation (image generation) is **free** — no credits, no reCAPTCHA.
|
|
241
|
-
- Each **scene** is one video generation
|
|
242
|
-
above
|
|
241
|
+
- Each **scene** is one pending video generation operation, submitted at step 2
|
|
242
|
+
above. Current credit use varies by model, duration, account tier, and Flow
|
|
243
|
+
policy — check Google Flow before submitting. An accepted operation may
|
|
244
|
+
consume credits even if later polling or download fails. A `--dry-run` prints
|
|
245
|
+
the plan without submitting anything.
|
|
@@ -4,9 +4,16 @@
|
|
|
4
4
|
|
|
5
5
|
## Current release
|
|
6
6
|
|
|
7
|
+
**v0.45.0 — alpha.** **Reference + character binding fixes (#393/#395).** `gflow image i2i --ref <UUID>` now attaches the catalog's recorded file when Flow's per-project media picker cannot reach the tile, instead of failing the run — the fail-loud contract (never generate without a requested reference) is unchanged and pinned by a live e2e. `gflow character create` binds portraits to the character again: overlay dismissal was pressing Escape on Flow's own composer (`[role='dialog']`/`[role='alert']` matched the app itself), and the character route could bounce to the project page, sending the prompt to the **project** composer — both produced generations with no `entityContext`, which Flow filed as plain project images. Also: a Flow web-app crash on the character route is now the typed retryable `FlowAppError` (exit 31), character binding failures say what actually happened, and `--format-prompt` (#383) is live-verified. 2810 tests pass. See [LIVE_VERIFICATION_v0.45.0.md](LIVE_VERIFICATION_v0.45.0.md).
|
|
8
|
+
|
|
9
|
+
**Develop (unreleased, post-v0.45.0):** *(empty — develop is the staging branch for the next release).*
|
|
10
|
+
|
|
11
|
+
<details><summary>v0.44.0 — dual-side project naming & management (#381)</summary>
|
|
12
|
+
|
|
7
13
|
**v0.44.0 — alpha.** **Dual-side project naming & management (#381).** Feature set includes `gflow project` subcommand family (`list`, `show`, `rename`, `create`), `--project-name` / `--project-title` options across `gflow image` (`t2i`, `i2i`) and `gflow video` (`t2v`, `i2v`, `r2v`) generation commands, prompt slugging for scratch projects, dual-side title sync updating Google Flow's tRPC server/UI and local SQLite catalog in lockstep, HTTP 429 adaptive backoff / `RateLimitError` recovery (#384), character body prompt composer fixes (#378), and a repo-local Codex plugin (`$gflow:*` skills). Verified via full test suite and live Playwright Chromium E2E transport test. See [LIVE_VERIFICATION_v0.44.0.md](LIVE_VERIFICATION_v0.44.0.md).
|
|
8
14
|
|
|
9
|
-
|
|
15
|
+
</details>
|
|
16
|
+
|
|
10
17
|
|
|
11
18
|
<details><summary>v0.42.0 — content-safety classification + Antigravity coding agent (#359/#360/#361)</summary>
|
|
12
19
|
|
|
@@ -633,10 +633,13 @@ Link 0 is a text-to-video (T2V) generation; every later link is an
|
|
|
633
633
|
image-to-video (I2V) generation **seeded by the extracted last frame of the
|
|
634
634
|
previous clip**, giving visual continuity with no server-side stitching.
|
|
635
635
|
|
|
636
|
-
> ⚠️ **
|
|
637
|
-
>
|
|
638
|
-
>
|
|
639
|
-
>
|
|
636
|
+
> ⚠️ **Each link is a pending video generation operation.** A chain submits N
|
|
637
|
+
> sequential Veo generations that may consume credits; current cost varies by
|
|
638
|
+
> model, duration, account tier, and Flow policy — check Google Flow before
|
|
639
|
+
> submitting. An accepted operation may consume credits even if later polling
|
|
640
|
+
> or download fails. Run `--dry-run` first to print the plan without
|
|
641
|
+
> submitting anything. The confirmation prompt is shown unless you pass
|
|
642
|
+
> `-y` / `--yes`.
|
|
640
643
|
|
|
641
644
|
> **Requires the `chain` extra.** The last-frame extractor decodes the previous
|
|
642
645
|
> clip with [PyAV](https://pyav.org/) (no system ffmpeg needed). Install it
|
|
@@ -708,13 +711,13 @@ concatenate them server-side.** Chain does not auto-concat: see the
|
|
|
708
711
|
**Examples:**
|
|
709
712
|
|
|
710
713
|
```bash
|
|
711
|
-
# Preview the
|
|
714
|
+
# Preview the pending video operation plan — submits nothing
|
|
712
715
|
gflow video chain story.jsonl --dry-run
|
|
713
716
|
|
|
714
|
-
# Generate the chain (one
|
|
717
|
+
# Generate the chain (one pending video operation per link), no confirmation prompt
|
|
715
718
|
gflow video chain story.jsonl --model veo-fast --aspect 16:9 --yes
|
|
716
719
|
|
|
717
|
-
# Resume a chain that died partway — already-
|
|
720
|
+
# Resume a chain that died partway — already-completed links are skipped
|
|
718
721
|
gflow video chain story.jsonl --resume-from 1f2e3d4c-...
|
|
719
722
|
|
|
720
723
|
# Seed 150 ms before EOF to dodge a fade-to-black final frame
|