gflow-cli 0.60.0__tar.gz → 0.62.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.60.0 → gflow_cli-0.62.0}/.codex-plugin/plugin.json +1 -1
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.env.template +2 -1
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.github/workflows/ci.yml +10 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.gitignore +5 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/CHANGELOG.md +250 -1
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/KNOWN_ISSUES.md +19 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/PKG-INFO +1 -1
- {gflow_cli-0.60.0/website → gflow_cli-0.62.0}/docs/CONFIGURATION.md +1 -1
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/INDEX.md +2 -2
- gflow_cli-0.62.0/docs/LIVE_VERIFICATION_v0.61.0.md +164 -0
- gflow_cli-0.62.0/docs/LIVE_VERIFICATION_v0.62.0.md +115 -0
- {gflow_cli-0.60.0/website → gflow_cli-0.62.0}/docs/MCP.md +1 -1
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/USAGE.md +4 -2
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/specs/2026-08-21-selector-registry-design.md +10 -0
- gflow_cli-0.62.0/docs/superpowers/specs/2026-08-26-model-attribution-provenance.md +168 -0
- gflow_cli-0.62.0/docs/superpowers/specs/2026-08-26-model-cost-quota-catalog.md +139 -0
- gflow_cli-0.62.0/docs/superpowers/specs/2026-08-27-changelog-modal-precondition-design.md +265 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/pyproject.toml +1 -1
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/canary/run_canary.py +57 -0
- gflow_cli-0.62.0/scripts/dev/live_verify_video_model_select.py +108 -0
- gflow_cli-0.62.0/scripts/dev/measure_locale_probe.py +109 -0
- gflow_cli-0.62.0/scripts/dev/spike_changelog_capture.py +308 -0
- gflow_cli-0.62.0/scripts/dev/spike_locale_poison.py +135 -0
- gflow_cli-0.62.0/scripts/dev/spike_model_inventory.py +158 -0
- gflow_cli-0.62.0/scripts/dev/spike_video_tab_dom.py +102 -0
- gflow_cli-0.62.0/scripts/dev/verify_language_agnostic.py +116 -0
- gflow_cli-0.62.0/scripts/dev/verify_locale_navigation_race.py +111 -0
- gflow_cli-0.62.0/scripts/dev/verify_model_attribution.py +82 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/skills/llm-council/SKILL.md +5 -3
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/__init__.py +1 -1
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/api/client.py +71 -9
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/api/routes.py +90 -5
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/api/transports/_common.py +136 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/api/transports/base.py +7 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/api/transports/drivers/classic.py +5 -1
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +8 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +4 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/api/transports/ui_automation.py +396 -58
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/api/transports/ui_automation_video.py +133 -61
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/cli_character.py +9 -3
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/cli_data.py +14 -1
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/cli_image.py +4 -3
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/cli_project.py +17 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/config.py +13 -2
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/data/queries.py +12 -12
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/mcp/tools.py +12 -1
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/profile_store.py +83 -1
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/services/catalog_sync.py +80 -7
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/services/character_create.py +5 -2
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/test_client_generate_character.py +28 -5
- gflow_cli-0.62.0/tests/api/test_client_locale_cache.py +204 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/test_routes_character.py +16 -4
- gflow_cli-0.62.0/tests/api/test_routes_locale.py +68 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/transports/drivers/test_ui_mode.py +7 -1
- gflow_cli-0.62.0/tests/api/transports/test_locale_navigation.py +194 -0
- gflow_cli-0.62.0/tests/api/transports/test_model_selection_loud.py +192 -0
- gflow_cli-0.62.0/tests/api/transports/test_navigation_settled.py +103 -0
- gflow_cli-0.62.0/tests/api/transports/test_overlay_precondition.py +471 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/transports/test_ui_automation.py +114 -63
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/transports/test_ui_automation_video.py +64 -19
- gflow_cli-0.62.0/tests/api/transports/test_video_model_selection_loud.py +179 -0
- gflow_cli-0.62.0/tests/data/test_null_columns_stay_null.py +126 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/e2e/test_agentic_count_enforcement_e2e.py +6 -1
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/e2e/test_sidebar_recovery_e2e.py +9 -1
- gflow_cli-0.62.0/tests/fixtures/changelog_modal_page.html +102 -0
- gflow_cli-0.62.0/tests/fixtures/flow_model_inventory.json +23 -0
- gflow_cli-0.62.0/tests/fixtures/flow_project_listing_media.json +54 -0
- gflow_cli-0.62.0/tests/flow_selectors/test_model_governance.py +250 -0
- gflow_cli-0.62.0/tests/scripts/test_canary_reexec.py +133 -0
- gflow_cli-0.62.0/tests/services/test_media_attribution.py +91 -0
- gflow_cli-0.62.0/tests/test_profile_store_locale.py +152 -0
- gflow_cli-0.62.0/tests/test_project_list_urls.py +228 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/uv.lock +1 -1
- {gflow_cli-0.60.0 → gflow_cli-0.62.0/website}/docs/CONFIGURATION.md +1 -1
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/website/docs/KNOWN_ISSUES.md +19 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0/website}/docs/MCP.md +1 -1
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/website/docs/USAGE.md +4 -2
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.agents/plugins/marketplace.json +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.claude/README.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.claude/commands/gflow/active.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.claude/commands/gflow/branch-review.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.claude/commands/gflow/changelog.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.claude/commands/gflow/check.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.claude/commands/gflow/doc-review.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.claude/commands/gflow/issue-assessment.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.claude/commands/gflow/issue-resolve.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.claude/commands/gflow/known-issues.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.claude/commands/gflow/live-verify.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.claude/commands/gflow/llm-council.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.claude/commands/gflow/next.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.claude/commands/gflow/plan.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.claude/commands/gflow/pr-council-review.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.claude/commands/gflow/predict.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.claude/commands/gflow/release.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.claude/commands/gflow/scenario.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.claude/commands/gflow/sonar.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.claude/commands/gflow/status.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.gitattributes +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.github/CODEOWNERS +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.github/copilot-instructions.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.github/dependabot.yml +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.github/workflows/deps-watch.yml +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.github/workflows/external-pr-triage.yml +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.github/workflows/governance-advisory.yml +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.github/workflows/governance-benchmark.yml +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.github/workflows/labels.yml +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.github/workflows/main-base-guard.yml +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.github/workflows/pages.yml +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.github/workflows/release.yml +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.github/workflows/scorecard.yml +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.github/workflows/selector-probe.yml +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.gitleaks.toml +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.pre-commit-config.yaml +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/.secrets.baseline +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/AGENTS.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/CLAUDE.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/CONFIGURATION.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/CONTRIBUTING.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/DISCLAIMER.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/LICENSE +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/PLAN.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/README.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/RELEASE.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/ROADMAP.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/conftest.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/deploy/PR-TRIAGE-AUTOPILOT-OPS.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/deploy/logrotate-pr-triage +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docker-compose.yml +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/AGENT_GUIDE.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/AGENT_UI_E2E.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/AGENT_UI_RECON.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/ASSET_TAGGING_RECON.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/CHARACTER.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/CHARACTER_RECON.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/DATA_LAYER.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/DEMOS.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/E2E_TESTING.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/GITHUB.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/INSTRUCTIONS.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_playwright_1.61.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.21.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.22.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.23.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.24.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.25.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.26.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.27.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.27.1.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.28.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.29.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.30.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.31.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.32.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.32.1.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.33.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.34.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.35.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.36.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.37.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.38.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.38.1.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.39.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.40.0-production-readiness.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.40.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.41.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.42.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.43.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.44.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.45.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.46.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.46.1.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.47.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.48.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.49.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.50.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.51.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.52.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.54.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.55.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.56.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.57.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.57.1.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.58.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.59.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.60.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/MEDIA_LIBRARY.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/MOVIE.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/PROJECT_STATUS.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/PROMPT_EXPANSION.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/REFERENCE_STRATEGIES.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/SECURITY.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/TOOLS.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/USER_GUIDE.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/assets/demo-split-pf.gif +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/assets/example-run.gif +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/assets/examples.webp +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/medium_tutorial.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/schemas/movie-handoff.schema.json +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/sonar-cleanup-tracker.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-07-08-pr-triage-autopilot/PLAN.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-07-09-camoufox-adoption/PLAN.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-07-14-storyboarding-and-visual-curation/PLAN.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-07-18-asset-tagging/PLAN.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-07-19-live-verify/PLAN.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-07-19-production-readiness-browser-lifecycle.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-07-19-production-readiness-driver-cdp-verification.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-07-19-production-readiness-public-truth.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-07-19-production-readiness-queue-safety.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-07-26-character-prompt-polishing/PLAN.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-07-26-project-name-management/PLAN.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-07-26-self-documenting-errors/PLAN.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-07-27-overlay-banner-dismissal/PLAN.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/PLAN.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/SCENARIO.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-04-mcp-tasks/PLAN.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-04-output-hardening/PLAN.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-05-issue-317-intra-batch-references/PLAN.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-05-issue-317-intra-batch-references/SCENARIO.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-05-issue-402-entity-provenance/PLAN.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-05-issue-402-entity-provenance/SCENARIO.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-05-issue-451-duration-tab-drift/PLAN.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-05-issue-451-duration-tab-drift/SCENARIO.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-06-driver-delay-jittering/PLAN.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-06-driver-delay-jittering/SCENARIO.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-06-overlay-changelog-watermark/PLAN.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-06-overlay-changelog-watermark/SCENARIO.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-06-ui-mode-policy/PLAN.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-06-ui-mode-policy/SCENARIO.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-14-video-ui-mode-policy/PLAN.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-14-video-ui-mode-policy/SCENARIO.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-21-selector-registry.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-25-workflow-hardening-gaps.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/research/2026-06-27-tool-abstraction-evaluation.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/specs/2026-06-29-issue-assessment-workflow-design.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/specs/2026-07-04-pr-triage-autopilot-design.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/specs/2026-07-18-asset-tagging-design.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/specs/2026-07-19-live-verify-design.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/specs/2026-07-19-production-readiness-hardening-design.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/spikes/2026-07-09-camoufox-waf-403.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/spikes/2026-07-12-ui-cohort-backend-config.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/spikes/2026-07-17-production-readiness-assessment.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/spikes/2026-08-01-mcp-2026-07-28-spec-impact.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/spikes/2026-08-14-video-model-capability-matrix.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/docs/superpowers/spikes/2026-08-15-picker-tile-alt-text.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/eval/pr_triage_eval.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/eval/pr_triage_fixtures.json +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/examples/README.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/examples/batch_from_config.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/examples/multi_prompt_t2i.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/examples/sample_config.json +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/examples/sample_prompts.txt +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/examples/single_image_t2i.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/examples/workflow_chain.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/index.html +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/llms.txt +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/samples/README.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/samples/captured/01_upload_image.json +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/samples/captured/04_archive_workflow.json +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/samples/captured/05_createProject.json +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/samples/captured/06_batchGenerateImages.json +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/samples/captured/12_create_scene.json +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/samples/captured/14_get_scene_workflows.json +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/autopilot/Dockerfile.triage +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/autopilot/entrypoint.sh +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/autopilot/package-lock.json +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/autopilot/package.json +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/autopilot/pr_triage_autopilot.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/autopilot/pr_triage_gate.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/autopilot/run_sandboxed_review.sh +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/canary/register_task.ps1 +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/ci/check_doc_links.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/ci/check_materiality.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/ci/check_release_artifacts.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/ci/check_repo_hygiene.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/ci/check_test_count.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/ci/check_website_docs_pii.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/ci/generate_website_docs.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/debug_editor.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/debug_gen_settings.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/debug_settings.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/_recording_client.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/_spike_common.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/active_plan.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/capture_frames_mode_trigger_ligature.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/capture_locale_invariants.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/capture_lower_priority_model_cost.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/capture_project_listing.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/capture_r2v_ingredient_lifecycle.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/capture_sidebar_state_dom.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/capture_video_model_capability_matrix.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/character_create_spike.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/character_create_spike_v2.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/dump_character_selectors.js +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/incident_bundle_quality.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/live_verify_mcp_tasks.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/live_verify_policy_400_v060.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/make_project.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/materiality_backtest.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/patch_character.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/skillopt/README.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/skillopt/harness.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/skillopt/tasks.json +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/sonar-local-scan.sh +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/sonar-pre-push-gate.sh +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/spike_char_editor_dom.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/spike_char_gen_capture.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/spike_character_prompt_format.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/spike_incident_live.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/spike_issue313_agent_mode_controls.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/spike_issue314_picker_filename_search.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/spike_issue404_count_tabs_recon.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/spike_mode_roundtrip.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/spike_mode_switch_agentic_to_classic.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/spike_movie_picker_select.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/spike_movie_voice_list.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/spike_omni_flash_i2v_ui_recon.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/spike_patch_entity.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/spike_patchright.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/dev/spike_trpc_origin_referer_401.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/diag/README.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/diag/capture_flow_traffic.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/diag/diag_aisandbox_bearer.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/diag/memory_profile.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/diag/recaptcha_mint.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/diag/spike_387_openai_compat.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/e2e/capture_agent_toggle.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/probe/run_probe.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/probe/spike_auth_matrix.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/record_demo.ps1 +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/smoke_image.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/smoke_video_editor.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/smoke_worker_style.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/spike_waf_camoufox.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/scripts/verify_chrome_auth_viability.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/skills/README.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/skills/changelog/SKILL.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/skills/check/SKILL.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/skills/doc-review/SKILL.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/skills/gflow-cli/SKILL.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/skills/issue-assessment/SKILL.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/skills/issue-resolve/SKILL.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/skills/known-issues/SKILL.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/skills/live-verify/SKILL.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/skills/plan/SKILL.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/skills/pr-council-review/SKILL.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/skills/predict/SKILL.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/skills/release/SKILL.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/skills/scenario/SKILL.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/skills/sonar/SKILL.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/skills/status/SKILL.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/sonar-project.properties +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/__main__.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/_cli_helpers.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/api/__init__.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/api/_engine.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/api/_retry.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/api/character.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/api/dto.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/api/image.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/api/image_upscale.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/api/recaptcha.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/api/scene.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/api/transports/__init__.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/api/transports/drivers/agentic.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/api/transports/drivers/base.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/api/transports/drivers/factory.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/api/transports/mode_control.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/api/video.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/auth/__init__.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/auth/base.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/auth/cookies.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/auth/factory.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/auth/real_chrome.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/auth/strategies.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/auth/verification.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/browser_manager.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/chain.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/chain_manifest.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/cli.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/cli_doctor.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/cli_instructions.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/cli_models.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/cli_movie.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/cli_run.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/cli_scene.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/cli_tools.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/cli_video.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/composition.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/data/__init__.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/data/chain_repo.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/data/migrations/0007_queue.sql +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/data/migrations/0008_add_operation_expanded_prompt.sql +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/data/migrations/0009_queue_claims.sql +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/data/models.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/data/recorder.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/data/redaction.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/data/repository.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/data/store.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/diagnostics.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/errors.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/exceptions.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/file_integrity.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/flow_selectors/__init__.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/flow_selectors/grading.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/flow_selectors/model.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/flow_selectors/registry.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/image_batch.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/json_output.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/mcp/__init__.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/mcp/prompts.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/mcp/resources.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/mcp/server.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/mcp/setup.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/mcp/tasks_extension.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/media.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/movie_manifest.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/observability.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/paths.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/profile_lease.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/redaction.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/services/__init__.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/services/doctor.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/services/mentions.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/storage.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/tools/__init__.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/tools/banned.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/tools/builtin/__init__.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/tools/builtin/creative-director.toml +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/tools/builtin/reverse-engineer.toml +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/tools/builtin/storyboard.toml +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/tools/expander.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/tools/invocation.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/tools/loader.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/tools/registry.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/tools/runtime.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/tools/spec.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/ui/app.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/ui/server.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/update_check.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/winsec.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/worker/codec.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/worker/daemon.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/src/gflow_cli/worker/queue.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tasks/lessons.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/test_assets/sample_batch.json +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/test_assets/sample_batch.tsv +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/test_assets/sample_batch_invalid.tsv +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/__init__.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/__init__.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/fixtures/character_gen_response.json +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/fixtures/patch_entity_response.json +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/test_aisandbox_auth_error.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/test_bearer_redaction.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/test_character.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/test_client.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/test_client_character.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/test_client_delete_characters.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/test_client_errors.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/test_client_image.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/test_client_incidents.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/test_client_launch_kwargs.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/test_client_patch_entity.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/test_client_scene.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/test_client_upscale.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/test_concurrency.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/test_dto.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/test_engine.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/test_image.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/test_image_dto.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/test_image_upscale.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/test_post_json_aisandbox_auth.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/test_recaptcha.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/test_retry.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/test_routes.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/test_routes_scene.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/test_sapisidhash_helper.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/test_scene_models.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/test_video.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/test_video_request.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/transports/__init__.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/transports/conftest.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/transports/drivers/test_agentic.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/transports/drivers/test_classic.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/transports/drivers/test_factory.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/transports/test_agentic_cohort_detection.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/transports/test_base.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/transports/test_bearer.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/transports/test_common.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/transports/test_factory.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/transports/test_fingerprint.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/transports/test_mode_control.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/transports/test_policy_400.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/transports/test_sapisidhash.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/transports/test_selector_symmetry.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/transports/test_transport_timeout.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/transports/test_ui_automation_batch.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/api/transports/test_ui_character_editor.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/auth/strategies/test_factory.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/auth/strategies/test_strategies.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/auth/test_cookies.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/auth/test_real_chrome.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/auth/test_verification.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/auth/test_windows_acl.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/autopilot/test_pr_triage_autopilot.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/cli/__init__.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/cli/test_auth_status.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/cli/test_cli_auth_list.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/cli/test_cli_character.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/cli/test_cli_character_create.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/cli/test_cli_data.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/cli/test_cli_data_errors.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/cli/test_cli_data_errors_retention.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/cli/test_cli_data_sync.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/cli/test_cli_doctor.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/cli/test_cli_image.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/cli/test_cli_image_selector_drift.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/cli/test_cli_image_upscale.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/cli/test_cli_image_uuid_ref_enrichment.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/cli/test_cli_instructions.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/cli/test_cli_models.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/cli/test_cli_movie.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/cli/test_cli_run.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/cli/test_cli_scene.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/cli/test_cli_tools.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/cli/test_cli_video.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/cli/test_cli_video_chain.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/cli/test_error_handling.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/cli/test_failure_funnel.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/cli/test_helpers.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/cli/test_incident_output.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/cli/test_movie_manifest.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/cli/test_movie_manifest_style_variants.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/cli/test_predictable_output.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/cli/test_settings_validation.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/composition/test_character.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/composition/test_compose_prompt.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/composition/test_handoff.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/composition/test_style_variants.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/composition/test_style_variants_e2e.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/conftest.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/data/__init__.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/data/test_chain_repo.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/data/test_failure_recording.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/data/test_find_incomplete_character.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/data/test_models.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/data/test_packaging.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/data/test_recorder.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/data/test_recorder_character.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/data/test_redaction.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/data/test_repository.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/data/test_scene_persistence.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/data/test_settings_and_errors.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/data/test_store.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/data/test_store_migrations.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/dev/test_recording_client.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/e2e/__init__.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/e2e/conftest.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/e2e/test_asset_tagging_e2e.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/e2e/test_cancellation_e2e.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/e2e/test_chain_e2e.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/e2e/test_character_create_e2e.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/e2e/test_classic_count_setter_e2e.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/e2e/test_crash_recovery_e2e.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/e2e/test_daemon_e2e.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/e2e/test_data_layer_e2e.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/e2e/test_data_sync_names_e2e.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/e2e/test_entity_provenance_e2e.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/e2e/test_entity_smuggling_e2e.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/e2e/test_i2v_flags_e2e.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/e2e/test_image_batch_e2e.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/e2e/test_image_uuid_ref_e2e.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/e2e/test_incident_quality_e2e.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/e2e/test_json_output_e2e.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/e2e/test_live_agentic_instructions.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/e2e/test_project_naming_e2e.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/e2e/test_refresh_on_miss_e2e.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/e2e/test_scene_compose_live.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/e2e/test_tools_e2e.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/e2e/test_transports_e2e.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/e2e/test_video_r2v_uuid_name_e2e.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/__init__.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/asset_tagging.feature +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/auth.feature +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/auth_login.feature +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/character_create.feature +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/character_read.feature +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/conftest.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/duration_tab_drift.feature +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/entity_provenance.feature +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/image.feature +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/image_batch_references.feature +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/image_upscale.feature +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/incident_diagnostics.feature +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/instructions.feature +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/locale_picker_include.feature +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/mcp_tasks.feature +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/media_picker_tiers.feature +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/output_hardening.feature +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/test_asset_tagging_steps.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/test_auth_login_steps.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/test_auth_steps.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/test_character_create_steps.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/test_character_read_steps.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/test_image_steps.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/test_image_upscale_steps.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/test_incident_diagnostics_steps.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/test_instructions_steps.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/test_locale_picker_include_steps.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/test_mcp_tasks_steps.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/test_media_picker_tiers_steps.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/test_output_hardening_steps.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/test_step_collision_guard.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/test_video_agent_ui_steps.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/test_video_chain_steps.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/video_agent_ui.feature +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/features/video_chain.feature +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/fixtures/__init__.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/fixtures/doctor_env.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/fixtures/listing_payload.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/fixtures/seeded_catalog.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/flow_selectors/__init__.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/flow_selectors/test_grading.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/flow_selectors/test_model.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/flow_selectors/test_registry.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/flow_selectors/test_report.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/image_batch/__init__.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/image_batch/test_image_manifest.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/image_batch/test_jitter_config.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/image_batch/test_observability_events.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/integration/__init__.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/integration/conftest.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/integration/constants.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/integration/test_expander_gateway.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/integration/test_storage_gcs.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/integration/test_storage_s3.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/mcp/__init__.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/mcp/conftest.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/mcp/test_auth_status_tool.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/mcp/test_cli_parity.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/mcp/test_error_funnel.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/mcp/test_http_transport.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/mcp/test_known_issues_resource.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/mcp/test_no_spend.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/mcp/test_rate_limit_envelope.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/mcp/test_resources.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/mcp/test_server.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/mcp/test_setup.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/mcp/test_stdio_transport.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/mcp/test_tasks_extension.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/mcp/test_tools_helpers.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/mcp/test_tools_instructions.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/mcp/test_tools_wired.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/scripts/test_canary_classify.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/scripts/test_check_materiality.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/scripts/test_check_release_artifacts.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/scripts/test_check_repo_hygiene.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/scripts/test_check_test_count.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/scripts/test_check_website_docs_pii.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/scripts/test_codex_plugin.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/scripts/test_generate_website_docs.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/scripts/test_incident_bundle_quality.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/scripts/test_materiality_backtest.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/scripts/test_workflow_hardening.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/services/__init__.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/services/test_catalog_sync.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/services/test_character_create_redaction.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/services/test_character_create_saga.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/services/test_doctor.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/services/test_mentions_observability.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/services/test_mentions_parse.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/services/test_mentions_resolve.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/services/test_resolve_and_apply.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/smoke/__init__.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/smoke/test_profile_account_smoke.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/smoke/test_real_flow.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/test_auth.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/test_browser_manager.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/test_chain.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/test_chain_manifest.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/test_cli_data.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/test_cli_project.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/test_config.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/test_conftest_isolation.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/test_data_queries.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/test_diagnostics_bundle.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/test_diagnostics_events.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/test_diagnostics_journal.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/test_diagnostics_recorder.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/test_diagnostics_retention.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/test_diagnostics_sanitize.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/test_documentation_gate.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/test_duration_tab_drift.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/test_entity_provenance.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/test_errors.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/test_errors_classification.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/test_image_batch_references.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/test_incident_generation_requests.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/test_json_output.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/test_marker_registry.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/test_media.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/test_observability.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/test_overlay_banner_dismissal.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/test_paths.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/test_playwright_pin.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/test_profile_lease.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/test_profile_lease_subprocess.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/test_profile_store.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/test_self_documenting_errors.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/test_smoke.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/test_update_check.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/tools/__init__.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/tools/test_banned.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/tools/test_expander.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/tools/test_invocation.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/tools/test_loader.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/tools/test_registry.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/tools/test_runtime.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/tools/test_spec.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/ui/test_app.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/worker/test_codec.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/worker/test_daemon.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/worker/test_mcp_daemon_race.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/worker/test_queue.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/worker/test_queue_multiprocess.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/tests/worker/test_queue_reconciliation.py +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/website/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/website/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/website/docs/CHARACTER.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/website/docs/DATA_LAYER.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/website/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/website/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/website/docs/E2E_TESTING.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/website/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/website/docs/INSTRUCTIONS.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/website/docs/MEDIA_LIBRARY.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/website/docs/MOVIE.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/website/docs/PROMPT_EXPANSION.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/website/docs/SECURITY.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/website/docs/TOOLS.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/website/docs/USER_GUIDE.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/website/docs/agents.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/website/docs/index.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/website/docs/installation.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/website/docs/onboarding-mockup.html +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/website/docs/onboarding.md +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/website/docs/stylesheets/extra.css +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/website/mkdocs.yml +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/website/requirements.in +0 -0
- {gflow_cli-0.60.0 → gflow_cli-0.62.0}/website/requirements.txt +0 -0
|
@@ -173,7 +173,8 @@
|
|
|
173
173
|
# `patchright install chromium`. Unset to revert to the default playwright engine.
|
|
174
174
|
# GFLOW_CLI_BROWSER_ENGINE=playwright
|
|
175
175
|
|
|
176
|
-
# Which Flow UI arm a command needs: auto (
|
|
176
|
+
# Which Flow UI arm a command needs: auto (default — no arm asked for, so it
|
|
177
|
+
# resolves to classic, the arm that can satisfy a generation request) | classic
|
|
177
178
|
# (require the hard aspect controls) | agentic (require the chat surface; needed
|
|
178
179
|
# for -i instructions). gflow switches to the required arm, verifies via re-probe,
|
|
179
180
|
# and aborts with exit 28 (retryable — the cohort flaps per load) if it can't be
|
|
@@ -205,6 +205,16 @@ jobs:
|
|
|
205
205
|
- name: Type check
|
|
206
206
|
run: uv run pyright src
|
|
207
207
|
|
|
208
|
+
# The overlay-precondition tests (#593) drive the captured changelog markup in
|
|
209
|
+
# a real headless Chromium — a mock cannot tell you whether
|
|
210
|
+
# `[role='dialog']:has(a[href*='changelog']) button` resolves against Flow's
|
|
211
|
+
# actual DOM, only a real CSS engine can. They skip cleanly when the browser is
|
|
212
|
+
# absent, which would make them silently decorative in CI, so one job in the
|
|
213
|
+
# matrix installs it. No account, no network, no credits.
|
|
214
|
+
- name: Install Chromium (real-DOM fixture tests)
|
|
215
|
+
if: matrix.python-version == '3.13'
|
|
216
|
+
run: uv run playwright install chromium --with-deps
|
|
217
|
+
|
|
208
218
|
- name: Test (smoke only) + coverage
|
|
209
219
|
# e2e/live tests require a logged-in Chromium profile and may spend
|
|
210
220
|
# Flow credits. pyproject.toml excludes both markers by default; CI
|
|
@@ -66,6 +66,11 @@ test_assets/debug_*/
|
|
|
66
66
|
# Phase-2 live-spike capture outputs — NEVER commit (may contain real API payloads)
|
|
67
67
|
scripts/dev/_spike_out/
|
|
68
68
|
|
|
69
|
+
# HAR captures (GFLOW_CLI_HAR_PATH) — full request/response bodies, headers and
|
|
70
|
+
# auth cookies. The _spike_out rule only covers the default location; a HAR
|
|
71
|
+
# written anywhere else must not be committable either.
|
|
72
|
+
*.har
|
|
73
|
+
|
|
69
74
|
# Agent session marker — machine/session-local handoff state, regenerated per run
|
|
70
75
|
.continue-here.md
|
|
71
76
|
|
|
@@ -7,6 +7,253 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.62.0] — 2026-08-28
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- **`--ui-mode auto` (the default) now requires the *classic* Flow arm for image
|
|
15
|
+
generation ([#595](https://github.com/ffroliva/gflow-cli/issues/595)).** `auto`
|
|
16
|
+
used to bind whatever the composer rendered, so an account that Flow moved into
|
|
17
|
+
its **agentic** cohort — observed live on two accounts on 2026-08-27 — took a
|
|
18
|
+
path that cannot satisfy an image request and failed with either
|
|
19
|
+
`image_mode_tab` selector drift (exit 23) or a `WireFormatError` about video
|
|
20
|
+
bytes. Neither error named the cause, and the workaround
|
|
21
|
+
(`GFLOW_CLI_PREFER_CLASSIC=1`) had to be discovered from an error message.
|
|
22
|
+
`auto` now means "no arm was asked for" and resolves to `classic`, matching the
|
|
23
|
+
rule video has followed since [#299](https://github.com/ffroliva/gflow-cli/issues/299).
|
|
24
|
+
The bind still attempts classic recovery first and the cohort flaps per page
|
|
25
|
+
load, so a run only aborts (`UiModeUnavailableError`, **exit 28**, pre-submit,
|
|
26
|
+
zero credits) when the arm is genuinely pinned — and that abort is retryable.
|
|
27
|
+
The agentic arm stays reachable, but only when asked for by name
|
|
28
|
+
(`--ui-mode agentic` / `GFLOW_CLI_UI_MODE=agentic`) or by need (`-i` agent
|
|
29
|
+
instructions, which are agentic-only and still force it). The image **batch**
|
|
30
|
+
path carried its own inline mode resolution and so kept binding `auto`; it now
|
|
31
|
+
routes through the same policy as the single-prompt path.
|
|
32
|
+
|
|
33
|
+
### Fixed
|
|
34
|
+
|
|
35
|
+
- **An announcement modal that mounts *during* a batch generation no longer
|
|
36
|
+
silently changes the next prompt's settings**
|
|
37
|
+
([#593](https://github.com/ffroliva/gflow-cli/issues/593) follow-up). #593 left a
|
|
38
|
+
stated gap: call sites that neither route through `_probe_selector_cascade` nor
|
|
39
|
+
sit behind a navigation gate were still unguarded, and the set had not been
|
|
40
|
+
enumerated. Auditing all 73 click/fill/press sites in the UI transports found
|
|
41
|
+
exactly one that survives the "can a modal actually land here?" test — the image
|
|
42
|
+
**batch** loop's per-prompt boundary. A batch dismisses overlays once, during
|
|
43
|
+
setup; from prompt 2 on, the settings clicks are the first act after a
|
|
44
|
+
multi-second generation wait on a page that never navigates. This one is worse
|
|
45
|
+
than a timeout: `_open_gen_settings_panel` returns `False` when no selector
|
|
46
|
+
matches and the caller falls back to Flow's current defaults, so a modal that
|
|
47
|
+
mounted during prompt 1 did not fail prompt 2 — it generated it at the wrong
|
|
48
|
+
aspect/count. The boundary now runs the same `_require_unblocked` check the
|
|
49
|
+
navigation epochs use (one probe on the happy path), so the run aborts with
|
|
50
|
+
exit 23 and a screenshot instead of producing a quietly wrong image.
|
|
51
|
+
|
|
52
|
+
- **A Flow announcement modal no longer wedges a run with an unexplained timeout
|
|
53
|
+
([#593](https://github.com/ffroliva/gflow-cli/issues/593)).** When Google ships a
|
|
54
|
+
feature, Flow puts a full changelog dialog over the editor and sets
|
|
55
|
+
`body { pointer-events: none }` while leaving the app neither `aria-hidden` nor
|
|
56
|
+
`inert` — so every control reads visible and enabled yet never receives a click,
|
|
57
|
+
and Playwright's actionability wait runs to timeout with no message. Measured live
|
|
58
|
+
on two accounts (2026-08-27, pt and en), which is also how the four failure paths
|
|
59
|
+
below were found:
|
|
60
|
+
- The gallery "+ New project" sweep ran with **no overlay check at all** — the one
|
|
61
|
+
navigation epoch that had none. A modal there cost 18 selectors x Playwright's
|
|
62
|
+
30 s default click timeout and then reported `Could not find 'New project' CTA`,
|
|
63
|
+
which is the wrong error about the wrong thing. It now dismisses first and the
|
|
64
|
+
click carries an explicit 5 s timeout.
|
|
65
|
+
- Dismissal **verifies itself**. It previously returned success the moment a click
|
|
66
|
+
landed, so a dismissal that changed nothing still logged `overlay_dismissed` and
|
|
67
|
+
the run timed out somewhere unrelated — the success event lied. It now re-probes
|
|
68
|
+
and reports honestly, with a new `ui_automation.overlay_postmortem` warning.
|
|
69
|
+
- A persistent block now **aborts pre-submit at $0** with exit 23 and a screenshot
|
|
70
|
+
(probe `overlay_close_button`) instead of hanging. A transient is not enough to
|
|
71
|
+
trigger it: Flow's own menus set the same property while open, so the guard
|
|
72
|
+
re-probes after a settle.
|
|
73
|
+
- **The modal can mount *after* the navigation gate**, which is how it kept winning.
|
|
74
|
+
Flow hydrates on its own schedule, well past `domcontentloaded`, so dismissal at
|
|
75
|
+
the navigation boundary can run before the dialog exists — then the dialog appears
|
|
76
|
+
and covers a control that is present and enabled, and the selector cascade reports
|
|
77
|
+
drift for an element that is perfectly fine. A failed probe now checks the overlay
|
|
78
|
+
state before believing itself, and dismisses and re-probes once. The guard lives in
|
|
79
|
+
the one cascade every probe routes through, so all ten call sites are covered.
|
|
80
|
+
Verified live on a third account (2026-08-27): before the fix, `image_mode_tab`
|
|
81
|
+
raised `UiSelectorDriftError` with the announcement on screen and **no
|
|
82
|
+
`overlay_detected` in the log at all**; after it, the same command on the same
|
|
83
|
+
account cleared the modal (`setLastAcknowledgedChangeLogId` → 200, 23 s in, i.e.
|
|
84
|
+
from the probe guard rather than the navigation gate) and left the editor
|
|
85
|
+
reachable.
|
|
86
|
+
- The destructive Escape fallback is now **gated on the page actually being
|
|
87
|
+
blocked**, which retires the [#395](https://github.com/ffroliva/gflow-cli/issues/395)
|
|
88
|
+
hazard structurally rather than by comment. That regression pressed Escape on the
|
|
89
|
+
character composer and sent a generation out without `entityContext` — billed,
|
|
90
|
+
silently wrong. A page we can positively see is clickable is never touched.
|
|
91
|
+
|
|
92
|
+
Two raw-`goto` e2e tests (`test_sidebar_recovery_e2e`, `e2e_auth` — the nightly
|
|
93
|
+
canary's default tier — and `test_agentic_count_enforcement_e2e`) bypass every
|
|
94
|
+
transport boundary and were unprotected; both now dismiss explicitly, and both stop
|
|
95
|
+
hardcoding `"en"` in favour of the account's own locale (#587).
|
|
96
|
+
|
|
97
|
+
**One deliberate behaviour change.** The close-button cascade is now split: the
|
|
98
|
+
changelog-scoped anchor (`[role='dialog']:has(a[href*='changelog']) button`) runs on
|
|
99
|
+
any page because it cannot match one of Flow's own surfaces, while the generic
|
|
100
|
+
selectors (`button:has(i:text('close'))` and friends) and the Escape fallback run
|
|
101
|
+
only once the body is known to be blocked. The cost is that a non-modal banner —
|
|
102
|
+
one that covers a control without blocking the body — is no longer auto-closed by
|
|
103
|
+
the generic selectors. That is the right side of the trade: those same generic
|
|
104
|
+
selectors match the character composer's own close button, #395 spent real credits
|
|
105
|
+
through exactly that door, and `KNOWN_ISSUES` rates the banner case Low and
|
|
106
|
+
transient.
|
|
107
|
+
|
|
108
|
+
### Added
|
|
109
|
+
|
|
110
|
+
- **`gflow project list` / `project show` and the MCP `gflow_list_projects` tool now
|
|
111
|
+
emit an account-correct editor URL
|
|
112
|
+
([#587](https://github.com/ffroliva/gflow-cli/issues/587)).** They previously
|
|
113
|
+
emitted no URL at all: they are network-free catalog reads, so they had no way to
|
|
114
|
+
resolve a locale and correctly declined to guess one. With the locale now cached
|
|
115
|
+
per profile the link is readable offline. An unknown locale still yields the bare
|
|
116
|
+
URL — never a guessed `/fx/en/...`, which is the shape that started this thread by
|
|
117
|
+
being handed to a pt-BR account owner. In the terminal the project id renders as a
|
|
118
|
+
hyperlink, costing no column width.
|
|
119
|
+
|
|
120
|
+
### Changed
|
|
121
|
+
|
|
122
|
+
- **The account-locale probe no longer costs ~4 s on every command
|
|
123
|
+
([#587](https://github.com/ffroliva/gflow-cli/issues/587)).** The probe added in
|
|
124
|
+
v0.61.0 settles the bootstrap navigation to learn where Flow lands. On an account
|
|
125
|
+
Flow does *not* redirect there is nothing to settle, so `wait_for_url` ran to the
|
|
126
|
+
full `URL_SETTLE_TIMEOUT_MS` every single invocation. Measured live 2026-08-27,
|
|
127
|
+
best-of-N per arm: **~6.2 s -> ~2.0 s** setup on the non-redirecting account,
|
|
128
|
+
against an unchanged ~2.8 s -> ~2.9 s on a redirecting one (the control, which
|
|
129
|
+
shows the cold-then-warm ordering is worth nothing on its own). Run-to-run
|
|
130
|
+
variance is over a second, so read the delta as "the 4 s settle timeout", not to
|
|
131
|
+
two decimals.
|
|
132
|
+
The outcome is cached in the profile dir (`.gflow_locale`, a sibling of the
|
|
133
|
+
existing `.gflow_account`). The same guard covers all four `await_url_settled`
|
|
134
|
+
call sites **in the UI transport**; guarding only the editor entry left three
|
|
135
|
+
navigations still paying the timeout. (The three sites in the experimental REST
|
|
136
|
+
transports have no resolved locale to gate on and are unchanged.)
|
|
137
|
+
|
|
138
|
+
The cache decides only *whether to wait*, never *where to navigate*. Sending the
|
|
139
|
+
browser to a cached `/fx/{seg}/...` was built, measured, and rejected: Flow
|
|
140
|
+
serves whatever segment it is asked for, so a pt-BR account handed `/fx/de/`
|
|
141
|
+
stayed there and rendered `html lang=de` with no redirect — no correction signal,
|
|
142
|
+
and a wrong-language UI for as long as the stale value lived. That is #580's
|
|
143
|
+
defect in a new hat. The navigation therefore stays bare, which is what lets Flow
|
|
144
|
+
state the account's own answer. Reproducer: `scripts/dev/spike_locale_poison.py`.
|
|
145
|
+
|
|
146
|
+
The cache holds **four** states, and the fourth is what keeps it honest.
|
|
147
|
+
`await_url_settled` returns `None` for both "Flow does not redirect this account"
|
|
148
|
+
and "the settle timed out this once", so one slow network could otherwise commit
|
|
149
|
+
to "not redirected" permanently and silently restore #580's post-`goto` race. A
|
|
150
|
+
no-redirect observation is therefore **provisional** until a second run agrees;
|
|
151
|
+
a transient timeout costs one extra probe instead of a lasting defect.
|
|
152
|
+
|
|
153
|
+
### Fixed
|
|
154
|
+
|
|
155
|
+
- **A NULL `model` / `aspect` / `project_id` no longer reads back as the string
|
|
156
|
+
`"None"` in `gflow data list images|videos`.** All three columns are nullable in
|
|
157
|
+
the schema (`assets.model`, `assets.aspect_ratio`, `assets.flow_project_id`), but
|
|
158
|
+
both listing constructors wrapped them in a bare `str(...)`, so a NULL became the
|
|
159
|
+
four-character string `"None"` — emitted verbatim into `--json` and
|
|
160
|
+
indistinguishable from a real value. `_row_to_operation_error` in the same module
|
|
161
|
+
already guarded `model` correctly; the two listing paths never got the same
|
|
162
|
+
treatment. `ImageRow` / `VideoRow` now type these fields `str | None` and the JSON
|
|
163
|
+
output carries `null`.
|
|
164
|
+
|
|
165
|
+
## [0.61.0] — 2026-08-27
|
|
166
|
+
|
|
167
|
+
### Fixed
|
|
168
|
+
|
|
169
|
+
- **A requested image model that cannot be selected no longer generates silently
|
|
170
|
+
on a different one ([#586](https://github.com/ffroliva/gflow-cli/issues/586)).**
|
|
171
|
+
`_select_image_model` swallowed every failure, logged a warning, and let the
|
|
172
|
+
generation proceed on whatever the project's picker already held. Observed
|
|
173
|
+
live: `--model imagen4` produced an image on `NARWHAL` and exited **0** —
|
|
174
|
+
confirmed three ways (log, catalog, and `imageModelName` in a HAR). Flow has
|
|
175
|
+
removed `Imagen 4` from its picker, and `has-text('Nano Banana 2')` had become
|
|
176
|
+
ambiguous with the newly-offered `Nano Banana 2 Lite`, so `.first` resolved by
|
|
177
|
+
DOM order. A missing or ambiguous selector now raises `UiSelectorDriftError`
|
|
178
|
+
(exit 23) naming what Flow actually offered, before anything is submitted.
|
|
179
|
+
|
|
180
|
+
- **A requested video model that cannot be selected no longer generates on a
|
|
181
|
+
different one — and charges for it
|
|
182
|
+
([#539](https://github.com/ffroliva/gflow-cli/issues/539)).** `_select_video_model`
|
|
183
|
+
refused only on i2v-with-frames; a plain `t2v`/`r2v` miss logged "Flow default
|
|
184
|
+
model applies" and returned, so the run generated on whatever the picker already
|
|
185
|
+
held and spent that tier's credits — veo-quality costs 100 against veo-lite's 10.
|
|
186
|
+
Read live, Flow's picker offers exactly `Omni Flash` / `Veo 3.1 - Lite` / `Fast` /
|
|
187
|
+
`Quality`, so `--model veo-lite-lp` matched nothing and was a reachable,
|
|
188
|
+
credit-spending wrong-model path. Every miss is now fatal (exit 18) naming what
|
|
189
|
+
Flow offered, and an **ambiguous** selector is refused rather than resolved with
|
|
190
|
+
`.first`, which picks by DOM order across tiers that differ 10x in cost. Unlike
|
|
191
|
+
the image arm, refusing is unambiguous here: `--model` defaults to `None` on
|
|
192
|
+
every video command, so reaching the picker means a model was explicitly asked
|
|
193
|
+
for. Verified with a zero-credit A/B against live Flow — the pre-fix code
|
|
194
|
+
returned success for a model Flow does not offer; the new code refuses.
|
|
195
|
+
|
|
196
|
+
- **Four more navigations settle before acting on the page
|
|
197
|
+
([#584](https://github.com/ffroliva/gflow-cli/issues/584)).** #580 settled the
|
|
198
|
+
three sites it touched; an audit of every `page.goto` found four more with the
|
|
199
|
+
same defect. The worst is `evaluate_fetch.refresh_auth`, which re-navigates to
|
|
200
|
+
refresh page-context tokens and reported success while the page was still
|
|
201
|
+
moving. Two more (`evaluate_fetch` setup, `sapisidhash` fingerprint capture)
|
|
202
|
+
run `page.evaluate` immediately after navigating, where a mid-flight redirect
|
|
203
|
+
raises "Execution context was destroyed" rather than failing quietly. The
|
|
204
|
+
fourth (`_enter_editor`'s gallery return) ran `_bypass_onboarding` — real
|
|
205
|
+
button clicks — on a page about to navigate away. A new AST-based test pins
|
|
206
|
+
every `goto` to a following settle, so the audit does not have to be redone
|
|
207
|
+
by hand.
|
|
208
|
+
|
|
209
|
+
- **The nightly canary now runs the version of itself that it just pulled
|
|
210
|
+
([#582](https://github.com/ffroliva/gflow-cli/issues/582)).** `run_canary.py
|
|
211
|
+
--pull` fast-forwards the checkout and then keeps executing the copy Python
|
|
212
|
+
loaded at startup, so every runner change was silently one night late. This was
|
|
213
|
+
not theoretical: #572 added `-o junit_logging=all` so a preserved RED would
|
|
214
|
+
carry the structlog line that decides #561, and the next run pulled it and
|
|
215
|
+
still produced a RED with zero log output — three REDs untriageable, and the
|
|
216
|
+
failure reads as "the fix did not work". The runner now re-runs itself once
|
|
217
|
+
when a successful pull changed its own source, guarded by both an env var and
|
|
218
|
+
a content digest (either alone prevents a loop), via `subprocess.run` rather
|
|
219
|
+
than `os.execv` so Task Scheduler still sees one process and the real exit code.
|
|
220
|
+
|
|
221
|
+
- **Editor navigation no longer races a locale redirect on non-`en` accounts
|
|
222
|
+
([#580](https://github.com/ffroliva/gflow-cli/issues/580)).** `_enter_editor`
|
|
223
|
+
built its URL from a hardcoded `locale="en-US"` that no caller ever overrode,
|
|
224
|
+
so every account was sent to `/fx/en/...`. On a pt-BR account Flow redirects
|
|
225
|
+
that to `/fx/pt/...` **after `page.goto` has already returned** — leaving
|
|
226
|
+
overlay dismissal and prompt submission running against a page about to be
|
|
227
|
+
navigated away. That is how [#395](https://github.com/ffroliva/gflow-cli/issues/395)'s
|
|
228
|
+
"character-route bounce" presented. The client now learns the account's real
|
|
229
|
+
locale from where Flow itself lands (the only trustworthy source: `auth/session`
|
|
230
|
+
carries no locale, and `navigator.language` reports the value gflow sets when
|
|
231
|
+
launching the context), hands it to the transport through the typed
|
|
232
|
+
`TransportSetup` seam, and an independent settle-wait tolerates any redirect we
|
|
233
|
+
did not predict. An unresolved locale omits the segment rather than guessing.
|
|
234
|
+
`gflow character create --locale` now defaults to the account's locale instead
|
|
235
|
+
of `en-US`; the previous hardcoded default meant the character editor — the
|
|
236
|
+
surface #395 was reported against — was still routed to `/fx/en/...` on every
|
|
237
|
+
account, and the character route never waited for a settle at all.
|
|
238
|
+
|
|
239
|
+
Live-verified on a pt-BR account with a control arm: the fix navigates
|
|
240
|
+
race-free while the pre-fix path still redirects. Accounts Flow does not
|
|
241
|
+
redirect (e.g. `en`) skip the wait entirely after a single bounded probe, so
|
|
242
|
+
they pay no per-navigation cost.
|
|
243
|
+
|
|
244
|
+
### Added
|
|
245
|
+
|
|
246
|
+
- **Server-side model attribution
|
|
247
|
+
([#586](https://github.com/ffroliva/gflow-cli/issues/586)).**
|
|
248
|
+
`parse_media_attribution` reads `modelNameType` / `seed` / `aspectRatio` from
|
|
249
|
+
the `flow.projectInitialData` listing gflow already fetches — the same payload
|
|
250
|
+
the sync path walks for `name` and discards the rest of. This matters most on
|
|
251
|
+
the **agentic** arm, where those fields were previously synthesised from our
|
|
252
|
+
own request because they live in a Web-Worker SSE stream Playwright cannot
|
|
253
|
+
observe; "not visible to the page" was never the same as "unknowable". Verified
|
|
254
|
+
live: an agentic run that requested `GEM_PIX_2` was attributed `NARWHAL` by the
|
|
255
|
+
server, with a real seed where the catalog held `0`.
|
|
256
|
+
|
|
10
257
|
## [0.60.0] — 2026-08-25
|
|
11
258
|
|
|
12
259
|
### Added
|
|
@@ -3155,7 +3402,9 @@ shell-script template that branches on these codes.
|
|
|
3155
3402
|
|
|
3156
3403
|
First skeleton. Not functional end-to-end yet.
|
|
3157
3404
|
|
|
3158
|
-
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.
|
|
3405
|
+
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.62.0...HEAD
|
|
3406
|
+
[0.62.0]: https://github.com/ffroliva/gflow-cli/compare/v0.61.0...v0.62.0
|
|
3407
|
+
[0.61.0]: https://github.com/ffroliva/gflow-cli/compare/v0.60.0...v0.61.0
|
|
3159
3408
|
[0.60.0]: https://github.com/ffroliva/gflow-cli/compare/v0.59.0...v0.60.0
|
|
3160
3409
|
[0.59.0]: https://github.com/ffroliva/gflow-cli/compare/v0.58.0...v0.59.0
|
|
3161
3410
|
[0.58.0]: https://github.com/ffroliva/gflow-cli/compare/v0.57.1...v0.58.0
|
|
@@ -503,6 +503,16 @@ playwright._impl._errors.TimeoutError: Locator.click: Timeout 30000ms exceeded.
|
|
|
503
503
|
|
|
504
504
|
**Legacy workaround (no longer required):** open Flow in Chrome with the same profile once, click the `X` on the "What's new" popup, then close Chrome cleanly.
|
|
505
505
|
|
|
506
|
+
**Update 2026-08-27 ([#593](https://github.com/ffroliva/gflow-cli/issues/593)) — the modal wedges more than the first run.** Captured live on two accounts (pt and en): the announcement sets `body { pointer-events: none }` while leaving the app neither `aria-hidden` nor `inert`, so controls read visible **and enabled** yet never receive a click. That is why the symptom is a bare `TimeoutError` naming nothing rather than the "intercepts pointer events" message above. Three gaps were closed:
|
|
507
|
+
|
|
508
|
+
- The gallery "+ New project" sweep had no overlay check at all, so a modal there burned 18 selectors x Playwright's 30 s default click timeout before reporting the wrong error.
|
|
509
|
+
- Dismissal reported success on click without verifying anything cleared — `overlay_dismissed` was logged on runs that then timed out elsewhere.
|
|
510
|
+
- The Escape fallback is now gated on the page being provably blocked, which retires the [#395](https://github.com/ffroliva/gflow-cli/issues/395) hazard structurally.
|
|
511
|
+
|
|
512
|
+
A block that survives dismissal now aborts pre-submit with exit 23 (probe `overlay_close_button`) and a screenshot, at zero credits, instead of hanging. Dismissal persists server-side — Flow records it as `videoFx.setLastAcknowledgedChangeLogId`, so one dismissal per announcement per account is the whole cost.
|
|
513
|
+
|
|
514
|
+
**Follow-up 2026-08-28 — the one remaining epoch, found by audit.** #593 left a stated gap: call sites that neither route through `_probe_selector_cascade` nor sit behind a navigation gate. All 73 click/fill/press sites in the UI transports were then enumerated and classified, and exactly one survives the "can a modal actually land here?" test: the **image batch** loop's per-prompt boundary. A batch dismisses overlays once during setup, so from prompt 2 on the settings clicks are the first act after a multi-second generation wait on a page that never navigates. That one failed *silently* rather than loudly — `_open_gen_settings_panel` returns `False` when nothing matches and the caller falls back to Flow's current defaults, so a modal that mounted during prompt 1 generated prompt 2 at the wrong aspect/count. It now runs the same `_require_unblocked` check the navigation epochs use. Every other unguarded site fails loudly (exit 23 with a probe name and a screenshot, or an `overlay_postmortem` warning), which is why they are deliberately left unguarded rather than pre-guarded on a hunch.
|
|
515
|
+
|
|
506
516
|
---
|
|
507
517
|
|
|
508
518
|
### No in-CLI quota visibility
|
|
@@ -901,6 +911,15 @@ names the pinning case. Retrying *immediately* during a pin is futile — wait a
|
|
|
901
911
|
while or switch `--profile`. Recorded as the #299 PR-B predict-gate evidence:
|
|
902
912
|
retry loops must never key off the pinned signature.
|
|
903
913
|
|
|
914
|
+
**Update 2026-08-28 ([#595](https://github.com/ffroliva/gflow-cli/issues/595)) — images
|
|
915
|
+
now reach this fail-fast by default.** Two accounts flipped agentic on 2026-08-27 and a
|
|
916
|
+
plain `gflow image t2i` failed on both, because `auto` bound whatever rendered and the
|
|
917
|
+
agentic driver cannot satisfy an image request (either `image_mode_tab` selector drift or
|
|
918
|
+
a `WireFormatError` about video bytes — neither naming the cause). `auto` now resolves to
|
|
919
|
+
`classic` for images too, so a pinned account gets the exit-28 abort described above
|
|
920
|
+
instead of a mid-run failure, and `GFLOW_CLI_PREFER_CLASSIC=1` is no longer the
|
|
921
|
+
workaround anyone needs to discover.
|
|
922
|
+
|
|
904
923
|
### Auth verification depends on Google's NextAuth session endpoint
|
|
905
924
|
|
|
906
925
|
- **Status:** Mitigated · **Severity:** Low (degrades fail-closed) · **Affects:** issue #15 fix onward · **Tracked:** issue #15
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: gflow-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.62.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
|
|
@@ -345,7 +345,7 @@ GFLOW_CLI_HISTORY_PROMPTS=redacted gflow image t2i "confidential brief"
|
|
|
345
345
|
|
|
346
346
|
**What:** Which Flow UI arm to use for generation. Flow serves a **classic** composer (hard crop/aspect controls) or an **agentic** chat cohort, server-assigned and flapping per page load ([#299](https://github.com/ffroliva/gflow-cli/issues/299)).
|
|
347
347
|
**Values:**
|
|
348
|
-
- `auto` (default) —
|
|
348
|
+
- `auto` (default) — no arm was asked for, so gflow **requires `classic`** ([#595](https://github.com/ffroliva/gflow-cli/issues/595)): classic is the arm that can satisfy a generation request, and it is recovered first, so this only aborts when the arm is genuinely pinned. Before v0.62.0 `auto` bound whatever rendered, which put an account in Flow's agentic cohort on a driver that cannot produce an image — failing mid-run as `image_mode_tab` selector drift or a `WireFormatError` about video bytes. Agentic is still reachable, but only by name (`--ui-mode agentic`) or by need (`-i`).
|
|
349
349
|
- `classic` — require the classic composer (hard aspect controls). gflow switches to it, re-probes to verify, and if the arm is still agentic **aborts before submitting** with `UiModeUnavailableError` (**exit 28**) — no credits spent.
|
|
350
350
|
- `agentic` — require the agentic chat surface (needed for `-i` agent instructions). gflow switches to it, verifies, and aborts (exit 28) if it can't be reached.
|
|
351
351
|
**Default:** `auto`
|
|
@@ -145,12 +145,12 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
|
|
|
145
145
|
**"Two gflow runs on the same profile — can the second one wait instead of failing (exit 11)?"** → [CONFIGURATION § GFLOW_CLI_LEASE_WAIT_SECONDS](CONFIGURATION.md#gflow_cli_lease_wait_seconds) (v0.56.0 opt-in bounded wait)
|
|
146
146
|
**"How do I silence the 'newer version on PyPI' stderr notice?"** → [CONFIGURATION § GFLOW_CLI_UPDATE_CHECK](CONFIGURATION.md#gflow_cli_update_check) (`0` disables; auto-skipped in CI and for editable installs)
|
|
147
147
|
**"How do I run the MCP server so an agent can't spend credits?"** → [CONFIGURATION § GFLOW_MCP_NO_SPEND](CONFIGURATION.md#gflow_mcp_no_spend) + [MCP § Option A2](MCP.md#option-a2-read-only-server) (`gflow mcp run --no-spend` / `GFLOW_MCP_NO_SPEND=1`; v0.57.0 — both generate tools go unregistered, not merely refused)
|
|
148
|
-
**"Which Flow UI arm does a
|
|
148
|
+
**"Which Flow UI arm does a run require, and why did it exit 2 or 28?"** → [CONFIGURATION § GFLOW_CLI_UI_MODE](CONFIGURATION.md#gflow_cli_ui_mode) (`auto` ≡ `classic` for **both** images and video — video since v0.57.0/#299, images since #595; unreachable classic aborts pre-submit with exit 28, $0; explicit `agentic` on video exits 2)
|
|
149
149
|
**"A gflow command hangs / fails — where do I start?"** → [DEBUGGING § Quick reference](DEBUGGING.md#quick-reference)
|
|
150
150
|
**"A command failed — where is the incident bundle and what's in it?"** → [DEBUGGING § Automatic incident bundles](DEBUGGING.md#automatic-incident-bundles) (layout, triggers, review-before-sharing); privacy boundaries: [SECURITY § Automatic incident bundles](SECURITY.md#automatic-incident-bundles-gflow_cli_incident_capture-default-on); disable via [CONFIGURATION § GFLOW_CLI_INCIDENT_CAPTURE](CONFIGURATION.md#gflow_cli_incident_capture)
|
|
151
151
|
**"Flow's UI broke a selector — how do I diagnose it?"** → [DEBUGGING § Inspecting Flow's live UI](DEBUGGING.md#inspecting-flows-live-ui)
|
|
152
152
|
**"What does each `ui_automation.*` log event mean?"** → [DEBUGGING § Listener & HTTP-layer debugging](DEBUGGING.md#listener--http-layer-debugging)
|
|
153
|
-
**What was actually live-verified for the latest release?** → latest: [LIVE_VERIFICATION_v0.60.0](LIVE_VERIFICATION_v0.60.0.md) (**#528 content-policy 400 classification + #578 labs-lane headers, verified 2026-08-25 on profile `denon82`, ZERO Veo credits** — the 400→`ContentPolicyError` path was proven end-to-end by **fault injection through the real transport** [real browser, real editor, real submit; the 400 fulfilled at the network boundary], passing for BOTH body shapes including the **bare 400 with no `reason` field** — the load-bearing case, since reason-only matching would fall straight back to `WireFormatError`, which is the bug; the new `ui_automation.batch_400_body` discovery log fired live and is what will capture Flow's real 400 shape next time. The **natural** trigger could NOT be reproduced and this is recorded, not omitted: two face-bearing `--ref` images PLUS an age-explicit descriptor [both documented triggers stacked] returned **200** — noting the issue specified character *entities*, a different wire shape from `--ref`, and that Flow's enforcement has shifted before. #578 is the rare case where live verification proved a change **unnecessary** rather than necessary: an interleaved A/B against real `project.createProject` returned 200 on BOTH arms [origin-less control and origin+referer treatment], falsifying the 401 premise it was cherry-picked for; a header-echo cross-check confirmed Playwright adds no Origin of its own, so the control arm was genuinely bare. Incident-bundle `generation_requests[]` is **partial** — the request-summary logger was observed live but no bundle was written [a classified `ContentPolicyError` is handled, so nothing triggers capture]; unit-covered instead. Selector probe exits **2 [infrastructure]** locally without CI credentials, which is its documented contract — an absent credential must never be published as drift); previously: [LIVE_VERIFICATION_v0.59.0](LIVE_VERIFICATION_v0.59.0.md) (**#542 doctor + #543 data sync + #546 refresh-on-miss, verified 2026-08-16 on profile `denon82`, ~4 Imagen credits** — doctor offline-verified (byte-identical never-writes proof); sync live-verified by a zero-credit e2e AND a real 117-project backfill (398 nameless rows → 338 named / 57 tombstoned / 0 failures); refresh-on-miss live-healed a deliberately-corrupted catalog name mid-generation via picker attach with `sync.source=refresh`); previously: [LIVE_VERIFICATION_v0.58.0](LIVE_VERIFICATION_v0.58.0.md) (**#529 catalog-UUID→displayName picker contract + r2v named-reference fixes, verified 2026-08-15/16 on profile `denon82` (pt-BR) via four committed e2e tests, ~7 Imagen + 1 veo-lite generation** — same-project exact-UUID tile attach, cross-project verified upload fallback, loud abort on unresolvable UUIDs, and a real r2v video generated from a catalog name; the r2v e2e caught and fixed two live UI drifts: the picker exposes no accessible tree so tiles are now text-matched, and a tile click attaches directly with the include button demoted to legacy fallback); previously: [LIVE_VERIFICATION_v0.57.1](LIVE_VERIFICATION_v0.57.1.md) (**#493 and #451/#288 root-caused and fixed from live evidence, verified 2026-08-14 on profile `denon82` (pt-BR — the #493 reporter's locale), ZERO credits** — #493 was NOT an unrecognized "third editor variant": "Inicial"/"Final" are the Frames sub-mode's Start/End slots and the "Agente" pill is the ordinary Agent button, both stock classic features. The real trigger is Flow's **expanded chat sidebar**, which removes the classic composer entirely [`crop_* = 0` AND `Agent pill = 0` simultaneously] — one state producing both reported symptoms, and the reason the failure was exit 23 rather than the retryable 25 [no agentic indicator on screen, so the cohort detector matched nothing]. Recovery hinged on a close button scoped to the sidebar's `edit_square` affordance, a single point of failure for any cohort lacking that ligature; an unscoped fallback now fires only from the demonstrably stuck state, **A/B-proven three ways** [scoped broken + fallback present → rescued; both broken → NOT recovered, which is what proves the fallback rescues rather than the surrounding loop]. #451/#288 were never selector drift either — Flow's settings popover is **model-conditional**, only `omni-flash` renders a duration row, so `--duration` on a Veo model hunted a control that is never drawn [verified on 2 accounts × 2 locales]; it now exits 2 before any browser work. Two #493 hypotheses were tested and **refuted** first and are committed so they are not re-derived [a `crop_free` sub-mode trigger — the trigger reflects the *aspect*, not the sub-mode; and a hydration race — a wait was written, A/B-neutered, and cold loads passed 3/3 BOTH ways, so it was reverted rather than shipped]. Recorded not-verified: the `veo_3_1_lite_lower_priority` picker miss is **inconclusive** [the capture came after the menu closed] so that selector was deliberately left untouched, and `chain.py`'s per-link duration aborts mid-run after billing — deferred with the finding recorded). Prior: [LIVE_VERIFICATION_v0.57.0](LIVE_VERIFICATION_v0.57.0.md) (**#299 video UI-mode policy + the #496/#497/#498/#501 MCP wave live-verified 2026-08-14 on profile `ffroliva`, ZERO credits** — three real video-editor loads bound the classic driver through `get_ui_driver` [`ui_driver.bound mode=classic`, 1.2–1.7 s, aborted pre-submit], `--ui-mode agentic` is refused with **exit 2 before any browser launch** [deliberately not exit 28, whose "retry may land it" hint would mislead for a driver that does not exist], and a real-editor classic→agent→classic round-trip proved `ensure_agent_mode`'s aria-verified real click [`{"agent_acted":true,"after_agent":"agent","after_media":"media"}`]; the MCP surfaces were driven over the **real stdio JSON-RPC wire** [subprocess `gflow mcp run`, so registration *and* stream routing are covered]: `--no-spend` cut `tools/list` from 11 tools to 9 with both generate tools genuinely unregistered rather than refused, zero-arg `gflow_auth_status` returned `authenticated` off a live `GET /fx/api/auth/session` **200**, `gflow_list_projects` returned **different project IDs** on offset 0 vs offset 2 [proving the offset is honored — catalogs larger than `limit` were previously unreachable] with `limit=0`→1 and `offset=-5`→0 clamps holding, and the known-issues resource served a **7,543-byte index** against a ~70 KB source file with a **111-byte** capped unknown-slug reply. The #498 rate-limited problem-details envelope is recorded **not live-verified with reason** — exhausting the token bucket needs ≥9 accepted generate calls, so the error path cannot be reached credit-free; it is unit-pinned for both tools instead). Prior: [LIVE_VERIFICATION_v0.56.0](LIVE_VERIFICATION_v0.56.0.md) (**#477 downgrade guard, #478 bounded lease wait, and the #493 mode-switch path live-verified 2026-08-13 on profile `denon82`, images only** — a fresh-project 16:9 `t2i` exercised the #493-touched mode-switch path end-to-end [valid `ff d8` JPEG 1376×768, `image_mode_entered` → `batch_response_captured`]; the #477 guard refused a scratch profile claiming Chromium 999 with **exit 11 pre-auth, pre-credits** at the generation-client call site; #478 was proven with three concurrent runs — `WAIT=0` control failed fast with `ProfileLockedError` exit 11 while the holder held, and the `WAIT=180` waiter polled ~11 s past the holder's natural release then generated successfully; the #493 drift branch itself is a named skip [only an affected account's new-editor cohort can reach it — the fix's message text is unit-pinned], and #479's update notice is deferred-with-reason to a post-release check [it needs a published newer version on PyPI and skips editable installs by design]; an expired denon82 session 401'd the first two attempts [external state, re-login fixed it, recorded not omitted]). Prior: [LIVE_VERIFICATION_v0.55.0](LIVE_VERIFICATION_v0.55.0.md) (**Tier-1 quick wins #471–#476 verified 2026-08-13 on profile `ffroliva`, ZERO credits** — `gflow auth status` probed the real Flow session endpoint live [`Flow session verified as ffroliva@gmail.com.`, exit 0, fail-closed contract pinned]; `gflow mcp setup` ran end-to-end with the real CLI against a scratch copy of the real Claude Desktop config [correct merged entry, pristine original]; the Windows profile-DACL two-step `icacls` idiom was derived empirically [the naive `/t` form broke file access] and is pinned by a real-icacls round-trip test on every Windows host; the incident bug-report template, MCP error funnel [all 11 tools guarded, raw exception text masked], and SecretStr settings are suite-verified with no live-Flow surface — reasons recorded, not omitted). Prior: [LIVE_VERIFICATION_v0.54.0](LIVE_VERIFICATION_v0.54.0.md) (**close-browser guidance #470, character-composer focus fix, overlay/jitter hardening, and SonarCloud-S2245 RNG swap live-verified 2026-08-12 on profile `ffroliva`, ZERO credits** — the new #470 login wording printed verbatim and the manual-close → `auth_flow_session_verified` round-trip worked end-to-end; a Classic-UI `t2i` produced a real 1024×1024 JPEG [`ff d8 ff e0`] exercising overlay dismissal + jitter + image-composer submit + mode controller, and a credit-free `character create` [entity `da3cd647…`, face 1376×768 JPEG] exercised the character-composer path directly [`entering_character_editor` → `prompt_submitted` → `entity_patched` → `completed`]; the first `t2i` hit the known agentic-cohort video-for-image condition [correctly refused via `WireFormatError`, tracked by #299, not a regression] and Classic UI worked around it. First mainline release after the orphaned v0.53.0/v0.53.1 tags — CHANGELOG restores honest 0.53.x sections). Prior: [LIVE_VERIFICATION_v0.52.0](LIVE_VERIFICATION_v0.52.0.md) (**batch DAG references #317, character entity provenance recording #402, and video duration selector cascade fix #451 live-verified 2026-08-05** — 3/3 live E2E tests in `tests/e2e/test_entity_provenance_e2e.py` passed clean on profile `ffroliva`, 5-layer evidence ledger verified). Prior: [v0.51.0](LIVE_VERIFICATION_v0.51.0.md) (**dependency/security/test-correctness release verified 2026-08-05, 1 Imagen credit + 1 Veo attempt** — the only change needing live evidence was the `playwright` bound raise `>=1.59.0,<1.60.0` → `>=1.61.0,<1.62.0`, and the 2026-08-03 regression does NOT reproduce on 1.61.0: a live i2v drove `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. `-m e2e_auth` 16/16, daemon e2e 1 passed [MCP over Streamable HTTP — the first live coverage that test has ever had, it was structurally incapable of passing before], MCP Tasks 5/5 layers, 2923 offline tests, `pip-audit --all-extras` clean. **No finished mp4 is claimed** — Flow's own generation returned `PUBLIC_ERROR_VIDEO_GENERATION_TIMED_OUT`, server-side. Defect found and recorded not omitted: Flow dropped the duration-tab UI so **`--duration` is currently broken for i2v**, A/B-proven pre-existing on BOTH 1.59.0 and 1.61.0 — [#451](https://github.com/ffroliva/gflow-cli/issues/451)). Prior: [v0.50.0](LIVE_VERIFICATION_v0.50.0.md) (**MCP Tasks extension SEP-2663, non-blocking task handle responses, CLI/MCP output path hardening -o/--output, and Telegram PR triage alert resilience verified 2026-08-04** — 5-layer evidence ledger note generated at `tmp/live-verify/mcp-tasks.md` confirming instant task handle return, working status queries, and cancelled status DB state transitions; full 118-test suite green). Prior: [v0.49.0](LIVE_VERIFICATION_v0.49.0.md) (**#125 `omni-flash` start-frame I2V video generation, Playwright dependency upper-bound pin `>=1.59.0,<1.60.0`, submission stage watchdog timeout, and #404 count-tab fail-closed logic verified 2026-08-03** — 0-credit wire intercept captured `batchAsyncGenerateVideoStartImage` with `startImage` bound; live costed generation on `omni-flash` I2V produced a 1.2MB valid mp4 video asset on `ffroliva`; full 2902-test release suite green). Prior: [v0.48.0](LIVE_VERIFICATION_v0.48.0.md) (**#411 predictable `-o`/`--output` paths, offline-verified 2026-08-02, ZERO credits** — exact single-target local writes + `_1`/`_2` multi-count **image** suffixes proven by the CLI suite; the pre-tag council audit [RED, then resolved] re-scoped the release to the truthful surface: a dead MCP `output` param was deleted [worker queue never read it — #414], cloud `-o` targets and video multi-count suffixes are follow-ups [#415], and two tautological video-path tests are recorded as weak evidence rather than claimed as proof; storage-layer S3 writes verified against Docker MinIO at the layer level only; 2888-test release tree green; the live-Flow run aborted pre-generation on an expired denon82 session [`AuthExpiredError` 401, correct RFC-7807 contract + remediation hint, $0] — recorded, not omitted; live re-run queued for the next authenticated session). Prior: [v0.47.0](LIVE_VERIFICATION_v0.47.0.md) (**MCP SDK 2.0.0 migration + dual-era protocol + #402 entity provenance recording live-verified 2026-08-01, ZERO credits** — stdio JSON-RPC initialization handshake verified over subprocess transport, `resolve-drift` CI job added to prevent dependency drift, and 121 unit tests in `tests/data` passed). Prior: [v0.46.1](LIVE_VERIFICATION_v0.46.1.md) (**#404 classic count-setter fix live-verified 2026-07-31 on the reporter's exact environment, ZERO credits** — credit-free DOM recon proved Flow renamed the count-tab labels to uniform `xN` [`x1` replaces `1x`, image AND video rows], that `nth(0)` of the old filtered set landed on the selected `x2` and actively moved the count AWAY from the target, and that a digit-keyed click on `x1` converges instantly and persists without a Save commit; the new classic e2e then passed live [count=1 against a fresh project displaying 2 → exactly 1 image; count=2 early-exit → exactly 2], and the #313 agentic count-enforcement e2e passed 4/4 [counts 1–4 vs deliberately mismatched sticky defaults, magic-byte-verified downloads] after its stale setup was repaired [Flow now loads the editor in classic mode — the setup needed an Agent-pill toggle before the `tune` icon; test-only fix, no product code implicated]; the video output-count cascade carries a recorded waiver [full drive costs Veo credits; its exact selector shape was exercised live in the spike's cleanup step]). Prior: [v0.46.0](LIVE_VERIFICATION_v0.46.0.md) (**#387 provider-agnostic prompt-tools transport live-verified 2026-07-28, ZERO credits** — a four-probe capability spike passed 4/4 against BOTH a non-Google gateway and Google's OpenAI-compat endpoint, including a *semantic* multimodal check [a generated solid-red JPEG round-tripped and the model answered 'Red'], which is what proved the native Gemini `inlineData` path could be deleted outright rather than kept as a fallback; the real CLI then returned `was_expanded: true` on gateway/gateway-no-model/Google-default, emitted the loud one-time notice + no-op for the removed `GFLOW_CLI_GEMINI_API_KEY`, and made NO network call when unconfigured. Live verification caught two defects a fully green 2849-test offline suite missed: Google's compat endpoint has no server-side default model [`400 "model is not specified"`, silently no-oping the DEFAULT configuration], and the first redirect guard did not actually work because `build_opener()` installs its default handlers regardless of arguments, so `Authorization` would still have been replayed cross-host. `/code-review high` is recorded as NOT run — it is user-triggered only). Prior: [v0.45.0](LIVE_VERIFICATION_v0.45.0.md) (**#393 UUID `--ref` binding + #395 character-entity binding live-verified 2026-07-27/28** — a controlled A/B on identical input flipped `--ref` from exit 9 to exit 0 via the catalog-backed upload fallback, with the anti-silence guard [an unbindable ref aborts non-zero and writes no image] pinned by a live e2e; picker DOM + HAR showed Flow indexes a short auto-caption, NOT the prompt, so a prompt-derived search hint was dropped rather than shipped on assumption; a CDP spike against Flow's own character flow then captured the `entityContext` contract that gflow's generations were missing, root-causing #395 to two gflow defects [overlay dismissal Escaping Flow's own composer, and a character-route bounce that sent the prompt to the project composer] — both fixed, both character e2e tests now pass live, including `--format-prompt` [#383], with a read-back confirming the character carries its name and `thumbnail_media_id`). Prior: [v0.44.0](LIVE_VERIFICATION_v0.44.0.md) (**#381 dual-side project management & Playwright Chromium transport live-verified 2026-07-26** — real-editor project creation + rename tRPC server/DOM sync, prompt slugging, `gflow project` subcommand family, HTTP 429 adaptive backoff, and full E2E test suite). Prior: [v0.43.0](LIVE_VERIFICATION_v0.43.0.md) (**private incident diagnostics live-verified 2026-07-23, 1 Veo credit**). Prior: [v0.42.0](LIVE_VERIFICATION_v0.42.0.md) (**#361 production-readiness live-gaps confirmed live 2026-07-21, 1 Veo credit** — a real `veo-lite` t2v through the worker path persisted a real `remote_started` checkpoint [observer→checkpoint→DB chain confirmed], crash-recovery classified the task `indeterminate` without resubmitting, and mid-launch cancellation released the `ProfileLease` credit-free; full evidence in [v0.40.0-production-readiness § "2026-07-21 live follow-up"](LIVE_VERIFICATION_v0.40.0-production-readiness.md#2026-07-21-live-follow-up-0420-cycle); #359 content-safety `400`→`ContentPolicyError` classification is unit-covered, not live-triggered [would require a deliberate policy violation]; #360/#362 are docs-only, verified by the documentation gates). Prior: [v0.41.0](LIVE_VERIFICATION_v0.41.0.md) (**#357 production-readiness hardening — stale-session fail-fast, free image gen, paid veo-lite T2V all proven live**). Prior: [v0.40.0](LIVE_VERIFICATION_v0.40.0.md) (**#344 `@`-mention asset-tagging resolution proven live e2e, ~2 Imagen credits** — `gflow character create` staged a real taggable character [bound reference images, `has_reference_images` guard], the e2e test's documented propagation wait cleared Flow's `projectInitialData` lag, and `gflow image t2i "@Zoro …"` passed with returncode 0, a real generated image, and the correctly de-tagged prompt in the catalog — no code changes needed, `resolve_and_apply` as merged in #344 already works end-to-end; pre-existing unrelated issue #174 [Flow media-library A/B flake] can still intermittently block generation regardless of this feature — recorded, not omitted). Prior: [v0.39.0](LIVE_VERIFICATION_v0.39.0.md) (**#341 failed-generation persistence proven live** — a real `image t2i` on denon82 failed at the wire [`batchGenerateImages` HTTP 400 → `WireFormatError`] and the record-on-catch funnel wrote the **first-ever `failed` row** into the production catalog [`error_type=wire-format`, redacted `error_detail`, browsable via `gflow data list errors`], **$0**; the remaining paid paths [video/chain/batch/movie/worker] are funnel-regression-tested, not force-failed live [would cost credits], and the status-aware `succeeded=false` video-poll fix is unit-locked — recorded, not omitted). Prior: [v0.38.1](LIVE_VERIFICATION_v0.38.1.md) (**#338 agentic-pin recovery proven live ON the pinned account** — run 1 caught the composer-render race the unit suite could not [`ensure_media_incomplete` +115 ms, toggle never reached]; the readiness-wait fix landed and run 2 recovered classic on denon82 after ~2h of pin [`ui_driver.bound mode=classic`, real 768×1376 JPEG, exact prompt adherence]; reload branch unit-locked, live trigger not observed this cycle — recorded, not omitted). Prior: [v0.38.0](LIVE_VERIFICATION_v0.38.0.md) (**#332 mode control + #314 i2i ref dedup proven live e2e** — `image t2i --ui-mode classic` recovered agentic→classic in a real run [`ui_mode.attempt_exit_agent` → full classic chain, 1376×768 JPEG]; two identical `image i2i` runs proved the dedup contract [run 1: picker miss → `image_uploaded`; run 2: `reference_deduped_by_filename`, ZERO uploads]; `video t2v` veo-fast [`MEDIA_GENERATION_STATUS_SUCCESSFUL`, 15.2 MB `ftyp` mp4]; autopilot #333 recorded deferred-with-reason [hermes-ops deployment staged separately]). Prior: [v0.37.0](LIVE_VERIFICATION_v0.37.0.md) (**viewport 1920×1080 + agentic count enforcement + FIPS-safe SAPISIDHASH proven live e2e** — `image t2i` [classic cohort, real 1376×768 JPEG] and `video t2v` veo-fast [`MEDIA_GENERATION_STATUS_SUCCESSFUL`, 11.5 MB `ftyp` mp4] both succeeded end-to-end at the new 1920×1080 viewport with every selector resolving [no drift]; SAPISIDHASH digest verified byte-identical [FIPS-safe `usedforsecurity=False`], auth unchanged). Prior: [v0.36.0](LIVE_VERIFICATION_v0.36.0.md) (**#316 diagnostic tooling live-verified against real Flow traffic** — `GFLOW_CLI_HAR_PATH` captured a real 54-entry HAR [real Flow domains, 34× 200s, and a genuine 401 the tool exists to diagnose]; `GFLOW_CLI_DEBUG_TRACEBACK`'s typed-error scoping confirmed live [console output identical with/without the flag on a `GFlowError`]; unhandled-path behavior covered by 6 new tests (30 total across both files) + SDD task review; #312 reference-entity-smuggling fix covered by its own dedicated e2e test). Prior: [v0.35.0](LIVE_VERIFICATION_v0.35.0.md) (**#305-follow-up multimodal reverse-engineering & storyboard tool proven live e2e** — `gflow tools run storyboard` successfully deconstructed a cyberpunk scene into a cohesive 4-panel sequence; `reverse-engineer` tool extracts frames from video streams/URLs using `claude-video`'s `watch.py` and produces structured prompt components using Gemini multimodal models; dynamic token budgeting and strict Pyright types verified via test suite). Prior: [v0.34.0](LIVE_VERIFICATION_v0.34.0.md) (**#299 `--ui-mode` gate proven live, ZERO credits** — drove `get_ui_driver` directly over 4 real editor loads, never generated: bidirectional switch works [classic→agentic via `_force_agent_mode`, agentic→classic via `_exit_agent_mode`, each DOM-reverified], `agentic`-when-already-agentic is idempotent, and a timed-out toggle → **exit-28 fail-fast before submission**; deprecation behavior-change [`prefer_classic`→exit 28] confirmed). Prior: [v0.33.0](LIVE_VERIFICATION_v0.33.0.md) (**#287-follow-up picker fix proven live on the original repro** — the v0.32.1-failing `i2v <uuid> --project <crowded>` command now exits 0 with a real 3.0 MB `ftyp` mp4, `frame_ref_attached` + `video_saved`, zero uploads; **#241 jitter live-verified on both paths** — flag `--jitter 4-6` → `batch_jitter_sleep seconds=4.98`, and the new 0.5–1.5 s default → `seconds=1.47`, each firing exactly once between two t2i submissions; environment note: the denon82 cohort is now natively agentic and round-2 generations hit the pre-existing #281 `MediaAttributionError`, not a regression). Prior: [v0.32.1](LIVE_VERIFICATION_v0.32.1.md) (**#293 teardown fix live-verified credit-free** — error-path aborts leave ZERO chrome.exe holding the profile [3× leak reproduced pre-fix same day]; force-close fallback + ProfileLockedError translation unit-pinned; #283 wave logic fixes mock-verified to exact call counts). Prior: [v0.32.0](LIVE_VERIFICATION_v0.32.0.md) (**#287 UUID i2v frames proven live e2e** — an in-project asset selected by media UUID in the frame-slot dialog [frame_ref_attached, startImage bound on the wire, ZERO upload events] produced a real 720×1280 interpolation, resolving the #237 negative prior; foreign UUID → exit 9 pre-generation with screenshot; **#288 duration fail-fast proven live** — exit 23 pre-submit saved a 10-credit generation, and the debug screenshot confirmed the duration control is ABSENT from the cohort's settings popover [locale hypothesis refuted]; upload-400 exit-27 repro deferred-with-reason — the original rejected JPEG no longer exists). Prior: [v0.31.0](LIVE_VERIFICATION_v0.31.0.md) (**#281 wrong-media defenses live-verified in BOTH directions, credit-free** — correct attribution downloads with real wire metadata [seed, 768×1376]; the incident-class lazy-render ambiguity reproduced live and hard-stopped with `MediaAttributionError` exit 26 naming every candidate UUID, no file written; **#282 two-UUID-ref i2i proven e2e** — both freshly generated portrait UUIDs picker-selected into one scene with both canonical identities visually transferred). Prior: [v0.30.0](LIVE_VERIFICATION_v0.30.0.md) (**agentic-cohort image path + both fixes live-verified credit-free** — native 768×1376 stills, i2i-chain + canonical-ref identity hold; the character-create `DataIntegrityError` and the `prefer_classic` WARNING were observed live then fixed [recorder idempotent + INFO log]; MCP video-param feature deferred-with-reason on Veo credits, per the stills-only goal). Prior: [v0.29.0](LIVE_VERIFICATION_v0.29.0.md) (**persistent `gflow instructions` CRUD proven live e2e GREEN, credit-free** — 11-command sequence on a fresh project: add incl. `--ref <image-UUID>` attach, list/enable/disable, master toggle both ways, TOML `apply` destructive full-sync with `enabled=false` honored, `rm` with server card-id preserved across mutations; movie brief-sync code-path-verified via the same primitives, deferred-with-reason on credits; MCP `gflow_instructions_*` tools are thin adapters over the live-verified primitives). Prior: [v0.28.0](LIVE_VERIFICATION_v0.28.0.md) (**agent instructions `-i` now steer agentic generation — crayon e2e GREEN**: a style-neutral prompt + an enabled "crayon" card produced an unmistakable crayon drawing through the real transport; root causes were conversational phrasing + the `project_brief.enabled` master switch). Prior: [v0.27.1](LIVE_VERIFICATION_v0.27.1.md) (**v0.27.0 release follow-up fixes and documentation sync**). Prior: [v0.27.0](LIVE_VERIFICATION_v0.27.0.md) (**`[style]` block with named variants + prompt-aware resume — credit-free CLI verification**: real `movie run --dry-run` 3-way ledger proving resolved-style display, `skip (done)` on matching `style_hash`, and `re-run (style changed)` after a style edit; composition is local, wire path untouched, so no Veo credits spent — first credited styled run will confirm visually). Prior: [v0.26.0](LIVE_VERIFICATION_v0.26.0.md) (**image i2i by generated-image UUID proven live e2e GREEN** — the existing asset is *selected in place* by its media UUID, no duplicate upload, producing an i2i output that references it; plus generated-image `display_name` capture, credited @C1ph3r404). Prior: [v0.25.0](LIVE_VERIFICATION_v0.25.0.md) (**#237 remote-UUID i2v proven live e2e GREEN** — a real 8s 720×1280 interpolation from a generated image's UUID, after the picker-search attach was reworked to local upload; #240 home-`.env` matrix live; plus two silent-failure guards root-caused live: video-as-image download rejection and rejected-upload fail-loud). Prior: [v0.24.0](LIVE_VERIFICATION_v0.24.0.md) (--project parity across CLI + MCP — automated coverage; live gen auth-gated). Prior: [v0.23.0](LIVE_VERIFICATION_v0.23.0.md) (MCP generation wiring proven live end-to-end — tool→worker→real Flow REST→structured-error translation; final image-write blocked by an expired session, environmental. #222 macOS fix reporter-verified e2e on Apple Silicon). Prior: [v0.22.0](LIVE_VERIFICATION_v0.22.0.md) (Tools framework — automated/CI coverage complete; credit/key-gated live feature run is a pending owner gate, see the doc) · [v0.21.0](LIVE_VERIFICATION_v0.21.0.md) (MCP server over stdio + HTTP/SSE — credit-free protocol handshake; 4 tools / 2 prompts / 3 resources confirmed on stdout) · [v0.20.1](LIVE_VERIFICATION_v0.20.1.md) · [v0.20.0](LIVE_VERIFICATION_v0.20.0.md) · [v0.19.0](LIVE_VERIFICATION_v0.19.0.md) · [v0.18.0](LIVE_VERIFICATION_v0.18.0.md) · [v0.17.0](LIVE_VERIFICATION_v0.17.0.md) · [v0.16.0](LIVE_VERIFICATION_v0.16.0.md) · [v0.13.0](LIVE_VERIFICATION_v0.13.0.md) · [v0.12.0](LIVE_VERIFICATION_v0.12.0.md) · [v0.11.0](LIVE_VERIFICATION_v0.11.0.md) · [v0.10.0](LIVE_VERIFICATION_v0.10.0.md) · [v0.9.1](LIVE_VERIFICATION_v0.9.1.md) · [v0.9.0](LIVE_VERIFICATION_v0.9.0.md) · [v0.8.1](LIVE_VERIFICATION_v0.8.1.md) · [v0.7.0](LIVE_VERIFICATION_v0.7.0.md)
|
|
153
|
+
**What was actually live-verified for the latest release?** → latest: [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)
|
|
154
154
|
**"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).
|
|
155
155
|
**"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)).
|
|
156
156
|
**"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)
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# Live verification — v0.61.0
|
|
2
|
+
|
|
3
|
+
Every claim below was **observed**. Claims that could not be observed are stated
|
|
4
|
+
as such in §6, not omitted.
|
|
5
|
+
|
|
6
|
+
## Environment
|
|
7
|
+
|
|
8
|
+
| | |
|
|
9
|
+
|---|---|
|
|
10
|
+
| Date | 2026-08-26 / 2026-08-27 |
|
|
11
|
+
| Profile | `denon82` (account locale **pt**, `html_lang=pt`) |
|
|
12
|
+
| Project | `2ddc3a33-97db-41a0-a0d3-7f9488b0d5a9` |
|
|
13
|
+
| UI arm | classic (cohort flaps per page load — see §6) |
|
|
14
|
+
| CLI | 0.60.0 tree + the five fixes in this release |
|
|
15
|
+
| Credits spent | **one** t2v generation (`omni-flash`). Everything else was credit-free. |
|
|
16
|
+
|
|
17
|
+
## Summary
|
|
18
|
+
|
|
19
|
+
| # | change | verified live | how |
|
|
20
|
+
|---|---|---|---|
|
|
21
|
+
| 1 | Video model refusal (#539) | ✅ | zero-credit A/B + two CLI runs |
|
|
22
|
+
| 2 | Image model refusal (#586) | ✅ | CLI, exit 23, 0 files written |
|
|
23
|
+
| 3 | Server-side attribution (#586) | ✅ | real agentic mis-attribution detected |
|
|
24
|
+
| 4 | Locale navigation (#581) | ✅ | pt account + control arm |
|
|
25
|
+
| 5 | Navigation settle audit (#584) | ⚠️ partial | 1 of 4 sites exercised — see §5 |
|
|
26
|
+
| 6 | Canary re-exec (#582) | ⚠️ not yet | unit-tested; first real exercise is tonight |
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## 1. Video model refusal (#539) — the headline change
|
|
31
|
+
|
|
32
|
+
Flow's video picker, read **while the menu was open**:
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
volume_up Omni Flash
|
|
36
|
+
volume_up Veo 3.1 - Lite
|
|
37
|
+
volume_up Veo 3.1 - Fast
|
|
38
|
+
volume_up Veo 3.1 - Quality
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
`Veo 3.1 - Lite [Lower Priority]` is **not offered to this account at this
|
|
42
|
+
moment**. That makes `--model veo-lite-lp` a real MISS to test, not a synthetic one.
|
|
43
|
+
|
|
44
|
+
### 1a. Zero-credit A/B against the pre-fix code
|
|
45
|
+
|
|
46
|
+
Model selection happens in the settings panel entirely **before** submit, so both
|
|
47
|
+
arms cost nothing. The "old code" column is a real run of the stashed pre-fix
|
|
48
|
+
source against live Flow — not a reading of the diff.
|
|
49
|
+
|
|
50
|
+
| case | old code | new code |
|
|
51
|
+
|---|---|---|
|
|
52
|
+
| `omni_flash` | SELECTED | **SELECTED** |
|
|
53
|
+
| `veo_3_1_lite` | SELECTED | **SELECTED** |
|
|
54
|
+
| `veo_3_1_fast` | SELECTED | **SELECTED** |
|
|
55
|
+
| `veo_3_1_quality` | SELECTED | **SELECTED** |
|
|
56
|
+
| `veo-lite-lp` (not offered) | **SELECTED** — returned success | **REFUSED** |
|
|
57
|
+
| ambiguous selector, 3 matches | **SELECTED** — `.first` guess | **REFUSED** |
|
|
58
|
+
|
|
59
|
+
Harness: `scripts/dev/live_verify_video_model_select.py` (6/6 as expected).
|
|
60
|
+
|
|
61
|
+
The ambiguous case was produced by injecting `has-text('Veo 3.1')`, which matches
|
|
62
|
+
Lite + Fast + Quality. The refusal message reported **3 entries match**, i.e. the
|
|
63
|
+
real live count, not a fixture's.
|
|
64
|
+
|
|
65
|
+
### 1b. CLI, end to end
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
gflow video t2v ... --model veo-lite-lp → EXIT 18, nothing submitted
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
The RFC 9457 detail names all four models Flow offers and states
|
|
72
|
+
`No credits were spent.`
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
gflow video t2v ... --model omni-flash → EXIT 0
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
- `ui_automation_video.model_selected` with `"model": "omni_flash"`
|
|
79
|
+
- `poll_terminal` → `MEDIA_GENERATION_STATUS_SUCCESSFUL`
|
|
80
|
+
- `f41810ea-d2e3-40fe-b834-3eaaaa351a1f.mp4`, **2 250 862 bytes**
|
|
81
|
+
- catalog row records `model: "omni_flash"`
|
|
82
|
+
|
|
83
|
+
The guard does not break the working path.
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## 2. Image model refusal (#586)
|
|
88
|
+
|
|
89
|
+
`--model imagen4` (an entry Flow has removed) → **EXIT 23**, **0 jpgs written**,
|
|
90
|
+
message naming what Flow does offer. An ambiguous selector → **EXIT 23**,
|
|
91
|
+
`AMBIGUOUS — 2 entries match`. A disambiguated `NARWHAL` selects and generates.
|
|
92
|
+
|
|
93
|
+
Batch containment: with prompt 0 refused and prompt 1 valid, the run reported
|
|
94
|
+
`1/2 succeeded` and **EXIT 0** — one drifted selector does not abort a batch.
|
|
95
|
+
|
|
96
|
+
## 3. Server-side attribution (#586)
|
|
97
|
+
|
|
98
|
+
An agentic run that requested `GEM_PIX_2` was attributed **`NARWHAL`** by
|
|
99
|
+
`flow.projectInitialData`, with a real seed where the catalog held the `0`
|
|
100
|
+
sentinel. `scripts/dev/verify_model_attribution.py` exits **1** on that real
|
|
101
|
+
mismatch. Free, cookie-authenticated, arm-agnostic.
|
|
102
|
+
|
|
103
|
+
## 4. Locale navigation (#581)
|
|
104
|
+
|
|
105
|
+
Today's runs resolved `client.account_locale_resolved locale=pt` and navigated
|
|
106
|
+
`https://labs.google/fx/pt/tools/flow/project/...`. `url_stable_after_goto`
|
|
107
|
+
reported `settle_skipped=false` on the redirecting account and `true` on a
|
|
108
|
+
non-redirecting one, so `en` accounts pay no per-navigation wait.
|
|
109
|
+
|
|
110
|
+
Previously verified across **pt / de / ja / fr / ru** with a control arm showing
|
|
111
|
+
the pre-fix path still racing.
|
|
112
|
+
|
|
113
|
+
## 5. Navigation settle audit (#584) — partial, stated deliberately
|
|
114
|
+
|
|
115
|
+
Four `page.goto` sites gained a settle. Live runs this cycle exercised
|
|
116
|
+
**`_enter_editor`** only (`ui_automation.url_stable_after_goto`, repeatedly).
|
|
117
|
+
|
|
118
|
+
**Not exercised live this cycle:** `evaluate_fetch.refresh_auth`,
|
|
119
|
+
`evaluate_fetch` setup, and the `sapisidhash` fingerprint capture — none of the
|
|
120
|
+
runs above needed a bearer refresh. They are covered by unit tests and by the
|
|
121
|
+
AST ratchet that pins every `goto` to a following settle, which is a weaker
|
|
122
|
+
guarantee than observation and is recorded here as such.
|
|
123
|
+
|
|
124
|
+
## 6. Canary re-exec (#582) — not yet observed
|
|
125
|
+
|
|
126
|
+
The runner re-runs itself once when a successful `--pull` changed its own source.
|
|
127
|
+
Covered by `tests/scripts/test_canary_reexec.py`. Its first **real** exercise is
|
|
128
|
+
the nightly run from the dedicated canary clone; nothing in this cycle triggered
|
|
129
|
+
a self-changing pull, so the behaviour is **unverified in production** and is
|
|
130
|
+
called out rather than assumed.
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Also observed: the cohort race is real
|
|
135
|
+
|
|
136
|
+
Two byte-identical `--ui-mode classic` invocations produced different arms
|
|
137
|
+
seconds apart — one bound classic and refused correctly (exit 23), the other
|
|
138
|
+
failed earlier at `mode_control.ensure_media_incomplete` with **exit 31**
|
|
139
|
+
(`FlowAppError`) before model selection ran. This bounds what any pre-submit
|
|
140
|
+
guard can promise and is recorded so it is not mistaken for a regression.
|
|
141
|
+
|
|
142
|
+
## Falsified this cycle
|
|
143
|
+
|
|
144
|
+
The note carried in #539 that *"the video picker uses a different trigger"* is
|
|
145
|
+
**wrong**: `MODEL_PICKER_TRIGGER` and `IMAGE_MODEL_PICKER_TRIGGER` are
|
|
146
|
+
byte-identical strings. The repeated empty menu captures were caused by the
|
|
147
|
+
**capture** — `_switch_to_video_mode` leaves the settings menu open by contract,
|
|
148
|
+
and calling `_open_gen_settings_panel` after it re-clicks the same button and
|
|
149
|
+
toggles the panel shut. A DOM dump settled it in one run:
|
|
150
|
+
`id='radix-:r1q:-trigger-VIDEO'` was present and visible throughout.
|
|
151
|
+
|
|
152
|
+
## 5-layer ledger (the paid video generation)
|
|
153
|
+
|
|
154
|
+
| layer | evidence |
|
|
155
|
+
|---|---|
|
|
156
|
+
| file count | 1 mp4 written |
|
|
157
|
+
| magic bytes | `00 00 00 20 66 74 79 70 69 73 6f 6d` — `ftypisom`, real ISO-BMFF |
|
|
158
|
+
| size | 2 250 862 bytes (not a truncated error page) |
|
|
159
|
+
| structlog invariants | `model_selected model=omni_flash` → `generate_captured status=200` → `poll_terminal SUCCESSFUL` → `video_saved` |
|
|
160
|
+
| user-confirmable artifact | `tmp/f41810ea-d2e3-40fe-b834-3eaaaa351a1f.mp4` |
|
|
161
|
+
|
|
162
|
+
## Cleanup owed
|
|
163
|
+
|
|
164
|
+
- Ad-hoc media in project `2ddc3a33` from the runs above (1 video, several images).
|