gflow-cli 0.64.0__tar.gz → 0.66.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.64.0 → gflow_cli-0.66.0}/.codex-plugin/plugin.json +1 -1
- gflow_cli-0.66.0/.github/workflows/star-history-watch.yml +89 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/CHANGELOG.md +138 -1
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/CONTRIBUTING.md +3 -3
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/KNOWN_ISSUES.md +75 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/PKG-INFO +10 -3
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/README.md +9 -2
- {gflow_cli-0.64.0/website → gflow_cli-0.66.0}/docs/DEBUGGING.md +5 -1
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/DEVELOPMENT.md +1 -1
- {gflow_cli-0.64.0/website → gflow_cli-0.66.0}/docs/E2E_TESTING.md +23 -14
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/INDEX.md +6 -0
- gflow_cli-0.66.0/docs/LIVE_VERIFICATION_reference_entity_guard.md +92 -0
- gflow_cli-0.66.0/docs/LIVE_VERIFICATION_v0.65.0.md +72 -0
- gflow_cli-0.66.0/docs/LIVE_VERIFICATION_v0.66.0.md +119 -0
- {gflow_cli-0.64.0/website → gflow_cli-0.66.0}/docs/MCP.md +1 -1
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/MOVIE.md +11 -1
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/PROJECT_STATUS.md +89 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/USAGE.md +22 -6
- {gflow_cli-0.64.0/website → gflow_cli-0.66.0}/docs/USER_GUIDE.md +1 -1
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/pyproject.toml +5 -5
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/canary/run_canary.py +12 -9
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/ci/check_release_artifacts.py +37 -1
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/spike_waf_camoufox.py +2 -2
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/skills/live-verify/SKILL.md +1 -1
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/skills/release/SKILL.md +22 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/__init__.py +1 -1
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/api/transports/_common.py +32 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/api/transports/ui_automation.py +9 -7
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/api/transports/ui_automation_video.py +73 -16
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/chain.py +47 -9
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/chain_manifest.py +7 -1
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/cli_video.py +55 -20
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/diagnostics.py +11 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/errors.py +40 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/mcp/tools.py +23 -2
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/movie_manifest.py +38 -6
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/transports/test_agentic_cohort_detection.py +104 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/transports/test_common.py +54 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/transports/test_ui_automation.py +177 -8
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/cli/test_cli_video.py +33 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/cli/test_cli_video_chain.py +57 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/cli/test_movie_manifest.py +53 -1
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/e2e/conftest.py +2 -2
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/e2e/test_agentic_count_enforcement_e2e.py +1 -1
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/e2e/test_asset_tagging_e2e.py +2 -1
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/e2e/test_chain_e2e.py +5 -8
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/e2e/test_character_create_e2e.py +6 -5
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/e2e/test_data_layer_e2e.py +3 -3
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/e2e/test_entity_provenance_e2e.py +7 -6
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/e2e/test_entity_smuggling_e2e.py +42 -21
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/e2e/test_i2v_flags_e2e.py +94 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +1 -1
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/e2e/test_image_uuid_ref_e2e.py +3 -3
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/e2e/test_json_output_e2e.py +1 -1
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/e2e/test_refresh_on_miss_e2e.py +1 -1
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/e2e/test_video_r2v_uuid_name_e2e.py +1 -1
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/mcp/test_server.py +46 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/mcp/test_tools_wired.py +12 -4
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/scripts/test_check_release_artifacts.py +53 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/smoke/test_real_flow.py +1 -1
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_chain.py +96 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_chain_manifest.py +6 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_diagnostics_recorder.py +28 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_diagnostics_sanitize.py +13 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/uv.lock +1 -1
- {gflow_cli-0.64.0 → gflow_cli-0.66.0/website}/docs/DEBUGGING.md +5 -1
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/website/docs/DEVELOPMENT.md +1 -1
- {gflow_cli-0.64.0 → gflow_cli-0.66.0/website}/docs/E2E_TESTING.md +23 -14
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/website/docs/KNOWN_ISSUES.md +75 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0/website}/docs/MCP.md +1 -1
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/website/docs/MOVIE.md +11 -1
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/website/docs/USAGE.md +22 -6
- {gflow_cli-0.64.0 → gflow_cli-0.66.0/website}/docs/USER_GUIDE.md +1 -1
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.agents/plugins/marketplace.json +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.claude/README.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.claude/commands/gflow/active.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.claude/commands/gflow/branch-review.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.claude/commands/gflow/changelog.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.claude/commands/gflow/check.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.claude/commands/gflow/doc-review.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.claude/commands/gflow/issue-assessment.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.claude/commands/gflow/issue-resolve.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.claude/commands/gflow/known-issues.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.claude/commands/gflow/live-verify.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.claude/commands/gflow/llm-council.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.claude/commands/gflow/next.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.claude/commands/gflow/plan.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.claude/commands/gflow/pr-council-review.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.claude/commands/gflow/predict.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.claude/commands/gflow/release.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.claude/commands/gflow/scenario.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.claude/commands/gflow/sonar.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.claude/commands/gflow/status.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.env.template +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.gitattributes +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.github/CODEOWNERS +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.github/FUNDING.yml +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.github/copilot-instructions.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.github/dependabot.yml +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.github/workflows/ci.yml +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.github/workflows/deps-watch.yml +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.github/workflows/external-pr-triage.yml +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.github/workflows/governance-advisory.yml +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.github/workflows/governance-benchmark.yml +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.github/workflows/labels.yml +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.github/workflows/main-base-guard.yml +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.github/workflows/pages.yml +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.github/workflows/release.yml +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.github/workflows/scorecard.yml +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.github/workflows/selector-probe.yml +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.gitignore +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.gitleaks.toml +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.pre-commit-config.yaml +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/.secrets.baseline +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/AGENTS.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/CLAUDE.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/CONFIGURATION.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/DISCLAIMER.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/LICENSE +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/PLAN.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/RELEASE.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/ROADMAP.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/conftest.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/deploy/PR-TRIAGE-AUTOPILOT-OPS.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/deploy/logrotate-pr-triage +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docker-compose.yml +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/ACCOUNT_SAFETY.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/AGENT_GUIDE.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/AGENT_UI_E2E.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/AGENT_UI_RECON.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/ASSET_TAGGING_RECON.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/CHARACTER.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/CHARACTER_RECON.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/CONFIGURATION.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/DATA_LAYER.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/DEMOS.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/GITHUB.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/INSTRUCTIONS.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_playwright_1.61.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.21.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.22.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.23.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.24.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.25.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.26.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.27.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.27.1.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.28.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.29.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.30.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.31.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.32.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.32.1.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.33.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.34.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.35.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.36.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.37.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.38.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.38.1.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.39.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.40.0-production-readiness.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.40.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.41.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.42.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.43.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.44.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.45.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.46.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.46.1.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.47.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.48.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.49.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.50.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.51.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.52.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.54.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.55.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.56.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.57.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.57.1.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.58.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.59.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.60.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.61.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.62.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.62.1.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.63.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.64.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/MEDIA_LIBRARY.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/PROMPT_EXPANSION.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/REFERENCE_STRATEGIES.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/SECURITY.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/TOOLS.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/assets/demo-split-pf.gif +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/assets/example-run.gif +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/assets/examples.webp +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/medium_tutorial.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/schemas/movie-handoff.schema.json +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/sonar-cleanup-tracker.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-07-08-pr-triage-autopilot/PLAN.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-07-09-camoufox-adoption/PLAN.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-07-14-storyboarding-and-visual-curation/PLAN.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-07-18-asset-tagging/PLAN.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-07-19-live-verify/PLAN.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-07-19-production-readiness-browser-lifecycle.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-07-19-production-readiness-driver-cdp-verification.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-07-19-production-readiness-public-truth.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-07-19-production-readiness-queue-safety.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-07-26-character-prompt-polishing/PLAN.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-07-26-project-name-management/PLAN.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-07-26-self-documenting-errors/PLAN.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-07-27-overlay-banner-dismissal/PLAN.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/PLAN.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/SCENARIO.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-08-04-mcp-tasks/PLAN.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-08-04-output-hardening/PLAN.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-08-05-issue-317-intra-batch-references/PLAN.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-08-05-issue-317-intra-batch-references/SCENARIO.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-08-05-issue-402-entity-provenance/PLAN.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-08-05-issue-402-entity-provenance/SCENARIO.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-08-05-issue-451-duration-tab-drift/PLAN.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-08-05-issue-451-duration-tab-drift/SCENARIO.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-08-06-driver-delay-jittering/PLAN.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-08-06-driver-delay-jittering/SCENARIO.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-08-06-overlay-changelog-watermark/PLAN.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-08-06-overlay-changelog-watermark/SCENARIO.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-08-06-ui-mode-policy/PLAN.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-08-06-ui-mode-policy/SCENARIO.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-08-14-video-ui-mode-policy/PLAN.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-08-14-video-ui-mode-policy/SCENARIO.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-08-21-selector-registry.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-08-25-workflow-hardening-gaps.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/plans/2026-09-01-video-extend/PLAN.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/research/2026-06-27-tool-abstraction-evaluation.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/specs/2026-06-29-issue-assessment-workflow-design.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/specs/2026-07-04-pr-triage-autopilot-design.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/specs/2026-07-18-asset-tagging-design.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/specs/2026-07-19-live-verify-design.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/specs/2026-07-19-production-readiness-hardening-design.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/specs/2026-08-21-selector-registry-design.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/specs/2026-08-26-model-attribution-provenance.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/specs/2026-08-26-model-cost-quota-catalog.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/specs/2026-08-27-changelog-modal-precondition-design.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/spikes/2026-07-09-camoufox-waf-403.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/spikes/2026-07-12-ui-cohort-backend-config.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/spikes/2026-07-17-production-readiness-assessment.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/spikes/2026-08-01-mcp-2026-07-28-spec-impact.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/spikes/2026-08-14-video-model-capability-matrix.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/spikes/2026-08-15-picker-tile-alt-text.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/docs/superpowers/spikes/2026-08-31-veo-extend-route-recon.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/eval/pr_triage_eval.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/eval/pr_triage_fixtures.json +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/examples/README.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/examples/batch_from_config.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/examples/multi_prompt_t2i.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/examples/sample_config.json +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/examples/sample_prompts.txt +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/examples/single_image_t2i.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/examples/workflow_chain.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/index.html +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/llms.txt +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/samples/README.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/samples/captured/01_upload_image.json +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/samples/captured/04_archive_workflow.json +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/samples/captured/05_createProject.json +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/samples/captured/06_batchGenerateImages.json +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/samples/captured/12_create_scene.json +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/samples/captured/14_get_scene_workflows.json +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/autopilot/Dockerfile.triage +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/autopilot/entrypoint.sh +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/autopilot/package-lock.json +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/autopilot/package.json +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/autopilot/pr_triage_autopilot.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/autopilot/pr_triage_gate.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/autopilot/run_sandboxed_review.sh +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/canary/register_task.ps1 +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/ci/check_doc_links.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/ci/check_materiality.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/ci/check_repo_hygiene.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/ci/check_test_count.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/ci/check_website_docs_pii.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/ci/generate_website_docs.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/debug_editor.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/debug_gen_settings.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/debug_settings.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/_recording_client.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/_spike_common.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/active_plan.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/capture_frames_mode_trigger_ligature.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/capture_locale_invariants.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/capture_lower_priority_model_cost.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/capture_project_listing.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/capture_r2v_ingredient_lifecycle.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/capture_sidebar_state_dom.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/capture_video_model_capability_matrix.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/character_create_spike.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/character_create_spike_v2.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/dump_character_selectors.js +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/incident_bundle_quality.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/live_verify_mcp_tasks.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/live_verify_policy_400_v060.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/live_verify_video_model_select.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/make_project.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/materiality_backtest.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/measure_locale_probe.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/patch_character.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/skillopt/README.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/skillopt/harness.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/skillopt/tasks.json +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/sonar-local-scan.sh +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/sonar-pre-push-gate.sh +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/spike_changelog_capture.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/spike_char_editor_dom.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/spike_char_gen_capture.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/spike_character_prompt_format.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/spike_extend_model_recon.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/spike_extend_ourstack_verify.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/spike_extend_route_capture.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/spike_extend_submit_capture.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/spike_extend_ui_recon.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/spike_incident_live.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/spike_issue313_agent_mode_controls.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/spike_issue314_picker_filename_search.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/spike_issue404_count_tabs_recon.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/spike_locale_poison.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/spike_mode_roundtrip.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/spike_mode_switch_agentic_to_classic.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/spike_model_inventory.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/spike_movie_picker_select.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/spike_movie_voice_list.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/spike_omni_flash_i2v_ui_recon.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/spike_patch_entity.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/spike_patchright.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/spike_trpc_origin_referer_401.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/spike_video_tab_dom.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/verify_language_agnostic.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/verify_locale_navigation_race.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/dev/verify_model_attribution.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/diag/README.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/diag/capture_flow_traffic.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/diag/diag_aisandbox_bearer.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/diag/memory_profile.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/diag/recaptcha_mint.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/diag/spike_387_openai_compat.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/e2e/capture_agent_toggle.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/probe/run_probe.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/probe/spike_auth_matrix.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/record_demo.ps1 +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/smoke_image.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/smoke_video_editor.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/smoke_worker_style.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/scripts/verify_chrome_auth_viability.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/skills/README.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/skills/changelog/SKILL.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/skills/check/SKILL.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/skills/doc-review/SKILL.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/skills/gflow-cli/SKILL.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/skills/issue-assessment/SKILL.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/skills/issue-resolve/SKILL.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/skills/known-issues/SKILL.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/skills/llm-council/SKILL.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/skills/plan/SKILL.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/skills/pr-council-review/SKILL.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/skills/predict/SKILL.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/skills/scenario/SKILL.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/skills/sonar/SKILL.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/skills/status/SKILL.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/sonar-project.properties +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/__main__.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/_cli_helpers.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/api/__init__.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/api/_engine.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/api/_retry.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/api/character.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/api/client.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/api/dto.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/api/extend_chain.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/api/image.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/api/image_upscale.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/api/recaptcha.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/api/routes.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/api/scene.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/api/transports/__init__.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/api/transports/base.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/api/transports/drivers/agentic.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/api/transports/drivers/base.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/api/transports/drivers/classic.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/api/transports/drivers/factory.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/api/transports/mode_control.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/api/video.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/api/video_extend.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/auth/__init__.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/auth/base.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/auth/cookies.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/auth/factory.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/auth/real_chrome.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/auth/strategies.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/auth/verification.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/browser_manager.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/cli.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/cli_character.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/cli_data.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/cli_doctor.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/cli_image.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/cli_instructions.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/cli_models.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/cli_movie.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/cli_project.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/cli_run.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/cli_scene.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/cli_tools.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/composition.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/config.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/data/__init__.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/data/chain_repo.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/data/migrations/0007_queue.sql +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/data/migrations/0008_add_operation_expanded_prompt.sql +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/data/migrations/0009_queue_claims.sql +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/data/models.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/data/queries.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/data/recorder.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/data/redaction.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/data/repository.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/data/store.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/exceptions.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/file_integrity.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/flow_selectors/__init__.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/flow_selectors/grading.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/flow_selectors/model.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/flow_selectors/registry.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/image_batch.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/json_output.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/mcp/__init__.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/mcp/prompts.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/mcp/resources.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/mcp/server.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/mcp/setup.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/mcp/tasks_extension.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/media.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/observability.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/paths.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/profile_lease.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/profile_store.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/redaction.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/services/__init__.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/services/catalog_sync.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/services/character_create.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/services/doctor.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/services/mentions.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/storage.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/tools/__init__.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/tools/banned.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/tools/builtin/__init__.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/tools/builtin/creative-director.toml +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/tools/builtin/reverse-engineer.toml +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/tools/builtin/storyboard.toml +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/tools/expander.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/tools/invocation.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/tools/loader.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/tools/registry.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/tools/runtime.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/tools/spec.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/ui/app.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/ui/server.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/update_check.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/winsec.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/worker/codec.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/worker/daemon.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/src/gflow_cli/worker/queue.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tasks/lessons.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/test_assets/sample_batch.json +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/test_assets/sample_batch.tsv +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/test_assets/sample_batch_invalid.tsv +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/__init__.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/__init__.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/fixtures/character_gen_response.json +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/fixtures/patch_entity_response.json +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/fixtures/project_initial_data_extend_models.json +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_aisandbox_auth_error.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_bearer_redaction.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_character.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_client.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_client_character.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_client_delete_characters.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_client_errors.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_client_extend.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_client_generate_character.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_client_image.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_client_incidents.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_client_launch_kwargs.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_client_locale_cache.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_client_patch_entity.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_client_scene.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_client_upscale.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_concurrency.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_dto.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_engine.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_extend_chain.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_image.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_image_dto.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_image_upscale.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_post_json_aisandbox_auth.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_recaptcha.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_retry.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_routes.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_routes_character.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_routes_locale.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_routes_scene.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_sapisidhash_helper.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_scene_models.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_video.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_video_extend.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_video_request.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/test_video_status_poll.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/transports/__init__.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/transports/conftest.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/transports/drivers/test_agentic.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/transports/drivers/test_classic.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/transports/drivers/test_factory.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/transports/drivers/test_ui_mode.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/transports/test_base.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/transports/test_bearer.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/transports/test_factory.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/transports/test_fingerprint.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/transports/test_locale_navigation.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/transports/test_mode_control.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/transports/test_model_selection_loud.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/transports/test_navigation_settled.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/transports/test_overlay_precondition.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/transports/test_policy_400.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/transports/test_sapisidhash.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/transports/test_selector_symmetry.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/transports/test_transport_timeout.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/transports/test_ui_automation_batch.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/transports/test_ui_automation_video.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/transports/test_ui_character_editor.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/api/transports/test_video_model_selection_loud.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/auth/strategies/test_factory.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/auth/strategies/test_strategies.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/auth/test_cookies.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/auth/test_real_chrome.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/auth/test_verification.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/auth/test_windows_acl.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/autopilot/test_pr_triage_autopilot.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/cli/__init__.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/cli/test_auth_status.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/cli/test_cli_auth_list.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/cli/test_cli_character.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/cli/test_cli_character_create.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/cli/test_cli_data.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/cli/test_cli_data_errors.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/cli/test_cli_data_errors_retention.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/cli/test_cli_data_sync.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/cli/test_cli_doctor.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/cli/test_cli_image.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/cli/test_cli_image_selector_drift.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/cli/test_cli_image_upscale.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/cli/test_cli_image_uuid_ref_enrichment.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/cli/test_cli_instructions.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/cli/test_cli_models.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/cli/test_cli_movie.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/cli/test_cli_run.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/cli/test_cli_scene.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/cli/test_cli_tools.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/cli/test_cli_video_extend.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/cli/test_error_handling.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/cli/test_failure_funnel.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/cli/test_helpers.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/cli/test_incident_output.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/cli/test_movie_manifest_style_variants.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/cli/test_predictable_output.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/cli/test_run_with_handlers_interrupt.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/cli/test_settings_validation.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/composition/test_character.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/composition/test_compose_prompt.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/composition/test_handoff.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/composition/test_style_variants.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/composition/test_style_variants_e2e.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/conftest.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/data/__init__.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/data/test_chain_repo.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/data/test_failure_recording.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/data/test_find_incomplete_character.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/data/test_models.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/data/test_null_columns_stay_null.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/data/test_packaging.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/data/test_recorder.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/data/test_recorder_character.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/data/test_redaction.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/data/test_repository.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/data/test_scene_persistence.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/data/test_settings_and_errors.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/data/test_store.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/data/test_store_migrations.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/dev/test_recording_client.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/e2e/__init__.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/e2e/test_cancellation_e2e.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/e2e/test_classic_count_setter_e2e.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/e2e/test_crash_recovery_e2e.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/e2e/test_daemon_e2e.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/e2e/test_data_sync_names_e2e.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/e2e/test_image_batch_e2e.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/e2e/test_incident_quality_e2e.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/e2e/test_live_agentic_instructions.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/e2e/test_project_naming_e2e.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/e2e/test_scene_compose_live.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/e2e/test_sidebar_recovery_e2e.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/e2e/test_tools_e2e.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/e2e/test_transports_e2e.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/__init__.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/asset_tagging.feature +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/auth.feature +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/auth_login.feature +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/character_create.feature +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/character_read.feature +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/conftest.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/duration_tab_drift.feature +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/entity_provenance.feature +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/image.feature +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/image_batch_references.feature +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/image_upscale.feature +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/incident_diagnostics.feature +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/instructions.feature +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/locale_picker_include.feature +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/mcp_tasks.feature +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/media_picker_tiers.feature +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/output_hardening.feature +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/test_asset_tagging_steps.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/test_auth_login_steps.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/test_auth_steps.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/test_character_create_steps.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/test_character_read_steps.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/test_image_steps.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/test_image_upscale_steps.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/test_incident_diagnostics_steps.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/test_instructions_steps.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/test_locale_picker_include_steps.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/test_mcp_tasks_steps.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/test_media_picker_tiers_steps.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/test_output_hardening_steps.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/test_step_collision_guard.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/test_video_agent_ui_steps.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/test_video_chain_steps.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/video_agent_ui.feature +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/features/video_chain.feature +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/fixtures/__init__.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/fixtures/changelog_modal_page.html +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/fixtures/doctor_env.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/fixtures/flow_model_inventory.json +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/fixtures/flow_project_listing_media.json +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/fixtures/listing_payload.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/fixtures/seeded_catalog.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/flow_selectors/__init__.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/flow_selectors/test_grading.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/flow_selectors/test_model.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/flow_selectors/test_model_governance.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/flow_selectors/test_registry.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/flow_selectors/test_report.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/image_batch/__init__.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/image_batch/test_image_manifest.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/image_batch/test_jitter_config.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/image_batch/test_observability_events.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/integration/__init__.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/integration/conftest.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/integration/constants.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/integration/test_expander_gateway.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/integration/test_storage_gcs.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/integration/test_storage_s3.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/mcp/__init__.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/mcp/conftest.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/mcp/test_auth_status_tool.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/mcp/test_cli_parity.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/mcp/test_error_funnel.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/mcp/test_http_transport.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/mcp/test_known_issues_resource.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/mcp/test_no_spend.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/mcp/test_rate_limit_envelope.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/mcp/test_resources.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/mcp/test_setup.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/mcp/test_stdio_transport.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/mcp/test_tasks_extension.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/mcp/test_tools_helpers.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/mcp/test_tools_instructions.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/scripts/test_canary_classify.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/scripts/test_canary_reexec.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/scripts/test_check_materiality.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/scripts/test_check_repo_hygiene.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/scripts/test_check_test_count.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/scripts/test_check_website_docs_pii.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/scripts/test_codex_plugin.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/scripts/test_generate_website_docs.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/scripts/test_incident_bundle_quality.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/scripts/test_materiality_backtest.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/scripts/test_workflow_hardening.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/services/__init__.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/services/test_catalog_sync.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/services/test_character_create_redaction.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/services/test_character_create_saga.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/services/test_doctor.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/services/test_media_attribution.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/services/test_mentions_observability.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/services/test_mentions_parse.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/services/test_mentions_resolve.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/services/test_resolve_and_apply.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/smoke/__init__.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/smoke/test_profile_account_smoke.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_auth.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_browser_manager.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_cli_data.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_cli_project.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_config.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_conftest_isolation.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_data_queries.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_diagnostics_bundle.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_diagnostics_events.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_diagnostics_journal.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_diagnostics_retention.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_documentation_gate.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_duration_tab_drift.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_entity_provenance.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_errors.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_errors_classification.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_image_batch_references.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_incident_generation_requests.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_json_output.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_marker_registry.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_media.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_observability.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_overlay_banner_dismissal.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_paths.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_playwright_pin.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_profile_lease.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_profile_lease_subprocess.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_profile_store.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_profile_store_locale.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_project_list_urls.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_self_documenting_errors.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_smoke.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/test_update_check.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/tools/__init__.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/tools/test_banned.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/tools/test_expander.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/tools/test_invocation.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/tools/test_loader.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/tools/test_registry.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/tools/test_runtime.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/tools/test_spec.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/ui/test_app.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/worker/test_codec.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/worker/test_daemon.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/worker/test_mcp_daemon_race.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/worker/test_queue.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/worker/test_queue_multiprocess.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/tests/worker/test_queue_reconciliation.py +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/website/docs/ACCOUNT_SAFETY.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/website/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/website/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/website/docs/CHARACTER.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/website/docs/CONFIGURATION.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/website/docs/DATA_LAYER.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/website/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/website/docs/INSTRUCTIONS.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/website/docs/MEDIA_LIBRARY.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/website/docs/PROMPT_EXPANSION.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/website/docs/SECURITY.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/website/docs/TOOLS.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/website/docs/agents.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/website/docs/index.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/website/docs/installation.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/website/docs/onboarding-mockup.html +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/website/docs/onboarding.md +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/website/docs/stylesheets/extra.css +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/website/mkdocs.yml +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/website/requirements.in +0 -0
- {gflow_cli-0.64.0 → gflow_cli-0.66.0}/website/requirements.txt +0 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
name: Star history watch
|
|
2
|
+
|
|
3
|
+
# ── Why this exists ──────────────────────────────────────────────────────────
|
|
4
|
+
# The star-history chart in README.md is the project's front door — it renders on
|
|
5
|
+
# GitHub and on the PyPI project page. When it breaks it does so SILENTLY: the
|
|
6
|
+
# endpoint answers HTTP 200 with `image/svg+xml`, and the body is a "GitHub
|
|
7
|
+
# restricted access to star data" placard instead of a chart. Every status-code
|
|
8
|
+
# check passes. That is how it stayed broken from 2026-08-30 to 2026-09-02 with
|
|
9
|
+
# no signal — a human noticed it in a browser.
|
|
10
|
+
#
|
|
11
|
+
# The chart depends on the `sealed_token` param surviving in the README URL
|
|
12
|
+
# (GitHub restricted the public /stargazers endpoint on 2026-06-30; star-history's
|
|
13
|
+
# per-repo cache expires in under 3 days without a token-bearing request). So this
|
|
14
|
+
# probes for the two ways it dies: the token gets stripped, or the underlying PAT
|
|
15
|
+
# expires or is revoked.
|
|
16
|
+
#
|
|
17
|
+
# The URL is read out of README.md rather than hardcoded here, so the probe can
|
|
18
|
+
# never drift from what is actually shipped.
|
|
19
|
+
|
|
20
|
+
on:
|
|
21
|
+
schedule:
|
|
22
|
+
# Daily 06:00 UTC — an hour after the selector probe, well clear of it.
|
|
23
|
+
- cron: "0 6 * * *"
|
|
24
|
+
workflow_dispatch:
|
|
25
|
+
|
|
26
|
+
permissions:
|
|
27
|
+
contents: read
|
|
28
|
+
|
|
29
|
+
jobs:
|
|
30
|
+
probe:
|
|
31
|
+
name: Probe the README star-history chart
|
|
32
|
+
runs-on: ubuntu-latest
|
|
33
|
+
timeout-minutes: 5
|
|
34
|
+
if: github.repository == 'ffroliva/gflow-cli'
|
|
35
|
+
steps:
|
|
36
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
37
|
+
with:
|
|
38
|
+
persist-credentials: false
|
|
39
|
+
|
|
40
|
+
- name: Fetch each star-history URL in README.md and inspect the SVG body
|
|
41
|
+
run: |
|
|
42
|
+
set -uo pipefail
|
|
43
|
+
urls=$(grep -o 'https://api\.star-history\.com/chart?[^"]*' README.md | sort -u)
|
|
44
|
+
if [ -z "$urls" ]; then
|
|
45
|
+
echo "::error::No star-history URL found in README.md. If the chart was removed on"
|
|
46
|
+
echo "::error::purpose, delete this workflow too."
|
|
47
|
+
exit 1
|
|
48
|
+
fi
|
|
49
|
+
|
|
50
|
+
failed=0
|
|
51
|
+
while IFS= read -r url; do
|
|
52
|
+
# Redact the sealed token before anything reaches the public log.
|
|
53
|
+
safe=$(printf '%s' "$url" | sed 's/sealed_token=.\{8\}.*/sealed_token=<redacted>/')
|
|
54
|
+
echo "── $safe"
|
|
55
|
+
|
|
56
|
+
case "$url" in
|
|
57
|
+
*sealed_token=*) ;;
|
|
58
|
+
*)
|
|
59
|
+
echo "::error::sealed_token is missing from this URL. A tokenless chart reverts to"
|
|
60
|
+
echo "::error::the restriction placard within ~3 days. See the comment in README.md."
|
|
61
|
+
failed=1
|
|
62
|
+
;;
|
|
63
|
+
esac
|
|
64
|
+
|
|
65
|
+
# Cache-bust so we measure the live endpoint, not star-history's warm cache.
|
|
66
|
+
code=$(curl -sS --max-time 30 -o body.svg -w '%{http_code}' "$url&cb=$GITHUB_RUN_ID") || {
|
|
67
|
+
echo "::warning::curl failed — treating as a transient star-history outage, not a token problem."
|
|
68
|
+
continue
|
|
69
|
+
}
|
|
70
|
+
bytes=$(wc -c < body.svg)
|
|
71
|
+
echo " http=$code bytes=$bytes"
|
|
72
|
+
|
|
73
|
+
if [ "$code" != "200" ]; then
|
|
74
|
+
echo "::warning::HTTP $code from star-history — likely their outage, not our token."
|
|
75
|
+
continue
|
|
76
|
+
fi
|
|
77
|
+
# The whole point: a 200 is not proof. Read the SVG text.
|
|
78
|
+
if grep -qi 'restricted access to star data' body.svg; then
|
|
79
|
+
echo "::error::Chart is serving the GitHub restriction placard. The sealed token is"
|
|
80
|
+
echo "::error::present but not working — the underlying PAT has most likely expired or"
|
|
81
|
+
echo "::error::been revoked. Mint a fine-grained PAT (metadata:read on this repo), seal"
|
|
82
|
+
echo "::error::it at star-history.com, and replace the sealed_token param in README.md."
|
|
83
|
+
failed=1
|
|
84
|
+
else
|
|
85
|
+
echo " ✅ real chart"
|
|
86
|
+
fi
|
|
87
|
+
done <<< "$urls"
|
|
88
|
+
|
|
89
|
+
exit "$failed"
|
|
@@ -7,6 +7,141 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.66.0] — 2026-09-03
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- **Flow's migration to `flow.google.com` was reported as selector drift
|
|
15
|
+
([#639](https://github.com/ffroliva/gflow-cli/issues/639)).** Google is moving Flow
|
|
16
|
+
off Labs onto its own origin. The migrated frontend renders **zero** Material Symbols
|
|
17
|
+
`<i>` elements, so every gflow selector — cohort detection included — misses at once,
|
|
18
|
+
and the run died with `UiSelectorDriftError` (exit 23, `retryable: false`): an error
|
|
19
|
+
that reads like the selectors rotted and sent operators hunting for the wrong cause.
|
|
20
|
+
The rollout **flaps per page load** — the same account and project land on the old
|
|
21
|
+
host on one navigation and the migrated one on the next — so a re-run frequently
|
|
22
|
+
succeeds, but the non-retryable classification made automated callers give up.
|
|
23
|
+
gflow now recognises the migrated origin and raises the distinct, **retryable**
|
|
24
|
+
`FlowHostMigratedError` (exit 36) naming the migration. Applies to CLI and MCP alike
|
|
25
|
+
(both route through the shared mode-switch raise site, and `retryable` has a single
|
|
26
|
+
source of truth). **This does not add support for the migrated frontend** — that is
|
|
27
|
+
separate work; see [KNOWN_ISSUES.md](KNOWN_ISSUES.md).
|
|
28
|
+
|
|
29
|
+
- **A migrated page load was misread as a logged-out session
|
|
30
|
+
([#639](https://github.com/ffroliva/gflow-cli/issues/639)).** `_check_logged_in`
|
|
31
|
+
hard-required `labs.google` in the URL, so a perfectly valid authenticated session on
|
|
32
|
+
the migrated host failed the gate and drove a pointless re-auth. It now accepts both
|
|
33
|
+
Flow origins.
|
|
34
|
+
|
|
35
|
+
### Security
|
|
36
|
+
|
|
37
|
+
- **The authenticated-session URL gate matched hosts by substring.** `_check_logged_in`
|
|
38
|
+
tested `"labs.google" in page.url`, which any foreign URL satisfies merely by carrying
|
|
39
|
+
the string in its path or query (`https://evil.example/?next=labs.google/fx/tools/flow`).
|
|
40
|
+
The host is now parsed and matched exactly.
|
|
41
|
+
|
|
42
|
+
### Changed
|
|
43
|
+
|
|
44
|
+
- Incident bundles from a `flow.google.com` load previously reported
|
|
45
|
+
`url.host_category: "other"` / `url.route: "other"`, hiding the most useful fact about
|
|
46
|
+
the failure. The migrated origin is now classified as `flow_app`, with the same
|
|
47
|
+
identifier reduction applied.
|
|
48
|
+
|
|
49
|
+
Live-verified 2026-09-03 at zero credits against the **real** migrated frontend, on an
|
|
50
|
+
account inside the rollout: `flow_host_kind: "migrated"`, `_check_logged_in: true` (it was
|
|
51
|
+
`false` before the fix), and `_mode_switch_error` returning `FlowHostMigratedError` / exit 36 /
|
|
52
|
+
`retryable: true` — while a credit-free `image t2i` minutes earlier landed on the old host and
|
|
53
|
+
completed exit 0, proving no regression. See
|
|
54
|
+
[docs/LIVE_VERIFICATION_v0.66.0.md](docs/LIVE_VERIFICATION_v0.66.0.md).
|
|
55
|
+
|
|
56
|
+
## [0.65.0] — 2026-09-02
|
|
57
|
+
|
|
58
|
+
### Fixed
|
|
59
|
+
|
|
60
|
+
- **`gflow video chain` and `gflow movie run` died MID-SPEND on `duration` × `model`
|
|
61
|
+
([#634](https://github.com/ffroliva/gflow-cli/issues/634),
|
|
62
|
+
[#635](https://github.com/ffroliva/gflow-cli/issues/635)).** The same defect
|
|
63
|
+
[#632](https://github.com/ffroliva/gflow-cli/pull/632) fixed for single-clip i2v, but
|
|
64
|
+
on these two surfaces it crashed *after* earlier links or scenes had already rendered
|
|
65
|
+
and billed — surfacing as exit 1 `"Unexpected error"` with the explanation lost.
|
|
66
|
+
|
|
67
|
+
For chains it was not an occasional mismatch but a **guaranteed** crash:
|
|
68
|
+
`supports_duration()` is True for `omni_flash` alone, and chains reject `omni_flash`, so
|
|
69
|
+
no model a chain can use has a duration control. Every manifest `duration` was
|
|
70
|
+
unsatisfiable by construction — **including the one shipped as the documented example**
|
|
71
|
+
in `docs/USAGE.md`, which a test pinned as valid.
|
|
72
|
+
|
|
73
|
+
Tracing it surfaced a second hole: the `omni_flash` rejection only ever tested the
|
|
74
|
+
*chain-level* model, while `_build_link_request` prefers a per-link override — so
|
|
75
|
+
`"model": "omni-flash"` on a link walked past the invariant. Both now validate every
|
|
76
|
+
link's effective model before link 0 renders, and `--dry-run` refuses what the real run
|
|
77
|
+
refuses.
|
|
78
|
+
|
|
79
|
+
**BREAKING:** a `movie.toml` scene pairing a Veo model with a `duration` parsed before
|
|
80
|
+
and now fails at parse with exit 11. That combination could never have rendered; it
|
|
81
|
+
previously failed later and more expensively. Scene `duration` requires
|
|
82
|
+
`model = "omni-flash"`.
|
|
83
|
+
|
|
84
|
+
- **`gflow video i2v --duration` with no `--model` died as `"Unexpected error"`
|
|
85
|
+
([#630](https://github.com/ffroliva/gflow-cli/issues/630)).** An omitted `--model` on
|
|
86
|
+
i2v is not "no model" — it binds `veo-lite`, which renders no duration control, so the
|
|
87
|
+
guard was bypassed in exactly the default case and the DTO's bare `ValueError` escaped
|
|
88
|
+
as exit 1. It now exits 2 naming the model and the fix. MCP had the same hole and
|
|
89
|
+
queued the task before failing; `gflow_generate_video` now returns a 400 up front.
|
|
90
|
+
|
|
91
|
+
- **The `referenceEntity` guard was unobservable, and its e2e could not fail
|
|
92
|
+
([#620](https://github.com/ffroliva/gflow-cli/issues/620)).**
|
|
93
|
+
`tests/e2e/test_entity_smuggling_e2e.py` wrapped both checks in `if bodies:` /
|
|
94
|
+
`if modified:`, so it passed whether the guard fired or never fired — and the second
|
|
95
|
+
block only *printed*. It sat through #615 without noticing.
|
|
96
|
+
|
|
97
|
+
Fixing the assertions alone would not have been enough: the guard logged only when it
|
|
98
|
+
*stripped* something, so "never ran" and "ran, nothing to strip" were identical silence.
|
|
99
|
+
`ui_automation.batch_request_intercepted` now fires on every intercepted request from a
|
|
100
|
+
`finally` — every exit, including the parse-error branch — carrying
|
|
101
|
+
`had_reference_entities`, `modified` and `outcome`. **Absence of the event is now
|
|
102
|
+
evidence**, which is what turned the question blocking #615's fix into a measurement.
|
|
103
|
+
|
|
104
|
+
- **Image e2e tests were priced in credits they do not cost.** `pyproject.toml` markers,
|
|
105
|
+
`docs/E2E_TESTING.md`'s cost table, `tests/e2e/conftest.py`, `CONTRIBUTING.md`,
|
|
106
|
+
`docs/USER_GUIDE.md` and ~20 strings across 13 files claimed image generation spends
|
|
107
|
+
credits. Only video (Veo) does; images draw on a **daily cap**, which is a rate limit,
|
|
108
|
+
not a charge. `scripts/canary/run_canary.py` carried the same error as a code constant
|
|
109
|
+
misnamed for four of its five entries (`_CREDIT_MARKERS` → `_MANUAL_ONLY_MARKERS`,
|
|
110
|
+
behaviour unchanged — the refusal is about not driving a live browser unattended). A
|
|
111
|
+
cost model that overstates the price of a free test discourages running it, and the test
|
|
112
|
+
it discouraged is the one that would have caught #615.
|
|
113
|
+
|
|
114
|
+
- **The `referenceEntity` guard never ran, on any image or video generation
|
|
115
|
+
([#615](https://github.com/ffroliva/gflow-cli/issues/615)).**
|
|
116
|
+
`_intercept_reference_entities` strips character entities the caller did not
|
|
117
|
+
request, so a "poisoned" entity left in the Flow composer cannot smuggle itself
|
|
118
|
+
into an unrelated generation. It had never fired once, on any released version.
|
|
119
|
+
|
|
120
|
+
The route glob `**/batchGenerateImages` requires the final path segment to equal
|
|
121
|
+
`batchGenerateImages`, but the real endpoint is `.../flowMedia:batchGenerateImages`
|
|
122
|
+
— so it could never match. The **video** guard was dead for the same reason
|
|
123
|
+
(`.../video:batchAsyncGenerateVideoText`), which the original report does not
|
|
124
|
+
mention. Registration also moved from the page to the browser context, which
|
|
125
|
+
covers worker-delegated requests the page level cannot observe.
|
|
126
|
+
|
|
127
|
+
The failure was invisible because the response listener does a substring test and
|
|
128
|
+
kept working normally, and because the guard logged only when it *stripped*
|
|
129
|
+
something — so "never ran" and "ran, nothing to strip" were identical silence. It
|
|
130
|
+
failed **open**, quietly. Reported by
|
|
131
|
+
[@DioServis](https://github.com/DioServis), who separated both causes.
|
|
132
|
+
|
|
133
|
+
**Verified live**, A/B-controlled at zero credits: with the fix absent the guard
|
|
134
|
+
never fired and the test failed; with it present the guard fired and the test
|
|
135
|
+
passed — same account, same prompt, one variable. That also settles whether Flow
|
|
136
|
+
delegates to a dedicated Web Worker (it does; `context.route` suffices) and
|
|
137
|
+
confirms the request rewrite does not corrupt the body. See
|
|
138
|
+
[docs/LIVE_VERIFICATION_reference_entity_guard.md](docs/LIVE_VERIFICATION_reference_entity_guard.md).
|
|
139
|
+
|
|
140
|
+
**Coverage is partial by construction:** direct-wire routes issued through
|
|
141
|
+
Playwright's `APIRequestContext` are not routable at all and bypass the guard
|
|
142
|
+
regardless of matcher — tracked in
|
|
143
|
+
[#619](https://github.com/ffroliva/gflow-cli/issues/619).
|
|
144
|
+
|
|
10
145
|
## [0.64.0] — 2026-09-02
|
|
11
146
|
|
|
12
147
|
### Added
|
|
@@ -3570,7 +3705,9 @@ shell-script template that branches on these codes.
|
|
|
3570
3705
|
|
|
3571
3706
|
First skeleton. Not functional end-to-end yet.
|
|
3572
3707
|
|
|
3573
|
-
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.
|
|
3708
|
+
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.66.0...HEAD
|
|
3709
|
+
[0.66.0]: https://github.com/ffroliva/gflow-cli/compare/v0.65.0...v0.66.0
|
|
3710
|
+
[0.65.0]: https://github.com/ffroliva/gflow-cli/compare/v0.64.0...v0.65.0
|
|
3574
3711
|
[0.64.0]: https://github.com/ffroliva/gflow-cli/compare/v0.63.0...v0.64.0
|
|
3575
3712
|
[0.63.0]: https://github.com/ffroliva/gflow-cli/compare/v0.62.1...v0.63.0
|
|
3576
3713
|
[0.62.1]: https://github.com/ffroliva/gflow-cli/compare/v0.62.0...v0.62.1
|
|
@@ -55,7 +55,7 @@ def test_parse_uuid_from_url(): ...
|
|
|
55
55
|
async def test_upload_returns_asset(): ...
|
|
56
56
|
|
|
57
57
|
@pytest.mark.e2e # Hits the real Flow API. Requires GFLOW_CLI_E2E_PROFILE env var.
|
|
58
|
-
@pytest.mark.e2e_image # Cost sub-marker:
|
|
58
|
+
@pytest.mark.e2e_image # Cost sub-marker: zero credits; draws on the daily image cap.
|
|
59
59
|
async def test_full_t2i_roundtrip(): ...
|
|
60
60
|
|
|
61
61
|
@pytest.mark.e2e
|
|
@@ -71,14 +71,14 @@ export GFLOW_CLI_E2E_PROFILE=<profile-name> # name of a logged-in profile
|
|
|
71
71
|
# Zero-credit sanity check (auth + health)
|
|
72
72
|
uv run pytest -m e2e_auth -v
|
|
73
73
|
|
|
74
|
-
# Single image (
|
|
74
|
+
# Single image (zero credits; daily image cap)
|
|
75
75
|
uv run pytest -m "e2e_image and not e2e_batch" -v
|
|
76
76
|
|
|
77
77
|
# Full regression (all credits)
|
|
78
78
|
GFLOW_CLI_E2E_RUN_VIDEO=1 uv run pytest -m e2e -v
|
|
79
79
|
```
|
|
80
80
|
|
|
81
|
-
E2e tests spend real Veo
|
|
81
|
+
E2e video tests spend real Veo credits (image tests are free, daily-capped). Video tests default to opt-out — set
|
|
82
82
|
`GFLOW_CLI_E2E_RUN_VIDEO=1` to include them. Run the full suite on `develop`
|
|
83
83
|
before opening a release PR to `main`.
|
|
84
84
|
|
|
@@ -14,6 +14,52 @@ Living list of behaviour that's broken, surprising, or limited by design — alo
|
|
|
14
14
|
|
|
15
15
|
## Open
|
|
16
16
|
|
|
17
|
+
### Flow is migrating to `flow.google.com`; the migrated frontend is not drivable
|
|
18
|
+
|
|
19
|
+
- **Status:** Open · **Severity:** High (every generation command fails on a migrated page load) · **Affected:** all `gflow image` / `gflow video` generation, CLI and MCP alike, on accounts the rollout has reached
|
|
20
|
+
- **Tracked:** [#639](https://github.com/ffroliva/gflow-cli/issues/639) · Reported 2026-09-02 against 0.59.0, 0.62.1, 0.63.0 and 0.65.0
|
|
21
|
+
- **Confirmed live 2026-09-03 on a second, independent account** (`ffroliva`) — see [LIVE_VERIFICATION_v0.66.0](docs/LIVE_VERIFICATION_v0.66.0.md). A read-only probe of the migrated origin measured `i_total: 0`, reproducing the reporter's central measurement.
|
|
22
|
+
|
|
23
|
+
Google is moving Flow off Labs onto its own origin. On a migrated page load,
|
|
24
|
+
`https://labs.google/fx/tools/flow/project/<id>` redirects to
|
|
25
|
+
`https://flow.google.com/project/<id>` and serves a rewritten frontend that
|
|
26
|
+
contains **zero `<i>` elements**. Every gflow selector anchors on Material
|
|
27
|
+
Symbols ligatures (`i.google-symbols:text-is(...)`), so cohort detection and
|
|
28
|
+
every mode control miss at once.
|
|
29
|
+
|
|
30
|
+
**The rollout flaps per page load.** The same account, profile and project land
|
|
31
|
+
on the old host on one navigation and the migrated one on the next, minutes
|
|
32
|
+
apart, with no client change. Measured on one account ~35 minutes apart:
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
old host labs.google/fx/<locale>/tools/flow/... i=55 i.google-symbols=49 crop_* present -> exit 0
|
|
36
|
+
migrated host flow.google.com/project/... i=0 i.google-symbols=0 crop_* absent -> exit 36
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Note the migrated URL **drops `/fx/tools/flow` entirely** — it is `/project/<id>`, not
|
|
40
|
+
`/fx/<locale>/tools/flow/project/<id>`. Any host gate written as a substring test on
|
|
41
|
+
`labs.google` could never have matched it.
|
|
42
|
+
|
|
43
|
+
This is **not** selector rot, not [#493](https://github.com/ffroliva/gflow-cli/issues/493),
|
|
44
|
+
and not the agentic cohort — the agentic indicators are absent too. It is a
|
|
45
|
+
different origin serving different markup.
|
|
46
|
+
|
|
47
|
+
**Workaround:** re-run the command. While the rollout flaps, a fresh navigation
|
|
48
|
+
frequently lands the old frontend and the run completes normally. Automated
|
|
49
|
+
callers get this for free: the failure is `FlowHostMigratedError` (exit 36) with
|
|
50
|
+
`retryable: true`, so retry loops driven by the `--json` / MCP / worker error
|
|
51
|
+
envelope will keep trying.
|
|
52
|
+
|
|
53
|
+
**What gflow does today (v0.66.0):** recognises the migrated origin and fails
|
|
54
|
+
with the distinct, retryable exit 36 instead of the misleading
|
|
55
|
+
`UiSelectorDriftError` (exit 23, "file a selector bug"). `_check_logged_in` also
|
|
56
|
+
accepts the migrated host, so a migrated load is no longer misread as a
|
|
57
|
+
logged-out session. **Support for driving the new frontend is separate work and
|
|
58
|
+
is not implemented** — once the rollout completes for an account, no retry will
|
|
59
|
+
help until then.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
17
63
|
### A Veo extend segment is 7 seconds, not the 8 Flow advertises — so concat pads a frozen second
|
|
18
64
|
|
|
19
65
|
- **Status:** Open · **Severity:** Medium (audible/visible on every internal seam of a chained extend) · **Affected:** `gflow video extend -n >1` with `-o`, and any scene mixing extend segments
|
|
@@ -305,6 +351,35 @@ incident bundle's `ui.json` carries the same data). Attach it to
|
|
|
305
351
|
[#493](https://github.com/ffroliva/gflow-cli/issues/493) — that would indicate a
|
|
306
352
|
state genuinely different from the sidebar one.
|
|
307
353
|
|
|
354
|
+
### The referenceEntity guard covers browser-driven generation only
|
|
355
|
+
|
|
356
|
+
- **Status:** **Open** — structural, tracked in
|
|
357
|
+
[#619](https://github.com/ffroliva/gflow-cli/issues/619)
|
|
358
|
+
- **Severity:** Low today · **Affects:** any future direct-wire route that carries
|
|
359
|
+
`referenceEntities`
|
|
360
|
+
|
|
361
|
+
`_intercept_reference_entities` strips character entities the caller did not request. As
|
|
362
|
+
of v0.65.0 it **does** run — it never had before
|
|
363
|
+
([#615](https://github.com/ffroliva/gflow-cli/issues/615)), and the fix is A/B-verified
|
|
364
|
+
live (see
|
|
365
|
+
[LIVE_VERIFICATION_reference_entity_guard](docs/LIVE_VERIFICATION_reference_entity_guard.md)).
|
|
366
|
+
|
|
367
|
+
But it guards by registering a Playwright route handler, so it can only ever observe
|
|
368
|
+
**browser-initiated** traffic. Every direct-wire route goes through `client._post_json`,
|
|
369
|
+
which issues the request via `page.request.post` — Playwright's `APIRequestContext`. Those
|
|
370
|
+
calls leave from the Python side using the browser context's cookies and never enter the
|
|
371
|
+
browser's network stack, so **no route handler observes them, at any level**. This is
|
|
372
|
+
Playwright behaving as designed, not a bug in our usage.
|
|
373
|
+
|
|
374
|
+
**It does not bite today:** no direct-wire route currently sends `referenceEntities`. It is
|
|
375
|
+
recorded because the coverage gap is invisible from the outside — the guard looks
|
|
376
|
+
comprehensive and is not — and because it is the same fail-open shape as #615 one layer
|
|
377
|
+
down. Any new direct-wire route that carries entity references would inherit the blind spot
|
|
378
|
+
silently.
|
|
379
|
+
|
|
380
|
+
**No workaround needed today.** If you are adding a direct-wire route that sends
|
|
381
|
+
`referenceEntities`, filter them at the call site rather than relying on the guard.
|
|
382
|
+
|
|
308
383
|
### Flow's new full-page media-library UI breaks entity attach (A/B rollout)
|
|
309
384
|
|
|
310
385
|
- **Status:** **Open** — Flow-side staged rollout; tracked in
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: gflow-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.66.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
|
|
@@ -229,9 +229,16 @@ Full milestone history lives in [CHANGELOG.md](CHANGELOG.md). Where the project
|
|
|
229
229
|
|
|
230
230
|
### Star history
|
|
231
231
|
|
|
232
|
+
<!-- DO NOT strip `sealed_token` from the URLs below. GitHub restricted the public
|
|
233
|
+
/stargazers endpoint (2026-06-30), so star-history can only build this chart from a
|
|
234
|
+
token-authenticated request. Its per-repo cache expires in <3 days, so a tokenless
|
|
235
|
+
URL renders a "GitHub restricted access to star data" placard — served as HTTP 200,
|
|
236
|
+
which is why nothing catches it. `.github/workflows/star-history-watch.yml` probes
|
|
237
|
+
for exactly that. The token is sealed with star-history's key and grants metadata
|
|
238
|
+
read on a public repo; it is safe in a public README, and they recommend it. -->
|
|
232
239
|
<picture>
|
|
233
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/chart?repos=ffroliva/gflow-cli&type=date&theme=dark&legend=top-left" />
|
|
234
|
-
<img alt="Star history chart for ffroliva/gflow-cli" src="https://api.star-history.com/chart?repos=ffroliva/gflow-cli&type=date&legend=top-left" />
|
|
240
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/chart?repos=ffroliva/gflow-cli&type=date&theme=dark&legend=top-left&sealed_token=7kTiE_HExjjY2aT7O-_hMxY_Mf6n-ET17mi_RXcRjCSS5rHSBDMd7xFYCzT_yaXhAXrgF8AGTQc6mny_qfuJc7473KGqb-5U41Dpu-tpZIS1IYl-xVQR9ziGJtL0KWQVyWZU1IoUmLWwo43PhgVTo4MJfmWOvluFJq2zlGxE_iLl9wMRgpwQaiC4ufOK" />
|
|
241
|
+
<img alt="Star history chart for ffroliva/gflow-cli" src="https://api.star-history.com/chart?repos=ffroliva/gflow-cli&type=date&legend=top-left&sealed_token=7kTiE_HExjjY2aT7O-_hMxY_Mf6n-ET17mi_RXcRjCSS5rHSBDMd7xFYCzT_yaXhAXrgF8AGTQc6mny_qfuJc7473KGqb-5U41Dpu-tpZIS1IYl-xVQR9ziGJtL0KWQVyWZU1IoUmLWwo43PhgVTo4MJfmWOvluFJq2zlGxE_iLl9wMRgpwQaiC4ufOK" />
|
|
235
242
|
</picture>
|
|
236
243
|
|
|
237
244
|
If `gflow-cli` saves you time, please ⭐ the repo. It is the cheapest way to support the project.
|
|
@@ -158,9 +158,16 @@ Full milestone history lives in [CHANGELOG.md](CHANGELOG.md). Where the project
|
|
|
158
158
|
|
|
159
159
|
### Star history
|
|
160
160
|
|
|
161
|
+
<!-- DO NOT strip `sealed_token` from the URLs below. GitHub restricted the public
|
|
162
|
+
/stargazers endpoint (2026-06-30), so star-history can only build this chart from a
|
|
163
|
+
token-authenticated request. Its per-repo cache expires in <3 days, so a tokenless
|
|
164
|
+
URL renders a "GitHub restricted access to star data" placard — served as HTTP 200,
|
|
165
|
+
which is why nothing catches it. `.github/workflows/star-history-watch.yml` probes
|
|
166
|
+
for exactly that. The token is sealed with star-history's key and grants metadata
|
|
167
|
+
read on a public repo; it is safe in a public README, and they recommend it. -->
|
|
161
168
|
<picture>
|
|
162
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/chart?repos=ffroliva/gflow-cli&type=date&theme=dark&legend=top-left" />
|
|
163
|
-
<img alt="Star history chart for ffroliva/gflow-cli" src="https://api.star-history.com/chart?repos=ffroliva/gflow-cli&type=date&legend=top-left" />
|
|
169
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/chart?repos=ffroliva/gflow-cli&type=date&theme=dark&legend=top-left&sealed_token=7kTiE_HExjjY2aT7O-_hMxY_Mf6n-ET17mi_RXcRjCSS5rHSBDMd7xFYCzT_yaXhAXrgF8AGTQc6mny_qfuJc7473KGqb-5U41Dpu-tpZIS1IYl-xVQR9ziGJtL0KWQVyWZU1IoUmLWwo43PhgVTo4MJfmWOvluFJq2zlGxE_iLl9wMRgpwQaiC4ufOK" />
|
|
170
|
+
<img alt="Star history chart for ffroliva/gflow-cli" src="https://api.star-history.com/chart?repos=ffroliva/gflow-cli&type=date&legend=top-left&sealed_token=7kTiE_HExjjY2aT7O-_hMxY_Mf6n-ET17mi_RXcRjCSS5rHSBDMd7xFYCzT_yaXhAXrgF8AGTQc6mny_qfuJc7473KGqb-5U41Dpu-tpZIS1IYl-xVQR9ziGJtL0KWQVyWZU1IoUmLWwo43PhgVTo4MJfmWOvluFJq2zlGxE_iLl9wMRgpwQaiC4ufOK" />
|
|
164
171
|
</picture>
|
|
165
172
|
|
|
166
173
|
If `gflow-cli` saves you time, please ⭐ the repo. It is the cheapest way to support the project.
|
|
@@ -31,6 +31,9 @@ log events (`structlog` JSON lines):
|
|
|
31
31
|
| `ui_automation.batch_response_dropped_project_id_mismatch` | URL contained `batchGenerateImages` but project-id filter rejected it | `url`, `filter_project_id` |
|
|
32
32
|
| `ui_automation.batch_response_captured` | Response passed all filters AND parsed cleanly | `url`, `status` |
|
|
33
33
|
| `ui_automation.batch_response_parse_failed` | Listener fired but `response.json()` raised | `url`, `error` |
|
|
34
|
+
| `ui_automation.batch_request_intercepted` | EVERY generation request the referenceEntity guard observes, on every exit including a parse error. **Its ABSENCE means no route handler saw the submit at all** — a dead route matcher, or worker delegation the registered level cannot observe (#615, #620) | `url`, `had_reference_entities`, `modified`, `outcome`, `expected_entities` |
|
|
35
|
+
| `ui_automation.batch_request_modified` | The guard actually STRIPPED an unrequested `referenceEntities` entry | `url`, `reason`, `expected_entities` |
|
|
36
|
+
| `ui_automation.batch_request_modify_failed` | The guard ran but raised (e.g. a body it could not decode); the request is forwarded unchanged | `url`, `error` |
|
|
34
37
|
| `ui_automation.batch_403_body` | A `batchGenerateImages` response returned HTTP 403; body prefix logged for WAF / reCAPTCHA diagnosis (subsequently raises `WafRejectionError`) | `body_prefix`, `route` |
|
|
35
38
|
|
|
36
39
|
If `prompt_submitted` is followed by NO `batch_response_seen` log within the
|
|
@@ -103,7 +106,8 @@ at command startup).
|
|
|
103
106
|
### What triggers a capture (and what never does)
|
|
104
107
|
|
|
105
108
|
Captured: `FlowAppError` (31), `FlowAgentUiError` (25),
|
|
106
|
-
`
|
|
109
|
+
`FlowHostMigratedError` (36), `UiModeUnavailableError` (28),
|
|
110
|
+
`UiSelectorDriftError` (23),
|
|
107
111
|
`TransportTimeoutError` (9), `BrowserSessionClosedError` (15),
|
|
108
112
|
`WireFormatError` (7), `WafRejectionError` (10), `NetworkError` (6),
|
|
109
113
|
unexpected exceptions while a page is alive, and `ProfileLockedError` (11)
|
|
@@ -91,7 +91,7 @@ See [docs/GITHUB.md § SonarCloud Quality Gate](GITHUB.md#sonarcloud-quality-gat
|
|
|
91
91
|
|
|
92
92
|
### E2e gate before merging develop → main
|
|
93
93
|
|
|
94
|
-
E2e tests require a live authenticated profile and are **not run in CI** (
|
|
94
|
+
E2e tests require a live authenticated profile and are **not run in CI** (video tests spend real Veo credits; image tests cost nothing but draw on a daily image cap). Before opening a `develop → main` release PR:
|
|
95
95
|
|
|
96
96
|
```bash
|
|
97
97
|
export GFLOW_CLI_E2E_PROFILE=<your-profile-name>
|
|
@@ -17,8 +17,8 @@ layers. The dominant constraint is not developer time or CI compute but
|
|
|
17
17
|
Layer 0 — Static Analysis ruff · pyright · detect-secrets
|
|
18
18
|
Layer 1 — Unit Tests pure logic, no I/O
|
|
19
19
|
Layer 2 — Integration Tests real Provider plumbing, mocked HTTP/browser
|
|
20
|
-
Layer 3 — Smoke Tests
|
|
21
|
-
Layer 4 — Full E2E Tests real credits, all strategies (pre-release gate)
|
|
20
|
+
Layer 3 — Smoke Tests image gen only — ZERO credits, golden path (post-release)
|
|
21
|
+
Layer 4 — Full E2E Tests real Veo credits (video only), all strategies (pre-release gate)
|
|
22
22
|
```
|
|
23
23
|
|
|
24
24
|
**Only Layers 3 and 4 ever hit the real Flow API.**
|
|
@@ -46,11 +46,18 @@ Tests in `tests/smoke/` carry `pytest.mark.smoke`.
|
|
|
46
46
|
Each e2e test also carries **one or more cost sub-markers** so you can run
|
|
47
47
|
exactly the cost tier you can afford:
|
|
48
48
|
|
|
49
|
+
> **Image generation costs ZERO Flow credits.** Only video (Veo) spends credits.
|
|
50
|
+
> Images are limited by a **daily cap**, not billed — hitting it is a rate limit,
|
|
51
|
+
> not a charge. This table said "~1 Imagen credit" for years, which discouraged
|
|
52
|
+
> running tests that were always free; that stale claim is what left the #615
|
|
53
|
+
> `referenceEntity` guard unverified while it silently did nothing. Confirmed with
|
|
54
|
+
> the maintainer 2026-09-02.
|
|
55
|
+
|
|
49
56
|
| Marker | Credit cost | Typical wallclock | When to use |
|
|
50
57
|
|---|---|---|---|
|
|
51
58
|
| `e2e_auth` | 0 | < 30 s | auth/session/health-check — always safe to run |
|
|
52
|
-
| `e2e_image` |
|
|
53
|
-
| `e2e_batch` |
|
|
59
|
+
| `e2e_image` | **0** (daily cap) | 30–120 s | text-to-image or image-to-image golden path |
|
|
60
|
+
| `e2e_batch` | **0** (daily cap) | 2–10 min | batch image generation |
|
|
54
61
|
| `e2e_video` | ~1 Veo | 1–10 min | text-to-video or image-to-video |
|
|
55
62
|
| `e2e_data` | (same as above) | +0 s | DB persistence check — combined with image/video |
|
|
56
63
|
|
|
@@ -61,9 +68,9 @@ data-layer assertions depend on a real generation having run first.
|
|
|
61
68
|
|
|
62
69
|
```
|
|
63
70
|
e2e ─┬─ e2e_auth (auth/session, health check — zero credits)
|
|
64
|
-
├─ e2e_image (t2i, i2i —
|
|
71
|
+
├─ e2e_image (t2i, i2i — ZERO credits, daily cap only)
|
|
65
72
|
│ └─ e2e_data (+ DB assertions)
|
|
66
|
-
├─ e2e_batch (batch t2i —
|
|
73
|
+
├─ e2e_batch (batch t2i — ZERO credits, daily cap only)
|
|
67
74
|
└─ e2e_video (t2v, i2v — 1 Veo credit per test)
|
|
68
75
|
└─ e2e_data (+ DB assertions)
|
|
69
76
|
```
|
|
@@ -79,7 +86,7 @@ e2e ─┬─ e2e_auth (auth/session, health check — zero credits)
|
|
|
79
86
|
| `GFLOW_CLI_E2E_VIDEO_ASPECT` | `"landscape"` | Aspect ratio for video e2e: `landscape` or `portrait`. |
|
|
80
87
|
| `GFLOW_CLI_E2E_VIDEO_MODEL` | `"omni-flash"` | Veo model for i2v tests: `omni-flash` or `veo-fast`. |
|
|
81
88
|
| `GFLOW_CLI_E2E_VIDEO_DURATION` | `"4"` | Seconds of video to generate in i2v tests (minimum credit unit). |
|
|
82
|
-
| `GFLOW_CLI_E2E_RUN_ENTITY_PROV` | `"0"` | Set to `"1"` to run the entity-provenance e2e (#402) — asserts a generation Flow actually accepted records its `entity_ids` / `entity_names` in `operations.metadata_json`. Opt-in because it
|
|
89
|
+
| `GFLOW_CLI_E2E_RUN_ENTITY_PROV` | `"0"` | Set to `"1"` to run the entity-provenance e2e (#402) — asserts a generation Flow actually accepted records its `entity_ids` / `entity_names` in `operations.metadata_json`. Opt-in because it drives a real browser generation (no credit cost — images are free). |
|
|
83
90
|
| `GFLOW_CLI_E2E_BATCH_MANIFEST` | `test_assets/sample_batch.tsv` | TSV manifest for the batch image e2e. |
|
|
84
91
|
| `GFLOW_CLI_E2E_BATCH_JITTER` | `"1"` | Set to `"0"` to disable inter-request jitter in batch tests. |
|
|
85
92
|
| `GFLOW_CLI_E2E_PROMPT` | *(safe default)* | Prompt override for the smoke test. |
|
|
@@ -105,7 +112,7 @@ uv run pytest -m "not e2e and not smoke and not live" -q --cov=gflow_cli
|
|
|
105
112
|
```bash
|
|
106
113
|
export GFLOW_CLI_E2E_PROFILE=<profile-name>
|
|
107
114
|
|
|
108
|
-
# All smoke tests (includes the
|
|
115
|
+
# All smoke tests (includes the golden-path image test — zero credits)
|
|
109
116
|
uv run pytest -m smoke -v
|
|
110
117
|
|
|
111
118
|
# Zero-credit only — account persistence check, no generation
|
|
@@ -114,7 +121,7 @@ uv run pytest -m smoke tests/smoke/test_profile_account_smoke.py -v
|
|
|
114
121
|
|
|
115
122
|
| Smoke test | Credits | Notes |
|
|
116
123
|
|---|---|---|
|
|
117
|
-
| `test_real_flow.py` |
|
|
124
|
+
| `test_real_flow.py` | **0** (daily cap) | Full golden path; use `GFLOW_CLI_E2E_PROMPT` to override the prompt |
|
|
118
125
|
| `test_profile_account_smoke.py` | **0** | Auth verification only; backfills `.gflow_account` for pre-v0.10 profiles |
|
|
119
126
|
|
|
120
127
|
### Layer 4 — Cost-stratified e2e runs
|
|
@@ -128,7 +135,7 @@ uv run pytest -m "e2e_auth or (e2e and e2e_data and not e2e_image and not e2e_vi
|
|
|
128
135
|
# Cheapest live generation: single image only
|
|
129
136
|
uv run pytest -m "e2e_image and not e2e_batch" -v
|
|
130
137
|
|
|
131
|
-
# Add batch (
|
|
138
|
+
# Add batch (zero credits; consumes more of the daily image cap — see sample_batch.tsv for row count)
|
|
132
139
|
uv run pytest -m "e2e_image" -v
|
|
133
140
|
|
|
134
141
|
# Add video (1 Veo credit per test)
|
|
@@ -235,8 +242,10 @@ tiers (`e2e_image` / `e2e_video` / `smoke`) stay **strictly manual** via
|
|
|
235
242
|
uv run python scripts/canary/run_canary.py --profile <name> --dry-run
|
|
236
243
|
```
|
|
237
244
|
|
|
238
|
-
|
|
239
|
-
`smoke`) are **refused outright** — the canary never
|
|
245
|
+
Generation markers (`e2e_image`, `e2e_video`, `e2e_batch`, `e2e_character`,
|
|
246
|
+
`smoke`) are **refused outright** — the canary never drives a real generation
|
|
247
|
+
unattended. (Only `e2e_video` spends credits; the image tiers are refused because
|
|
248
|
+
they drive a live browser and draw on the daily image cap, not because they bill.)
|
|
240
249
|
Run those manually via `/gflow:live-verify`.
|
|
241
250
|
|
|
242
251
|
### Schedule it
|
|
@@ -314,7 +323,7 @@ aging test.
|
|
|
314
323
|
tests/
|
|
315
324
|
├── conftest.py # install_log_capture; auto-marker hook
|
|
316
325
|
├── smoke/
|
|
317
|
-
│ ├── test_real_flow.py # [smoke] golden path,
|
|
326
|
+
│ ├── test_real_flow.py # [smoke] golden path, ZERO credits
|
|
318
327
|
│ └── test_profile_account_smoke.py # [smoke] profile account persistence — 0 credits
|
|
319
328
|
└── e2e/
|
|
320
329
|
├── conftest.py # e2e_profile_dir, e2e_nosession_profile,
|
|
@@ -344,7 +353,7 @@ field bundle a user emails), which is unit-covered offline by
|
|
|
344
353
|
|
|
345
354
|
| File | Credits | What it verifies |
|
|
346
355
|
|------|---------|-----------------|
|
|
347
|
-
| `test_real_flow.py` |
|
|
356
|
+
| `test_real_flow.py` | **0** | Golden path: open Flow, submit prompt, save PNG, check dimensions |
|
|
348
357
|
| `test_profile_account_smoke.py` | 0 | `.gflow_account` file present + valid email; `list_profiles()` surfaces `google_account`; `gflow auth list --json` includes the field |
|
|
349
358
|
|
|
350
359
|
> **Real environment required.** Both smoke tests require a profile that has been
|
|
@@ -158,6 +158,12 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
|
|
|
158
158
|
**What was actually live-verified for the latest release?** → latest: [LIVE_VERIFICATION_v0.64.0](LIVE_VERIFICATION_v0.64.0.md) (**#626 `--model omni-flash --end-frame` — first+last interpolation on Omni 1.1 Flash, verified 2026-09-02.** The guard this release removes was evidence-gated, so it was retired on evidence: a route-aborted submit capture on **two distinct Google accounts** (`ffroliva`, `denon82`) fired `video:batchAsyncGenerateVideoStartAndEndImage` with `startImage` AND `endImage` non-null at **zero credits**, ruling out a single-account artifact. The decisive layer is semantic, not structural: the paid 4s generation's **last frame IS the supplied end image** and its first frame is the start image — two visibly different subjects — which is the only check that distinguishes "Flow bound the end frame" from "Flow accepted and ignored it", and which layers 1–4 would pass either way. Render: 4.01s / 720×1280 / h264+aac / 2.4 MB, `MEDIA_GENERATION_STATUS_SUCCESSFUL`. The static capability table is **deleted**, not corrected — it went stale silently once and would again; a post-submit route check (`_assert_i2v_route`) now fails a run whose end frame Flow dropped back to the `StartImage` route, catching a rollback on any account without anyone re-reading a support page. One item is recorded as NOT verified rather than omitted: `--duration 10` + end frame is **submit-verified only** (`duration_set seconds=10` on the correct route with both images bound), because the status poll returned HTTP 401 mid-run and a retry 401'd at `project.create` before submitting — [#561](https://github.com/ffroliva/gflow-cli/issues/561), pre-existing, so verification was stopped rather than spending further credits on an environmental fault.) · previous: [LIVE_VERIFICATION_v0.63.0](LIVE_VERIFICATION_v0.63.0.md) (**`gflow video extend` — continuing a clip past Flow's 8s ceiling, verified 2026-09-01 on profile `ffroliva`, 20 Veo credits.** The decisive observation is that segment 2's `source_media_id` **is** segment 1's `media_id` (`0c9364f3…` seeded from `b9458021…`, then `648f9291…` seeded from `0c9364f3…`) — tail-only chaining, which no mock can establish; had it re-seeded from the source, the output would have been two divergent continuations of the same moment instead of one continuous shot. `extend_model_resolved` logged `candidate_count=99` against `SERVICE_TIER_INTERMEDIATE`, proving the key came from the live capability listing rather than a constant, and plan cost matched actual spend (`20 credits total, balance 875` → `Extended — 2/2 segment(s), 20 credits`). Render: 23.02s / 1280×720 / 24fps / h264+aac. **The run found a defect the offline suite is structurally incapable of seeing:** an extend segment carries **7.000000s** of content, not the 8 Flow advertises and bills, so server-side concat pads every internal seam with a frozen frame and digital silence (15s at −75.1 dB against −29 neighbours, reproduced on a second independent render) — filed in KNOWN_ISSUES with the three questions that must be answered before any clamp, and the reason `--extend N` on t2v/i2v was deliberately NOT shipped. Seven items are recorded as NOT verified rather than omitted: portrait `9:16`, `--aspect` against a mismatched source, chains longer than 2 segments, `--resume-from` against a live partial scene, the insufficient-credits refusal, a live Ctrl+C, and `OperationKind.EXTEND` rows.) · previous: [LIVE_VERIFICATION_v0.62.1](LIVE_VERIFICATION_v0.62.1.md) (**#604 `--model omni-flash` selects again after Flow's `Omni Flash` → `Omni 1.1 Flash` rename, verified 2026-08-30 on profile `ffroliva` at ZERO Veo credits.** The production `_select_video_model` was driven against the real picker: the shipped selector resolves verbatim — `model_selected model=omni_flash via="[role='menuitem']:has-text('Omni'):has-text('Flash'):not(:has-text('[Lower Priority]'))"` — and all six cases came back as expected: the four offered tiers SELECT, a tier Flow does not offer REFUSES, and a deliberately ambiguous selector REFUSES rather than resolving `.first`. Selection happens before submit, so the whole matrix is free. The transport's own refusal diagnostic read the live menu back as `Omni 1.1 Flash / Veo 3.1 - Lite / Fast / Quality`, independently corroborating the fixture. Four items are recorded as NOT verified rather than omitted: the rename *direction* [the `Omni Flash` baseline is a different account, locale and date], an actual `Omni ... [Lower Priority]` entry [Flow has never offered one], a full credit-spending generation on omni-flash, and #539's absence question, which stays open.) · previous: [LIVE_VERIFICATION_v0.62.0](LIVE_VERIFICATION_v0.62.0.md) (**#595 `auto` ≡ `classic` for images, verified 2026-08-28 on profile `ci-probe` — an account Flow had moved to the agentic cohort the day before — at ZERO Veo credits.** With no flags and no env vars the run logged `ui_driver.ui_mode.attempt_exit_agent` → `ui_driver.bound mode=classic ui_mode=classic` and generated a real 768x1376 JPEG (exit 0); the day before, the identical command on the same account bound `auto`→`agentic` and failed. The same log independently closed **#183**: `mode_switch_trigger` and `image_mode_tab`, the selectors it reported as unfindable, both matched. #591 was proven against the real 500-row catalog — **0** occurrences of the string `"None"`, 31 proper JSON `null`s, over a catalog holding 119 NULL-bearing rows. #592 shows exactly one `client.account_locale_cached` per command. Three items are recorded as NOT verified rather than omitted: the exit-28 abort on a *pinned* agentic account, the #597 batch inter-prompt guard, and any fresh announcement modal — the last two because all three accounts have already acked the current changelog, so no modal can be raised until Google ships the next one.) · previous: [LIVE_VERIFICATION_v0.61.0](LIVE_VERIFICATION_v0.61.0.md) (**#539 video-model refusal + #586 image-model refusal and server-side attribution, verified 2026-08-26/27 on profile `denon82`, ONE Veo generation total** — the video fix was proven by a **zero-credit A/B against the stashed pre-fix source running on live Flow**: the old code returned SELECTED for `veo-lite-lp`, a model Flow does not offer to this account, and for a deliberately ambiguous selector matching 3 entries; the new code refuses both with exit 18 naming what Flow offered. Model selection happens before submit, so refusals cost nothing and the A/B was free. The happy path still generates: `--model omni-flash` → exit 0, a real 2.2 MB `ftypisom` mp4, catalog recording `omni_flash`. Two items are recorded as NOT verified rather than omitted: three of #584's four navigation-settle sites were never exercised [no bearer refresh occurred in these runs], and #582's canary self-re-exec has its first real exercise tonight. Also falsified: #539's recorded note that the video picker uses a different trigger — the two constants are byte-identical strings, and the repeated empty menu captures were the capture's own fault.) · previous: [LIVE_VERIFICATION_v0.60.0](LIVE_VERIFICATION_v0.60.0.md)
|
|
159
159
|
**"Was the playwright upper bound raised, and on what evidence?"** → [LIVE_VERIFICATION_playwright_1.61](LIVE_VERIFICATION_playwright_1.61.md) (**`>=1.59.0,<1.60.0` → `>=1.61.0,<1.62.0` verified 2026-08-05, 1 Imagen + 1 Veo credit** — the 2026-08-03 regression that motivated the bound does NOT reproduce on 1.61.0: a live `i2v` drove the full chain with `image_uploaded status=200` → `frame_attached` → `generate_captured status=200` with `startImage` parsed, where **1.62.0 hung silently at exactly that upload step**; live `i2i` local-ref attach passed outright [96.7s]. **1.62.0 stays excluded** — never root-caused. Also found, A/B-proven pre-existing on BOTH 1.59.0 and 1.61.0: Flow dropped the duration-tab UI, so **`--duration` is currently broken for i2v** — `UiSelectorDriftError` fires correctly [refusing rather than silently accepting Flow's default, #288] but the selector needs re-deriving; that is why the i2v proof was driven via the CLI without `--duration`, and Flow's own server-side `PUBLIC_ERROR_VIDEO_GENERATION_TIMED_OUT` means no finished mp4 is claimed).
|
|
160
160
|
**"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)).
|
|
161
|
+
**"What was live-verified for v0.66.0?"** → [LIVE_VERIFICATION_v0.66.0](LIVE_VERIFICATION_v0.66.0.md) — **#639 Flow's `flow.google.com` migration, verified 2026-09-03 on profile `ffroliva` at ZERO credits.** The maintainer's own account turned out to be inside the rollout, so the fix was proven against the real migrated frontend rather than a reconstructed DOM: a read-only probe of `flow.google.com/project/<id>` measured `i_total: 0` (independently reproducing the reporter's central measurement) and drove the production functions against the live page — `flow_host_kind: "migrated"`, `_check_logged_in: true` (it was `false` before the fix, i.e. a valid session read as logged-out), and `_mode_switch_error` returning `FlowHostMigratedError` / exit 36 / `retryable: true`. The flap is confirmed on ONE account: a credit-free `image t2i` minutes earlier landed on the OLD host and completed exit 0 with a real 768x1376 JPEG (`ffd8ffe0`, 401,939 bytes, Pillow dims matching the API claim), proving the rewritten host gate does not regress the old path. Also recorded: the migrated URL **drops `/fx/tools/flow` entirely** — it is `/project/<id>` — which is why a substring gate on `labs.google` could never match it; and the migrated composer is not control-less but exposes **no `data-testid`, zero ligature `<i>`, and 13 `button[aria-label]`** (`Settings trigger`, `Start generation`, …), recorded as recon for the follow-up WITH the caveat that `aria-label` is translated and therefore Tier-2 at best under the locale-invariance rule. One item is recorded as NOT verified rather than omitted: gflow **driving** the migrated frontend, which is out of scope and keeps #639 open. Verification also hit pre-existing [#561](https://github.com/ffroliva/gflow-cli/issues/561) (401 on `project.createProject`), A/B'd against unmodified `develop` to prove it was not this change, then routed around with an existing `--project`.
|
|
162
|
+
|
|
163
|
+
**"What was live-verified for v0.65.0?"** → [LIVE_VERIFICATION_v0.65.0](LIVE_VERIFICATION_v0.65.0.md) — the guard A/B (three runs, zero credits, control included); the `chain`/`movie` duration guards are validation that refuses **before** any transport call, so they are covered by a red state that reproduces the mid-spend crash in a test plus negative controls, and the reason they were not live-run is recorded rather than omitted.
|
|
164
|
+
|
|
165
|
+
**"Does the `referenceEntity` guard actually run, and is it a Web Worker or a Service Worker?"** → [LIVE_VERIFICATION_reference_entity_guard](LIVE_VERIFICATION_reference_entity_guard.md) — **A/B-proven live on denon82 2026-09-02, zero credits.** Control (without #618): the guard never fired and the test failed; with #618: it fired and passed. Same account, same prompt, one variable. Settles the question that held #618 — it is a **dedicated Web Worker**, so `context.route` suffices and no `service_workers="block"` is needed. Also confirms `route.continue_(post_data=...)` does not corrupt the body (both runs produced a real image). The **video** glob was equally dead, which #615 never mentions. Residual: direct-wire routes still bypass structurally (#619).
|
|
166
|
+
|
|
161
167
|
**"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)
|
|
162
168
|
**"What was live-verified for the video-download feature (#29)?"** → [LIVE_VERIFICATION_video_download](LIVE_VERIFICATION_video_download.md)
|
|
163
169
|
**"What is the jitter matrix evidence for `gflow image batch`?"** → [`LIVE_VERIFICATION_image_batch.md`](LIVE_VERIFICATION_image_batch.md) — jitter matrix evidence for `gflow image batch` (always-same-project mode)
|