gflow-cli 0.66.1__tar.gz → 0.66.2__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.66.1 → gflow_cli-0.66.2}/.codex-plugin/plugin.json +1 -1
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/CHANGELOG.md +49 -1
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/KNOWN_ISSUES.md +13 -1
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/PKG-INFO +1 -1
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/INDEX.md +2 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.66.1.md +33 -2
- gflow_cli-0.66.2/docs/LIVE_VERIFICATION_v0.66.2.md +170 -0
- {gflow_cli-0.66.1/website → gflow_cli-0.66.2}/docs/MCP.md +7 -1
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/PROJECT_STATUS.md +58 -27
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/pyproject.toml +1 -1
- gflow_cli-0.66.2/scripts/dev/measure_migrated_host_flip.py +152 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/__init__.py +1 -1
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/api/client.py +60 -10
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/api/transports/_common.py +38 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/api/transports/drivers/factory.py +33 -19
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/api/transports/mode_control.py +11 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/api/transports/ui_automation_video.py +13 -1
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/profile_store.py +5 -3
- gflow_cli-0.66.2/tests/api/test_client_locale_cache.py +375 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_routes_locale.py +13 -5
- gflow_cli-0.66.2/tests/api/transports/test_migrated_host_gate.py +250 -0
- gflow_cli-0.66.2/tests/features/latched_locale_recovery.feature +19 -0
- gflow_cli-0.66.2/tests/features/migrated_host_gate.feature +23 -0
- gflow_cli-0.66.2/tests/features/test_migrated_host_gate_steps.py +214 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/worker/test_daemon.py +39 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/uv.lock +1 -1
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/website/docs/KNOWN_ISSUES.md +13 -1
- {gflow_cli-0.66.1 → gflow_cli-0.66.2/website}/docs/MCP.md +7 -1
- gflow_cli-0.66.1/tests/api/test_client_locale_cache.py +0 -204
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.agents/plugins/marketplace.json +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.claude/README.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.claude/commands/gflow/active.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.claude/commands/gflow/branch-review.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.claude/commands/gflow/changelog.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.claude/commands/gflow/check.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.claude/commands/gflow/doc-review.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.claude/commands/gflow/issue-assessment.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.claude/commands/gflow/issue-resolve.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.claude/commands/gflow/known-issues.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.claude/commands/gflow/live-verify.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.claude/commands/gflow/llm-council.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.claude/commands/gflow/next.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.claude/commands/gflow/plan.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.claude/commands/gflow/pr-council-review.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.claude/commands/gflow/predict.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.claude/commands/gflow/release.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.claude/commands/gflow/scenario.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.claude/commands/gflow/sonar.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.claude/commands/gflow/status.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.env.template +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.gitattributes +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.github/CODEOWNERS +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.github/FUNDING.yml +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.github/copilot-instructions.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.github/dependabot.yml +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.github/workflows/ci.yml +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.github/workflows/deps-watch.yml +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.github/workflows/external-pr-triage.yml +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.github/workflows/governance-advisory.yml +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.github/workflows/governance-benchmark.yml +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.github/workflows/labels.yml +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.github/workflows/main-base-guard.yml +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.github/workflows/pages.yml +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.github/workflows/release.yml +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.github/workflows/scorecard.yml +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.github/workflows/selector-probe.yml +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.github/workflows/star-history-watch.yml +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.gitignore +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.gitleaks.toml +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.pre-commit-config.yaml +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/.secrets.baseline +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/AGENTS.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/CLAUDE.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/CONFIGURATION.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/CONTRIBUTING.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/DISCLAIMER.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/LICENSE +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/PLAN.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/README.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/RELEASE.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/ROADMAP.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/conftest.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/deploy/PR-TRIAGE-AUTOPILOT-OPS.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/deploy/logrotate-pr-triage +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docker-compose.yml +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/ACCOUNT_SAFETY.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/AGENT_GUIDE.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/AGENT_UI_E2E.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/AGENT_UI_RECON.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/ASSET_TAGGING_RECON.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/CHARACTER.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/CHARACTER_RECON.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/CONFIGURATION.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/DATA_LAYER.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/DEMOS.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/E2E_TESTING.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/GITHUB.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/GOVERNANCE_BENCHMARK.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/IMAGE_UPSCALE_RECON.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/INSTRUCTIONS.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_playwright_1.61.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_reference_entity_guard.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.21.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.22.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.23.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.24.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.25.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.26.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.27.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.27.1.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.28.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.29.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.30.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.31.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.32.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.32.1.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.33.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.34.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.35.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.36.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.37.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.38.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.38.1.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.39.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.40.0-production-readiness.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.40.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.41.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.42.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.43.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.44.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.45.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.46.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.46.1.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.47.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.48.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.49.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.50.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.51.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.52.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.54.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.55.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.56.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.57.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.57.1.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.58.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.59.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.60.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.61.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.62.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.62.1.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.63.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.64.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.65.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.66.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/LIVE_VERIFICATION_video_download.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/MEDIA_LIBRARY.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/MOVIE.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/PROMPT_EXPANSION.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/REFERENCE_STRATEGIES.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/SECURITY.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/TOOLS.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/USAGE.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/USER_GUIDE.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/assets/demo-split-pf.gif +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/assets/example-run.gif +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/assets/examples.webp +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/medium_tutorial.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/schemas/movie-handoff.schema.json +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/sonar-cleanup-tracker.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-07-08-pr-triage-autopilot/PLAN.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-07-09-camoufox-adoption/PLAN.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-07-14-storyboarding-and-visual-curation/PLAN.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-07-18-asset-tagging/PLAN.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-07-19-live-verify/PLAN.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-07-19-production-readiness-browser-lifecycle.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-07-19-production-readiness-driver-cdp-verification.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-07-19-production-readiness-public-truth.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-07-19-production-readiness-queue-safety.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-07-26-character-prompt-polishing/PLAN.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-07-26-project-name-management/PLAN.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-07-26-self-documenting-errors/PLAN.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-07-27-overlay-banner-dismissal/PLAN.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/PLAN.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/SCENARIO.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-08-04-mcp-tasks/PLAN.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-08-04-output-hardening/PLAN.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-08-05-issue-317-intra-batch-references/PLAN.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-08-05-issue-317-intra-batch-references/SCENARIO.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-08-05-issue-402-entity-provenance/PLAN.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-08-05-issue-402-entity-provenance/SCENARIO.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-08-05-issue-451-duration-tab-drift/PLAN.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-08-05-issue-451-duration-tab-drift/SCENARIO.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-08-06-driver-delay-jittering/PLAN.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-08-06-driver-delay-jittering/SCENARIO.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-08-06-overlay-changelog-watermark/PLAN.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-08-06-overlay-changelog-watermark/SCENARIO.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-08-06-ui-mode-policy/PLAN.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-08-06-ui-mode-policy/SCENARIO.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-08-14-video-ui-mode-policy/PLAN.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-08-14-video-ui-mode-policy/SCENARIO.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-08-21-selector-registry.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-08-25-workflow-hardening-gaps.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/plans/2026-09-01-video-extend/PLAN.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/research/2026-06-27-tool-abstraction-evaluation.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/specs/2026-06-29-issue-assessment-workflow-design.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/specs/2026-07-04-pr-triage-autopilot-design.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/specs/2026-07-18-asset-tagging-design.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/specs/2026-07-19-live-verify-design.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/specs/2026-07-19-production-readiness-hardening-design.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/specs/2026-08-21-selector-registry-design.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/specs/2026-08-26-model-attribution-provenance.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/specs/2026-08-26-model-cost-quota-catalog.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/specs/2026-08-27-changelog-modal-precondition-design.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/spikes/2026-07-09-camoufox-waf-403.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/spikes/2026-07-12-ui-cohort-backend-config.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/spikes/2026-07-17-production-readiness-assessment.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/spikes/2026-08-01-mcp-2026-07-28-spec-impact.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/spikes/2026-08-14-video-model-capability-matrix.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/spikes/2026-08-15-picker-tile-alt-text.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/docs/superpowers/spikes/2026-08-31-veo-extend-route-recon.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/eval/pr_triage_eval.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/eval/pr_triage_fixtures.json +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/examples/README.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/examples/batch_from_config.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/examples/multi_prompt_t2i.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/examples/sample_config.json +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/examples/sample_prompts.txt +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/examples/single_image_t2i.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/examples/workflow_chain.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/index.html +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/llms.txt +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/samples/README.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/samples/captured/01_upload_image.json +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/samples/captured/04_archive_workflow.json +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/samples/captured/05_createProject.json +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/samples/captured/06_batchGenerateImages.json +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/samples/captured/12_create_scene.json +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/samples/captured/13_sceneWorkflows_update.json +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/samples/captured/14_get_scene_workflows.json +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/samples/captured/15_commit_flowWorkflow.json +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/autopilot/Dockerfile.triage +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/autopilot/entrypoint.sh +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/autopilot/package-lock.json +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/autopilot/package.json +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/autopilot/pr_triage_autopilot.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/autopilot/pr_triage_gate.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/autopilot/run_sandboxed_review.sh +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/canary/register_task.ps1 +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/canary/run_canary.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/ci/check_doc_links.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/ci/check_materiality.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/ci/check_release_artifacts.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/ci/check_repo_hygiene.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/ci/check_test_count.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/ci/check_website_docs_pii.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/ci/generate_website_docs.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/debug_editor.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/debug_gen_settings.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/debug_settings.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/_recording_client.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/_spike_common.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/active_plan.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/capture_frames_mode_trigger_ligature.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/capture_image_add_media_dom.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/capture_locale_invariants.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/capture_lower_priority_model_cost.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/capture_project_listing.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/capture_r2v_ingredient_lifecycle.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/capture_sidebar_state_dom.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/capture_video_model_capability_matrix.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/cdp_drive_and_probe.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/character_create_spike.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/character_create_spike_v2.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/dump_character_selectors.js +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/incident_bundle_quality.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/live_verify_mcp_tasks.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/live_verify_policy_400_v060.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/live_verify_video_model_select.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/make_project.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/materiality_backtest.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/measure_locale_probe.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/patch_character.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/skillopt/README.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/skillopt/harness.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/skillopt/tasks.json +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/sonar-local-scan.sh +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/sonar-pre-push-gate.sh +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/spike_changelog_capture.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/spike_char_editor_dom.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/spike_char_gen_capture.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/spike_character_prompt_format.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/spike_extend_model_recon.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/spike_extend_ourstack_verify.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/spike_extend_route_capture.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/spike_extend_submit_capture.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/spike_extend_ui_recon.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/spike_image_upscale_capture.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/spike_image_upscale_drive.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/spike_incident_live.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/spike_issue313_agent_mode_controls.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/spike_issue314_picker_filename_search.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/spike_issue404_count_tabs_recon.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/spike_locale_poison.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/spike_mode_roundtrip.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/spike_mode_switch_agentic_to_classic.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/spike_model_inventory.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/spike_movie_attach_payload.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/spike_movie_entity_recon.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/spike_movie_gen_capture.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/spike_movie_picker_select.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/spike_movie_voice_list.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/spike_omni_flash_i2v_ui_recon.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/spike_patch_entity.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/spike_patchright.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/spike_trpc_origin_referer_401.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/spike_video_tab_dom.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/verify_language_agnostic.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/verify_locale_navigation_race.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/dev/verify_model_attribution.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/diag/README.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/diag/capture_flow_traffic.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/diag/diag_aisandbox_bearer.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/diag/memory_profile.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/diag/recaptcha_mint.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/diag/spike_387_openai_compat.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/e2e/capture_agent_toggle.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/probe/run_probe.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/probe/spike_auth_matrix.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/record_demo.ps1 +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/smoke_image.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/smoke_video_editor.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/smoke_worker_style.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/spike_waf_camoufox.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/scripts/verify_chrome_auth_viability.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/skills/README.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/skills/changelog/SKILL.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/skills/check/SKILL.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/skills/doc-review/SKILL.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/skills/gflow-cli/SKILL.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/skills/issue-assessment/SKILL.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/skills/issue-resolve/SKILL.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/skills/known-issues/SKILL.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/skills/live-verify/SKILL.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/skills/llm-council/SKILL.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/skills/plan/SKILL.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/skills/pr-council-review/SKILL.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/skills/predict/SKILL.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/skills/release/SKILL.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/skills/scenario/SKILL.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/skills/sonar/SKILL.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/skills/status/SKILL.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/sonar-project.properties +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/__main__.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/_cli_helpers.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/api/__init__.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/api/_engine.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/api/_retry.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/api/_sapisidhash.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/api/character.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/api/dto.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/api/extend_chain.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/api/image.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/api/image_upscale.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/api/recaptcha.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/api/routes.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/api/scene.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/api/transports/__init__.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/api/transports/base.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/api/transports/drivers/agentic.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/api/transports/drivers/base.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/api/transports/drivers/classic.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/api/transports/ui_automation.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/api/video.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/api/video_extend.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/auth/__init__.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/auth/base.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/auth/cookies.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/auth/factory.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/auth/internal_chromium.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/auth/real_chrome.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/auth/strategies.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/auth/verification.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/browser_manager.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/chain.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/chain_manifest.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/cli.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/cli_character.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/cli_data.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/cli_doctor.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/cli_image.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/cli_instructions.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/cli_models.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/cli_movie.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/cli_project.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/cli_run.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/cli_scene.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/cli_tools.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/cli_video.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/composition.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/config.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/data/__init__.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/data/chain_repo.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/data/migrations/0007_queue.sql +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/data/migrations/0008_add_operation_expanded_prompt.sql +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/data/migrations/0009_queue_claims.sql +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/data/migrations/__init__.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/data/models.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/data/queries.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/data/recorder.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/data/redaction.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/data/repository.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/data/store.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/diagnostics.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/errors.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/exceptions.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/file_integrity.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/flow_selectors/__init__.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/flow_selectors/grading.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/flow_selectors/model.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/flow_selectors/registry.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/image_batch.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/json_output.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/mcp/__init__.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/mcp/prompts.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/mcp/resources.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/mcp/server.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/mcp/setup.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/mcp/tasks_extension.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/mcp/tools.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/media.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/movie_manifest.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/observability.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/paths.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/profile_lease.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/redaction.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/services/__init__.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/services/catalog_sync.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/services/character_create.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/services/doctor.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/services/mentions.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/storage.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/tools/__init__.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/tools/banned.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/tools/builtin/__init__.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/tools/builtin/creative-director.toml +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/tools/builtin/reverse-engineer.toml +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/tools/builtin/storyboard.toml +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/tools/expander.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/tools/invocation.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/tools/loader.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/tools/registry.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/tools/runtime.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/tools/spec.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/ui/app.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/ui/server.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/update_check.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/winsec.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/worker/codec.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/worker/daemon.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/src/gflow_cli/worker/queue.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tasks/lessons.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/test_assets/sample_batch.json +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/test_assets/sample_batch.tsv +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/test_assets/sample_batch_invalid.tsv +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/__init__.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/__init__.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/fixtures/character_gen_response.json +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/fixtures/patch_entity_response.json +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/fixtures/project_initial_data_extend_models.json +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_aisandbox_auth_error.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_aisandbox_auth_headers.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_bearer_redaction.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_character.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_client.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_client_character.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_client_delete_characters.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_client_errors.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_client_extend.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_client_generate_character.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_client_image.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_client_incidents.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_client_launch_kwargs.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_client_patch_entity.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_client_scene.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_client_upscale.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_concurrency.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_dto.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_engine.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_extend_chain.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_image.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_image_dto.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_image_upscale.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_post_json_aisandbox_auth.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_recaptcha.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_retry.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_routes.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_routes_character.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_routes_scene.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_sapisidhash_helper.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_scene_models.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_video.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_video_extend.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_video_request.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/test_video_status_poll.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/transports/__init__.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/transports/conftest.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/transports/drivers/test_agentic.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/transports/drivers/test_classic.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/transports/drivers/test_factory.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/transports/drivers/test_ui_mode.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/transports/test_agentic_cohort_detection.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/transports/test_base.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/transports/test_bearer.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/transports/test_common.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/transports/test_evaluate_fetch.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/transports/test_factory.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/transports/test_fingerprint.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/transports/test_locale_navigation.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/transports/test_mode_control.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/transports/test_model_selection_loud.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/transports/test_navigation_settled.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/transports/test_overlay_precondition.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/transports/test_policy_400.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/transports/test_sapisidhash.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/transports/test_selector_symmetry.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/transports/test_transport_timeout.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/transports/test_ui_automation.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/transports/test_ui_automation_batch.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/transports/test_ui_automation_video.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/transports/test_ui_character_editor.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/api/transports/test_video_model_selection_loud.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/auth/strategies/test_factory.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/auth/strategies/test_strategies.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/auth/test_cookies.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/auth/test_real_chrome.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/auth/test_verification.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/auth/test_windows_acl.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/autopilot/test_pr_triage_autopilot.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/cli/__init__.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/cli/test_auth_status.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/cli/test_cli_auth_list.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/cli/test_cli_character.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/cli/test_cli_character_create.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/cli/test_cli_data.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/cli/test_cli_data_errors.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/cli/test_cli_data_errors_retention.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/cli/test_cli_data_sync.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/cli/test_cli_doctor.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/cli/test_cli_image.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/cli/test_cli_image_seed_removed.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/cli/test_cli_image_selector_drift.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/cli/test_cli_image_upscale.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/cli/test_cli_image_uuid_ref_enrichment.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/cli/test_cli_instructions.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/cli/test_cli_models.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/cli/test_cli_movie.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/cli/test_cli_run.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/cli/test_cli_scene.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/cli/test_cli_tools.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/cli/test_cli_video.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/cli/test_cli_video_chain.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/cli/test_cli_video_extend.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/cli/test_error_handling.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/cli/test_failure_funnel.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/cli/test_helpers.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/cli/test_incident_output.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/cli/test_movie_manifest.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/cli/test_movie_manifest_style_variants.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/cli/test_predictable_output.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/cli/test_run_with_handlers_interrupt.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/cli/test_settings_validation.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/cli/test_t2i_multi_prompt.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/composition/test_character.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/composition/test_compose_prompt.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/composition/test_handoff.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/composition/test_style_variants.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/composition/test_style_variants_e2e.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/conftest.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/data/__init__.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/data/test_chain_repo.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/data/test_failure_recording.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/data/test_find_incomplete_character.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/data/test_models.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/data/test_null_columns_stay_null.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/data/test_packaging.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/data/test_recorder.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/data/test_recorder_character.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/data/test_redaction.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/data/test_repository.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/data/test_scene_persistence.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/data/test_settings_and_errors.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/data/test_store.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/data/test_store_migrations.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/dev/test_recording_client.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/e2e/__init__.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/e2e/conftest.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/e2e/test_agentic_count_enforcement_e2e.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/e2e/test_aisandbox_auth_live.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/e2e/test_asset_tagging_e2e.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/e2e/test_auth_verification_e2e.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/e2e/test_cancellation_e2e.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/e2e/test_chain_e2e.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/e2e/test_character_create_e2e.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/e2e/test_classic_count_setter_e2e.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/e2e/test_crash_recovery_e2e.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/e2e/test_daemon_e2e.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/e2e/test_data_layer_e2e.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/e2e/test_data_sync_names_e2e.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/e2e/test_entity_provenance_e2e.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/e2e/test_entity_smuggling_e2e.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/e2e/test_i2v_flags_e2e.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/e2e/test_image_batch_e2e.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/e2e/test_image_uuid_ref_e2e.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/e2e/test_incident_quality_e2e.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/e2e/test_json_output_e2e.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/e2e/test_live_agentic_instructions.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/e2e/test_locale_selectors_e2e.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/e2e/test_project_naming_e2e.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/e2e/test_refresh_on_miss_e2e.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/e2e/test_scene_compose_live.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/e2e/test_sidebar_recovery_e2e.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/e2e/test_tools_e2e.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/e2e/test_transports_e2e.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/e2e/test_video_r2v_uuid_name_e2e.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/e2e/test_video_t2v_e2e.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/__init__.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/asset_tagging.feature +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/auth.feature +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/auth_login.feature +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/character_create.feature +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/character_read.feature +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/conftest.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/duration_tab_drift.feature +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/entity_provenance.feature +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/image.feature +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/image_batch_references.feature +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/image_upscale.feature +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/incident_diagnostics.feature +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/instructions.feature +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/locale_picker_include.feature +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/mcp_tasks.feature +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/media_picker_tiers.feature +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/output_hardening.feature +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/test_asset_tagging_steps.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/test_auth_login_steps.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/test_auth_steps.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/test_character_create_steps.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/test_character_read_steps.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/test_image_steps.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/test_image_upscale_steps.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/test_incident_diagnostics_steps.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/test_instructions_steps.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/test_locale_picker_include_steps.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/test_mcp_tasks_steps.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/test_media_picker_tiers_steps.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/test_output_hardening_steps.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/test_step_collision_guard.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/test_video_agent_ui_steps.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/test_video_chain_steps.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/video_agent_ui.feature +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/features/video_chain.feature +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/fixtures/__init__.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/fixtures/changelog_modal_page.html +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/fixtures/doctor_env.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/fixtures/flow_model_inventory.json +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/fixtures/flow_project_listing_media.json +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/fixtures/listing_payload.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/fixtures/seeded_catalog.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/flow_selectors/__init__.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/flow_selectors/test_grading.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/flow_selectors/test_model.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/flow_selectors/test_model_governance.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/flow_selectors/test_registry.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/flow_selectors/test_report.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/image_batch/__init__.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/image_batch/test_image_manifest.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/image_batch/test_jitter_config.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/image_batch/test_observability_events.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/integration/__init__.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/integration/conftest.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/integration/constants.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/integration/test_expander_gateway.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/integration/test_storage_gcs.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/integration/test_storage_s3.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/mcp/__init__.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/mcp/conftest.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/mcp/test_auth_status_tool.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/mcp/test_cli_parity.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/mcp/test_error_funnel.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/mcp/test_http_transport.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/mcp/test_known_issues_resource.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/mcp/test_no_spend.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/mcp/test_rate_limit_envelope.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/mcp/test_resources.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/mcp/test_server.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/mcp/test_setup.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/mcp/test_stdio_transport.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/mcp/test_tasks_extension.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/mcp/test_tools_helpers.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/mcp/test_tools_instructions.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/mcp/test_tools_wired.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/scripts/test_canary_classify.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/scripts/test_canary_reexec.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/scripts/test_capture_locale_invariants.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/scripts/test_check_materiality.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/scripts/test_check_release_artifacts.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/scripts/test_check_repo_hygiene.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/scripts/test_check_test_count.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/scripts/test_check_website_docs_pii.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/scripts/test_codex_plugin.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/scripts/test_generate_website_docs.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/scripts/test_incident_bundle_quality.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/scripts/test_materiality_backtest.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/scripts/test_workflow_hardening.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/services/__init__.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/services/test_catalog_sync.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/services/test_character_create_redaction.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/services/test_character_create_saga.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/services/test_character_gen_no_direct_post.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/services/test_doctor.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/services/test_media_attribution.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/services/test_mentions_observability.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/services/test_mentions_parse.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/services/test_mentions_resolve.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/services/test_resolve_and_apply.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/smoke/__init__.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/smoke/test_profile_account_smoke.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/smoke/test_real_flow.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_auth.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_browser_manager.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_chain.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_chain_manifest.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_cli_data.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_cli_project.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_config.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_conftest_isolation.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_data_queries.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_diagnostics_bundle.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_diagnostics_events.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_diagnostics_journal.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_diagnostics_recorder.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_diagnostics_retention.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_diagnostics_sanitize.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_documentation_gate.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_duration_tab_drift.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_entity_provenance.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_errors.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_errors_classification.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_image_batch_references.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_incident_generation_requests.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_json_output.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_marker_registry.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_media.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_observability.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_overlay_banner_dismissal.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_paths.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_playwright_pin.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_profile_lease.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_profile_lease_subprocess.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_profile_store.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_profile_store_locale.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_project_list_urls.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_self_documenting_errors.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_smoke.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/test_update_check.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/tools/__init__.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/tools/test_banned.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/tools/test_expander.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/tools/test_invocation.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/tools/test_loader.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/tools/test_registry.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/tools/test_runtime.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/tools/test_spec.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/ui/test_app.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/worker/test_codec.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/worker/test_mcp_daemon_race.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/worker/test_queue.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/worker/test_queue_multiprocess.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/tests/worker/test_queue_reconciliation.py +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/website/docs/ACCOUNT_SAFETY.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/website/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/website/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/website/docs/CHARACTER.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/website/docs/CONFIGURATION.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/website/docs/DATA_LAYER.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/website/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/website/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/website/docs/E2E_TESTING.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/website/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/website/docs/INSTRUCTIONS.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/website/docs/MEDIA_LIBRARY.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/website/docs/MOVIE.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/website/docs/PROMPT_EXPANSION.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/website/docs/SECURITY.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/website/docs/TOOLS.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/website/docs/USAGE.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/website/docs/USER_GUIDE.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/website/docs/agents.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/website/docs/index.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/website/docs/installation.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/website/docs/onboarding-mockup.html +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/website/docs/onboarding.md +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/website/docs/stylesheets/extra.css +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/website/mkdocs.yml +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/website/requirements.in +0 -0
- {gflow_cli-0.66.1 → gflow_cli-0.66.2}/website/requirements.txt +0 -0
|
@@ -7,6 +7,53 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.66.2] — 2026-09-03
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- **v0.66.1's migrated-origin fast-fail never fired on a real run
|
|
15
|
+
([#639](https://github.com/ffroliva/gflow-cli/issues/639)).** The guard read `page.url` once,
|
|
16
|
+
at `get_ui_driver` entry — but `routes.project_editor_url` only ever builds a `labs.google`
|
|
17
|
+
URL and the hop to `flow.google.com` is a *post-`goto`* redirect that neither settle path
|
|
18
|
+
waits for (no locale → `_settle_if_redirecting` returns immediately; a known locale →
|
|
19
|
+
`await_url_settled` short-circuits because the labs URL already matches the localised shape).
|
|
20
|
+
So the guard classified a pre-redirect URL, declined, and the run paid ~54 s before failing
|
|
21
|
+
anyway through the slow selector-probe path. Measured by the reporter on three consecutive
|
|
22
|
+
v0.66.1 runs: **57.0 / 57.1 / 58.3 s**, with `ui_driver.migrated_host_bail` absent from the
|
|
23
|
+
timeline entirely. The host check is now a shared `raise_if_migrated` helper called at the
|
|
24
|
+
three points the run is *about to spend time* — `get_ui_driver` entry, each `detect_ui_mode`
|
|
25
|
+
poll tick, and `_exit_agent_mode` once the media panel is found absent — so it adds no wait
|
|
26
|
+
and no navigation to the old host, and aborts as soon as the redirect is observable. The
|
|
27
|
+
event now names its call site, so the fast path is visible in a field timeline instead of
|
|
28
|
+
inferred. Two blanket `except Exception` handlers that would have demoted the abort to a
|
|
29
|
+
warning now re-raise it.
|
|
30
|
+
|
|
31
|
+
- **A `NOT_REDIRECTED` locale cache was an absorbing state, which made the #643 `<html lang>`
|
|
32
|
+
recovery unreachable on exactly the profiles that needed it
|
|
33
|
+
([#643](https://github.com/ffroliva/gflow-cli/issues/643)).** `_bootstrap_and_resolve_locale`
|
|
34
|
+
returned *before* `_resolve_account_locale` — the only site of that recovery and the only
|
|
35
|
+
caller of `next_locale_state` — so nothing could ever move a latched profile off the state.
|
|
36
|
+
Every profile that saw two migrated loads on ≤0.66.0 latched this way. `NOT_REDIRECTED` now
|
|
37
|
+
skips the settle only, and still reads the locale: measured 56/56 on a latched profile whose
|
|
38
|
+
page declares `lang="en"` on every load. The 4 s settle stays skipped — deleting the early
|
|
39
|
+
return outright was rejected, because on that account the cached "not redirected" is a true
|
|
40
|
+
observation.
|
|
41
|
+
|
|
42
|
+
- **A `<html lang>` locale was treated as evidence that Flow redirects the account, which
|
|
43
|
+
switched the URL settle back on permanently ([#643](https://github.com/ffroliva/gflow-cli/issues/643)).**
|
|
44
|
+
Shipped in v0.66.1 and present on `develop`: #643's `<html lang>` fallback returns a segment for
|
|
45
|
+
an account Flow serves **bare** and never redirects, and `next_locale_state` recorded it as the
|
|
46
|
+
cached state. Every later bootstrap then saw `cached != NOT_REDIRECTED`, settled, and burned the
|
|
47
|
+
full 4 s `URL_SETTLE_TIMEOUT_MS` waiting for a redirect that never comes — the exact cost #587
|
|
48
|
+
exists to remove, on any non-redirecting account with a `lang` attribute. Only a **URL-derived**
|
|
49
|
+
segment is now folded into that cache; the lang-derived one is used in-process to build URLs and
|
|
50
|
+
never persisted. Measured on a real profile: warm bootstrap **7.41 s → 2.66 s**, with the locale
|
|
51
|
+
still recovered.
|
|
52
|
+
|
|
53
|
+
- **`docs/MCP.md`'s retryable-class list was incomplete**, which would have told an MCP agent not
|
|
54
|
+
to auto-retry failures the envelope marks `retryable: true`. It omitted `FlowHostMigratedError`,
|
|
55
|
+
`UiModeUnavailableError` and `SyncPartialError`; it now matches `errors.RETRYABLE_ERRORS`.
|
|
56
|
+
|
|
10
57
|
## [0.66.1] — 2026-09-03
|
|
11
58
|
|
|
12
59
|
### Fixed
|
|
@@ -3737,7 +3784,8 @@ shell-script template that branches on these codes.
|
|
|
3737
3784
|
|
|
3738
3785
|
First skeleton. Not functional end-to-end yet.
|
|
3739
3786
|
|
|
3740
|
-
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.66.
|
|
3787
|
+
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.66.2...HEAD
|
|
3788
|
+
[0.66.2]: https://github.com/ffroliva/gflow-cli/compare/v0.66.1...v0.66.2
|
|
3741
3789
|
[0.66.1]: https://github.com/ffroliva/gflow-cli/compare/v0.66.0...v0.66.1
|
|
3742
3790
|
[0.66.0]: https://github.com/ffroliva/gflow-cli/compare/v0.65.0...v0.66.0
|
|
3743
3791
|
[0.65.0]: https://github.com/ffroliva/gflow-cli/compare/v0.64.0...v0.65.0
|
|
@@ -50,7 +50,7 @@ callers get this for free: the failure is `FlowHostMigratedError` (exit 36) with
|
|
|
50
50
|
`retryable: true`, so retry loops driven by the `--json` / MCP / worker error
|
|
51
51
|
envelope will keep trying.
|
|
52
52
|
|
|
53
|
-
**What gflow does today (v0.66.
|
|
53
|
+
**What gflow does today (v0.66.2):** recognises the migrated origin and fails
|
|
54
54
|
with the distinct, retryable exit 36 instead of the misleading
|
|
55
55
|
`UiSelectorDriftError` (exit 23, "file a selector bug"). `_check_logged_in` also
|
|
56
56
|
accepts the migrated host, so a migrated load is no longer misread as a
|
|
@@ -58,6 +58,18 @@ logged-out session. **Support for driving the new frontend is separate work and
|
|
|
58
58
|
is not implemented** — once the rollout completes for an account, no retry will
|
|
59
59
|
help until then.
|
|
60
60
|
|
|
61
|
+
> **v0.66.1's fast-fail did not fire in the field, and v0.66.2 is the correction.**
|
|
62
|
+
> The guard read `page.url` once, at `get_ui_driver` entry — before the hop to
|
|
63
|
+
> `flow.google.com` had landed, because `project_editor_url` only builds
|
|
64
|
+
> `labs.google` URLs and the redirect arrives *after* `page.goto` returns.
|
|
65
|
+
> Measured by the reporter on three consecutive v0.66.1 runs: exit 36 at **57.0 /
|
|
66
|
+
> 57.1 / 58.3 s**, through the slow selector-probe path. v0.66.2 re-checks the host
|
|
67
|
+
> at the points the run already blocks, so the abort costs the old host nothing and
|
|
68
|
+
> lands as soon as the redirect is observable. The same release stops a
|
|
69
|
+
> `NOT_REDIRECTED` locale cache from disabling the `<html lang>` recovery (#643),
|
|
70
|
+
> which had made that state unrecoverable on exactly the profiles it was written
|
|
71
|
+
> for.
|
|
72
|
+
|
|
61
73
|
---
|
|
62
74
|
|
|
63
75
|
### A Veo extend segment is 7 seconds, not the 8 Flow advertises — so concat pads a frozen second
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: gflow-cli
|
|
3
|
-
Version: 0.66.
|
|
3
|
+
Version: 0.66.2
|
|
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
|
|
@@ -162,6 +162,8 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
|
|
|
162
162
|
|
|
163
163
|
**"What was live-verified for v0.66.0?"** → [LIVE_VERIFICATION_v0.66.0](LIVE_VERIFICATION_v0.66.0.md) — **#639 Flow's `flow.google.com` migration, verified 2026-09-03 on profile `ffroliva` at ZERO credits.** The maintainer's own account turned out to be inside the rollout, so the fix was proven against the real migrated frontend rather than a reconstructed DOM: a read-only probe of `flow.google.com/project/<id>` measured `i_total: 0` (independently reproducing the reporter's central measurement) and drove the production functions against the live page — `flow_host_kind: "migrated"`, `_check_logged_in: true` (it was `false` before the fix, i.e. a valid session read as logged-out), and `_mode_switch_error` returning `FlowHostMigratedError` / exit 36 / `retryable: true`. The flap is confirmed on ONE account: a credit-free `image t2i` minutes earlier landed on the OLD host and completed exit 0 with a real 768x1376 JPEG (`ffd8ffe0`, 401,939 bytes, Pillow dims matching the API claim), proving the rewritten host gate does not regress the old path. Also recorded: the migrated URL **drops `/fx/tools/flow` entirely** — it is `/project/<id>` — which is why a substring gate on `labs.google` could never match it; and the migrated composer is not control-less but exposes **no `data-testid`, zero ligature `<i>`, and 13 `button[aria-label]`** (`Settings trigger`, `Start generation`, …), recorded as recon for the follow-up WITH the caveat that `aria-label` is translated and therefore Tier-2 at best under the locale-invariance rule. One item is recorded as NOT verified rather than omitted: gflow **driving** the migrated frontend, which is out of scope and keeps #639 open. Verification also hit pre-existing [#561](https://github.com/ffroliva/gflow-cli/issues/561) (401 on `project.createProject`), A/B'd against unmodified `develop` to prove it was not this change, then routed around with an existing `--project`.
|
|
164
164
|
|
|
165
|
+
**"What was live-verified for v0.66.2?"** → [LIVE_VERIFICATION_v0.66.2](LIVE_VERIFICATION_v0.66.2.md) — the old host proven live at zero credits (**exit 0**, real 768x1376 JPEG, twice), the locale cache measured **7.41 s → 2.66 s**, and the migrated path recorded as **NOT verified** because the rollout flapped back (72/72 navigations landed on `labs.google`). No time-to-exit-36 is claimed — this release exists because v0.66.1 reported one from the wrong entrypoint, so see also the correction block atop [LIVE_VERIFICATION_v0.66.1](LIVE_VERIFICATION_v0.66.1.md).
|
|
166
|
+
|
|
165
167
|
**"What was live-verified for v0.65.0?"** → [LIVE_VERIFICATION_v0.65.0](LIVE_VERIFICATION_v0.65.0.md) — the guard A/B (three runs, zero credits, control included); the `chain`/`movie` duration guards are validation that refuses **before** any transport call, so they are covered by a red state that reproduces the mid-spend crash in a test plus negative controls, and the reason they were not live-run is recorded rather than omitted.
|
|
166
168
|
|
|
167
169
|
**"Does the `referenceEntity` guard actually run, and is it a Web Worker or a Service Worker?"** → [LIVE_VERIFICATION_reference_entity_guard](LIVE_VERIFICATION_reference_entity_guard.md) — **A/B-proven live on denon82 2026-09-02, zero credits.** Control (without #618): the guard never fired and the test failed; with #618: it fired and passed. Same account, same prompt, one variable. Settles the question that held #618 — it is a **dedicated Web Worker**, so `context.route` suffices and no `service_workers="block"` is needed. Also confirms `route.continue_(post_data=...)` does not corrupt the body (both runs produced a real image). The **video** glob was equally dead, which #615 never mentions. Residual: direct-wire routes still bypass structurally (#619).
|
|
@@ -3,6 +3,34 @@
|
|
|
3
3
|
**Date:** 2026-09-03 · **Account:** ffroliva@gmail.com · **Platform:** Windows 11, Chrome strategy
|
|
4
4
|
**Credits spent:** **0** — one Imagen image (images are credit-free) plus read-only probes.
|
|
5
5
|
|
|
6
|
+
> ## ⚠️ Correction (2026-09-03, same day) — Layer 1's latency numbers are not user-visible
|
|
7
|
+
>
|
|
8
|
+
> **Layer 1 below measured `get_ui_driver` in isolation, on a page already sitting on
|
|
9
|
+
> `flow.google.com`.** That precondition never holds on a real run: `project_editor_url`
|
|
10
|
+
> only ever builds a `labs.google` URL and the hop to the migrated origin is a
|
|
11
|
+
> *post-`goto`* redirect that neither settle path waits for, so on the CLI route the guard
|
|
12
|
+
> read a pre-redirect URL and declined.
|
|
13
|
+
>
|
|
14
|
+
> The reporter of #639 measured the real path on three consecutive v0.66.1 runs: **57.0 /
|
|
15
|
+
> 57.1 / 58.3 s**, terminating through `ui_automation_video.selector_probe_failed` — the
|
|
16
|
+
> slow path — with `ui_driver.migrated_host_bail` **absent from the timeline entirely**.
|
|
17
|
+
>
|
|
18
|
+
> So of the rows below: `"get_ui_driver": {"ms": 0}` and **`time to exit 36 — 0 ms` are
|
|
19
|
+
> true of the isolated probe and false of every CLI run.** The claim
|
|
20
|
+
> *"`ui_driver.migrated_host_bail` is logged, so the fast path is observable rather than
|
|
21
|
+
> inferred"* is the one the field timeline falsified — the event was never emitted, and
|
|
22
|
+
> nothing here noticed because the isolated probe emitted it.
|
|
23
|
+
>
|
|
24
|
+
> The same gap hid the locale fix: `client.py` returned before `_resolve_account_locale`
|
|
25
|
+
> on a `NOT_REDIRECTED` cache, so the `<html lang>` recovery Layer 1 exercised **directly**
|
|
26
|
+
> is unreachable through the client on exactly the profiles that need it. `profile_ffroliva`
|
|
27
|
+
> is latched that way today.
|
|
28
|
+
>
|
|
29
|
+
> Both are fixed for v0.66.2 — see [LIVE_VERIFICATION_v0.66.2](LIVE_VERIFICATION_v0.66.2.md).
|
|
30
|
+
> **Layer 2 (no regression on the old host) stands unchanged and is still the load-bearing
|
|
31
|
+
> result here.** The lesson is recorded rather than the numbers quietly edited: a function
|
|
32
|
+
> measured in isolation is not a verification of the path users take.
|
|
33
|
+
|
|
6
34
|
## What had to be proven
|
|
7
35
|
|
|
8
36
|
Two fixes, both on the migrated-origin path, and both verifiable live because the account is
|
|
@@ -31,10 +59,13 @@ Plus the property that matters more than either: **the old host still works.**
|
|
|
31
59
|
| `detect_ui_mode` poll window | ~8 s | skipped |
|
|
32
60
|
| crop selector cascade | ~24 s | skipped |
|
|
33
61
|
| `await_url_settled` | 4018 ms | **0 ms** |
|
|
34
|
-
| **time to exit 36** |
|
|
62
|
+
| **time to exit 36** (isolated probe) | ~36 s | **0 ms** |
|
|
63
|
+
| **time to exit 36** (real CLI run) | ~57 s | **~57 s — UNCHANGED, see the correction above** |
|
|
35
64
|
| locale on migrated origin | `null` (and demoted a learned locale) | **`en`** recovered from `<html lang>` |
|
|
36
65
|
|
|
37
|
-
|
|
66
|
+
~~`ui_driver.migrated_host_bail` is logged, so the fast path is observable rather than inferred.~~
|
|
67
|
+
**Retracted.** It is logged by the isolated probe and by nothing on the CLI route — the field
|
|
68
|
+
timeline has no such event. Observability of a path you did not exercise is not observability.
|
|
38
69
|
|
|
39
70
|
## Layer 2 — no regression on the old host (full generation, exit 0)
|
|
40
71
|
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
# Live Verification — v0.66.2 (the migrated-host gate actually fires; the locale cache stops lying)
|
|
2
|
+
|
|
3
|
+
**Date:** 2026-09-03 · **Account:** ffroliva@gmail.com · **Platform:** Windows 11, Chrome strategy
|
|
4
|
+
**Credits spent:** **0** — two Imagen images (images are credit-free) plus 72 read-only navigations.
|
|
5
|
+
|
|
6
|
+
## What had to be proven, and the honest constraint
|
|
7
|
+
|
|
8
|
+
This release fixes defects that v0.66.1's *own* verification missed, so the bar for it is higher
|
|
9
|
+
than usual: **v0.66.1 measured `get_ui_driver` in isolation on an already-migrated page and
|
|
10
|
+
reported `0 ms`, which was true of the probe and false of every CLI run.** See the correction at
|
|
11
|
+
the top of [LIVE_VERIFICATION_v0.66.1](LIVE_VERIFICATION_v0.66.1.md).
|
|
12
|
+
|
|
13
|
+
**The constraint this time is the inverse of last time.** Google's rollout flapped *back* on both
|
|
14
|
+
maintainer accounts during this work:
|
|
15
|
+
|
|
16
|
+
| profile | navigations | landed migrated | landed old host |
|
|
17
|
+
|---|---|---|---|
|
|
18
|
+
| `ffroliva` | 60 | **0** | 60 |
|
|
19
|
+
| `denon82` | 12 | **0** | 12 |
|
|
20
|
+
|
|
21
|
+
Measured with `scripts/dev/measure_migrated_host_flip.py` across three sweeps on `ffroliva` and
|
|
22
|
+
one on `denon82`, over ~2 hours (the raw per-navigation record is in the `scripts/dev/_spike_out/` JSON the
|
|
23
|
+
instrument writes; the planning artifacts were consolidated at release per the repo's
|
|
24
|
+
spec-to-memory convention).
|
|
25
|
+
|
|
26
|
+
So **the migrated path was not reachable from this machine and is NOT live-verified here.** It is
|
|
27
|
+
unit-tested and A/B-controlled only. That is stated in the NOT-verified section below rather than
|
|
28
|
+
folded into the green column — which is precisely the mistake being corrected.
|
|
29
|
+
|
|
30
|
+
What *is* live-verifiable is the property that matters most today: **the old host, which 100% of
|
|
31
|
+
real loads currently take, is unaffected** — and the locale behaviour, which is fully exercisable.
|
|
32
|
+
|
|
33
|
+
## Layer 1 — the locale cache stops conflating two different questions
|
|
34
|
+
|
|
35
|
+
`profile_ffroliva/.gflow_locale` was **empty** — `NOT_REDIRECTED` — before the run. Under v0.66.1
|
|
36
|
+
that state returned before `_resolve_account_locale`, so the `<html lang>` recovery #643 shipped
|
|
37
|
+
could never run on it.
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
cache before: '' (NOT_REDIRECTED)
|
|
41
|
+
client.account_locale_resolved locale=en source=html_lang
|
|
42
|
+
client.account_locale_cached locale=en settle_skipped=true
|
|
43
|
+
cache after: '' (NOT_REDIRECTED — unchanged)
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Three things at once, all measured:
|
|
47
|
+
|
|
48
|
+
1. **The locale is recovered from the document**, not the URL — `source=html_lang`. The latch no
|
|
49
|
+
longer blocks it.
|
|
50
|
+
2. **The settle stays skipped** (`settle_skipped=true`). The #587 win is intact — which is why
|
|
51
|
+
deleting the early return outright was rejected: on this account "not redirected" is a *true*
|
|
52
|
+
observation, confirmed 60/60.
|
|
53
|
+
3. **The cached state is unchanged.** This is the correction the council forced (see below): the
|
|
54
|
+
cache answers *"does Flow redirect this account?"*, and a `<html lang>` attribute is no
|
|
55
|
+
evidence of a redirect — every account has one.
|
|
56
|
+
|
|
57
|
+
### The regression the council caught, and the measurement that proved it
|
|
58
|
+
|
|
59
|
+
The first cut of this fix folded the recovered locale into the cache. Two independent reviewers
|
|
60
|
+
(D1 correctness, D4 tests) flagged it; `scripts/dev/measure_locale_probe.py` then reproduced it
|
|
61
|
+
without being asked:
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
BEFORE: ffroliva warm 7.41s cached 'en' !! warm arm slower than cold — investigate
|
|
65
|
+
transport.url_settle_gave_up timeout_ms=4000.0 (x2)
|
|
66
|
+
|
|
67
|
+
AFTER: ffroliva cold 6.99s cached '?'
|
|
68
|
+
ffroliva warm 2.66s cached '' settle off, locale still 'en'
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Writing the locale in flipped `cached != NOT_REDIRECTED`, which turned the settle back on
|
|
72
|
+
permanently and cost the full 4 s `URL_SETTLE_TIMEOUT_MS` on every future bootstrap — the exact
|
|
73
|
+
cost #587 exists to remove.
|
|
74
|
+
|
|
75
|
+
**Tracing it found a live defect in v0.66.1 itself, present on `develop` today.** #643's
|
|
76
|
+
`<html lang>` fallback returns a segment for an account Flow serves *bare* and never redirects, and
|
|
77
|
+
`next_locale_state` recorded that as evidence of a redirect. So **any** non-redirecting account
|
|
78
|
+
with a `lang` attribute has been paying 4 s per bootstrap since v0.66.1 — no latch required. The
|
|
79
|
+
fix folds only the **URL-derived** segment into the state; the lang-derived one is used in-process
|
|
80
|
+
for URL building and never persisted.
|
|
81
|
+
|
|
82
|
+
## Layer 2 — the risk this fix introduces, exercised rather than assumed
|
|
83
|
+
|
|
84
|
+
Recovering the locale changes what gflow navigates to: this profile previously built the **bare**
|
|
85
|
+
`labs.google/fx/tools/flow/project/<id>` and now builds `/fx/en/tools/flow/project/<id>`. If `en`
|
|
86
|
+
were the wrong segment, every navigation would bounce.
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
ui_automation.entering_existing_project url=https://labs.google/fx/en/tools/flow/project/c5550ed7-…
|
|
90
|
+
ui_automation.url_stable_after_goto same URL, +549 ms, settle_skipped=false
|
|
91
|
+
ui_driver.ui_mode.attempt_exit_agent +507 ms
|
|
92
|
+
ui_driver.bound mode=classic
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
`url_stable_after_goto`, **not** `url_redirected_after_goto`: Flow accepted the segment and did
|
|
96
|
+
not bounce it. Confirmed on both live runs.
|
|
97
|
+
|
|
98
|
+
## Layer 3 — no regression on the old host: full generation, exit 0, twice
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
run 1 (pre-council-fix build) EXIT=0 768×1376 JPEG · 427.8 KB · ff d8 ff
|
|
102
|
+
run 2 (final build) EXIT=0 768×1376 JPEG · 413.5 KB · ff d8 ff
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Real images generated and written; `ui_driver.bound mode=classic` on both; no
|
|
106
|
+
`ui_driver.migrated_host_bail` event on either — correct, the host is `labs.google`.
|
|
107
|
+
|
|
108
|
+
**On wall-clock:** run 1 took 36.6 s and run 2 took 86 s, and **neither number is evidence about
|
|
109
|
+
this diff.** Run 2's extra time is Flow's own generation latency plus a 34.4 s
|
|
110
|
+
`browser_teardown.context_close_error` — a bounded Chrome-close timeout at `api/_engine.py:159`
|
|
111
|
+
that fires *after* all generation work, is already handled (warning → force close → exit 0), and
|
|
112
|
+
is untouched by this branch. A single-run timing delta sits well inside that variance, so the
|
|
113
|
+
"adds no wait" claim rests on the A/B control and on code shape (`page.url` is a cached property;
|
|
114
|
+
`flow_host_kind` is one `urlsplit` plus a dict lookup; `_media_panel_present` uses `.count()` and
|
|
115
|
+
does not wait) — **not** on the totals. Claiming "faster" from these runs would repeat exactly the
|
|
116
|
+
error this release corrects.
|
|
117
|
+
|
|
118
|
+
## Layer 4 — offline
|
|
119
|
+
|
|
120
|
+
- Tests written **red first**: 4 red for the locale latch, 4 red for the host gate, before any
|
|
121
|
+
production change.
|
|
122
|
+
- **A/B controls**, re-derived independently by a council reviewer with its own harness:
|
|
123
|
+
neutering `raise_if_migrated` fails **exactly 7** and **no** old-host test; restoring the
|
|
124
|
+
pre-#639 early return fails **exactly 5**. Nothing passes vacuously in either direction.
|
|
125
|
+
- The council's must-fix added two more tests that would have caught the regression it found:
|
|
126
|
+
a two-bootstrap cycle (one bootstrap cannot observe a cache flipping the settle back on), and
|
|
127
|
+
a lang-only-locale case pinning that a `lang` attribute is not evidence of a redirect.
|
|
128
|
+
- `ruff check` / `ruff format --check` clean on `src tests`; `pyright src` at the `develop`
|
|
129
|
+
baseline; repo hygiene, doc links, website-docs PII, and the `website/docs` mirror all green.
|
|
130
|
+
|
|
131
|
+
## Layer 5 — the MCP surface
|
|
132
|
+
|
|
133
|
+
No CLI leaf, option, or request-DTO field changed, so `tests/mcp/test_cli_parity.py` needs no new
|
|
134
|
+
mapping and `worker/codec.py` no new payload key — the fix is in the transport both surfaces
|
|
135
|
+
share (independently traced by the parity reviewer: `worker/daemon.py` and `mcp/tools.py` both
|
|
136
|
+
construct the same `FlowApiClient`). What *is* MCP-specific is the queue envelope, different code
|
|
137
|
+
from the CLI's `--json` path, carrying the flag the reporter's orchestrator actually reads:
|
|
138
|
+
|
|
139
|
+
```
|
|
140
|
+
queue error record: exit_code = 36, retryable = True
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Pinned by `tests/worker/test_daemon.py::test_migrated_host_error_crosses_the_queued_path`. Noted
|
|
144
|
+
honestly: that test pins the write side; the `wait=True` read-back in `mcp/tools.py` is generic
|
|
145
|
+
code exercised by its neighbours, so the round trip is pinned end-to-end only by construction.
|
|
146
|
+
|
|
147
|
+
`docs/MCP.md` listed the retryable classes by name and omitted three of them
|
|
148
|
+
(`FlowHostMigratedError`, `UiModeUnavailableError`, `SyncPartialError`); the list now matches
|
|
149
|
+
`errors.RETRYABLE_ERRORS` exactly, mirror regenerated.
|
|
150
|
+
|
|
151
|
+
Side effect: `mcp/tools.py` builds project editor links from `account_locale_for()`, which reads
|
|
152
|
+
the *cached* state. Because the lang-derived locale is deliberately not persisted, those links are
|
|
153
|
+
unchanged by this branch — the earlier claim that they become "account-correct" was wrong and is
|
|
154
|
+
retracted here rather than shipped.
|
|
155
|
+
|
|
156
|
+
## Recorded as NOT verified rather than omitted
|
|
157
|
+
|
|
158
|
+
- **The migrated path firing fast.** 72/72 navigations landed on the old host, so no migrated load
|
|
159
|
+
was available to time. The gate is proven by unit tests and A/B control, **not** by a live run.
|
|
160
|
+
The instrument is committed; the honest next step is a later flap or a run from the reporter's
|
|
161
|
+
permanently-migrated account.
|
|
162
|
+
- **The achieved time-to-exit-36 on a real migrated run.** Unmeasured, and deliberately not
|
|
163
|
+
estimated. The design does not depend on it — the guard sits where the run already blocks.
|
|
164
|
+
- **Driving the migrated frontend.** Still impossible. #639 stays open; this PR says `Refs`.
|
|
165
|
+
- **A non-English profile recovering live.** `denon82` is cached `"pt"` (it genuinely redirects),
|
|
166
|
+
so the lang-recovery path was exercised live only on `en`. The `pt` case is unit-tested.
|
|
167
|
+
- **The `en-GB` → `en` region reduction where region is load-bearing** (`zh-Hans`/`zh-Hant`).
|
|
168
|
+
Unchanged from v0.66.1, still only two locales observed.
|
|
169
|
+
- **Full-suite coverage %.** The targeted suites ran without `--cov` (an unscoped `pytest --cov`
|
|
170
|
+
OOMs this machine); the 80% floor is enforced by CI.
|
|
@@ -127,7 +127,13 @@ marks a transient failure a scheduler can re-run without operator intervention
|
|
|
127
127
|
WAF/reCAPTCHA bounce (`WafRejectionError`), rate-limit (`RateLimitError`),
|
|
128
128
|
transport timeout (`TransportTimeoutError`), network blip (`NetworkError`), a
|
|
129
129
|
dropped browser session (`BrowserSessionClosedError`), a Flow web-app crash
|
|
130
|
-
(`FlowAppError`),
|
|
130
|
+
(`FlowAppError`), an agentic-cohort flap (`FlowAgentUiError`), a page load served
|
|
131
|
+
by the migrated `flow.google.com` frontend (`FlowHostMigratedError`,
|
|
132
|
+
[#639](https://github.com/ffroliva/gflow-cli/issues/639) — the rollout flaps per
|
|
133
|
+
page load, so a retry often lands the frontend gflow can drive), an unreachable
|
|
134
|
+
UI arm (`UiModeUnavailableError`), and a partially-completed sync
|
|
135
|
+
(`SyncPartialError`). That list is the whole of `errors.RETRYABLE_ERRORS`.
|
|
136
|
+
Everything
|
|
131
137
|
else (auth, content-policy, configuration, security) is terminal
|
|
132
138
|
(`retryable: false`): retrying the identical request fails the same way. This
|
|
133
139
|
flag is the **same shared classification** the CLI `--json` payload and the
|
|
@@ -4,36 +4,67 @@
|
|
|
4
4
|
|
|
5
5
|
## Current release
|
|
6
6
|
|
|
7
|
-
**v0.66.
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
v0.66.
|
|
11
|
-
([#639](https://github.com/ffroliva/gflow-cli/issues/639)).
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
7
|
+
**v0.66.2 — alpha.** **The fast-fail v0.66.1 announced had never once fired, and the locale
|
|
8
|
+
cache was answering a question nobody asked it.**
|
|
9
|
+
|
|
10
|
+
v0.66.1 claimed exit 36 arrived in 0 ms on Google's migrated `flow.google.com` frontend
|
|
11
|
+
([#639](https://github.com/ffroliva/gflow-cli/issues/639)). It did not. That number came from
|
|
12
|
+
calling `get_ui_driver` **in isolation on a page already sitting on the migrated origin** — a
|
|
13
|
+
state no real run ever reaches, because `project_editor_url` only ever builds a `labs.google`
|
|
14
|
+
URL and the hop to the new origin is a *post-`goto`* redirect that neither settle path waits
|
|
15
|
+
for. The guard read a pre-redirect URL and declined. The reporter measured the truth on three
|
|
16
|
+
consecutive runs: **57.0 / 57.1 / 58.3 s**, through the slow selector-probe path, with the bail
|
|
17
|
+
event absent from the timeline entirely.
|
|
18
|
+
|
|
19
|
+
**Check the host where the run already blocks.** A shared `raise_if_migrated()` now runs at
|
|
20
|
+
`get_ui_driver` entry, on every `detect_ui_mode` poll tick, in `_exit_agent_mode` once the media
|
|
21
|
+
panel is found absent, and inside `mode_control`'s 8 s composer poll — the last of which was
|
|
22
|
+
found by review after the first fix shipped, and covers both `--ui-mode agentic` and a redirect
|
|
23
|
+
landing mid-`ensure_media_mode`. None of these adds a wait: `page.url` is a cached property and
|
|
24
|
+
`flow_host_kind` is one parse plus a dict lookup. Three blanket `except Exception` handlers that
|
|
25
|
+
would have demoted the abort to a warning now re-raise it.
|
|
26
|
+
|
|
27
|
+
**Stop letting a `lang` attribute mean "this account redirects".** Two locale defects, both
|
|
28
|
+
shipped in v0.66.1. `NOT_REDIRECTED` was an *absorbing* state: it returned before the only site
|
|
29
|
+
of the `<html lang>` recovery, so the profiles #643 was written for could never use it. And the
|
|
30
|
+
recovered locale was then recorded as evidence of a redirect — which it is not, since every
|
|
31
|
+
account declares one — switching the URL settle back on permanently and costing the full 4 s
|
|
32
|
+
`URL_SETTLE_TIMEOUT_MS` on every bootstrap of any non-redirecting account. Measured on a real
|
|
33
|
+
profile: **7.41 s → 2.66 s**, locale still recovered
|
|
29
34
|
([#643](https://github.com/ffroliva/gflow-cli/issues/643)).
|
|
30
35
|
|
|
31
|
-
|
|
32
|
-
|
|
36
|
+
Two designs were rejected **by measurement**, not preference: a bounded settle (72/72
|
|
37
|
+
navigations across two accounts showed no post-`goto` URL change at all, so the bound would be
|
|
38
|
+
pure dead time), and caching "this profile is migrated" to navigate straight to
|
|
39
|
+
`flow.google.com` (it would have locked both maintainer accounts out of a working frontend the
|
|
40
|
+
day it shipped).
|
|
33
41
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
42
|
+
Still not drivable — #639 stays open for that.
|
|
43
|
+
|
|
44
|
+
Verification: [LIVE_VERIFICATION_v0.66.2](LIVE_VERIFICATION_v0.66.2.md). The old host is proven
|
|
45
|
+
live at zero credits (**exit 0**, real 768x1376 JPEG, twice). **The migrated path is recorded as
|
|
46
|
+
NOT verified**: the rollout flapped back mid-work and 72/72 navigations landed on `labs.google`,
|
|
47
|
+
so the gate rests on unit tests and A/B controls, and **no time-to-exit-36 is claimed anywhere**.
|
|
48
|
+
Given this release exists because a number was reported from the wrong entrypoint, inventing a
|
|
49
|
+
replacement would have repeated the error.
|
|
50
|
+
|
|
51
|
+
<details><summary>v0.66.1 — a fast-fail that never fired (superseded by v0.66.2)</summary>
|
|
52
|
+
|
|
53
|
+
**v0.66.1 — alpha.** Intended to make the migrated-origin failure instant and to stop discarding
|
|
54
|
+
a learned locale. **Both fixes were real but neither reached the path users take**, and this
|
|
55
|
+
entry is kept to record that rather than to claim it.
|
|
56
|
+
|
|
57
|
+
The `0 ms` exit 36 reported here was measured on `get_ui_driver` in isolation, on an
|
|
58
|
+
already-migrated page; the CLI route was unchanged at ~57 s. The `<html lang>` locale recovery
|
|
59
|
+
was likewise exercised directly, while the client returned before it on any profile cached
|
|
60
|
+
`NOT_REDIRECTED`. v0.66.2 fixes both, and additionally a settle regression this release
|
|
61
|
+
introduced. See the correction block at the top of
|
|
62
|
+
[LIVE_VERIFICATION_v0.66.1](LIVE_VERIFICATION_v0.66.1.md).
|
|
63
|
+
|
|
64
|
+
What did hold: `_check_logged_in` accepting the migrated host, and the old-host no-regression
|
|
65
|
+
result (exit 0 with a real JPEG), which was the load-bearing evidence in that release.
|
|
66
|
+
|
|
67
|
+
</details>
|
|
37
68
|
|
|
38
69
|
<details><summary>v0.66.0 — naming Flow's flow.google.com migration</summary>
|
|
39
70
|
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"""Measure WHEN ``page.url`` flips to ``flow.google.com`` after ``goto`` returns (#639).
|
|
2
|
+
|
|
3
|
+
Zero credits — pure navigation, nothing is submitted.
|
|
4
|
+
|
|
5
|
+
**The question this exists to answer.** v0.66.1 added a fast-fail: ``get_ui_driver``
|
|
6
|
+
raises ``FlowHostMigratedError`` when ``flow_host_kind(page.url) == "migrated"``
|
|
7
|
+
(``drivers/factory.py``). In the field it never fires — the reporter of #639
|
|
8
|
+
measured exit 36 arriving at ~57 s on three consecutive v0.66.1 runs, through the
|
|
9
|
+
slow selector-probe path, with ``ui_driver.migrated_host_bail`` absent from the
|
|
10
|
+
timeline.
|
|
11
|
+
|
|
12
|
+
The hypothesis is that the guard reads a **pre-redirect** URL: ``project_editor_url``
|
|
13
|
+
only ever builds a ``labs.google`` URL, the hop to ``flow.google.com`` lands AFTER
|
|
14
|
+
``page.goto(wait_until="domcontentloaded")`` returns, and neither settle path waits
|
|
15
|
+
for it (``_settle_if_redirecting`` returns immediately with no locale;
|
|
16
|
+
``await_url_settled`` short-circuits with one, because the labs URL already matches
|
|
17
|
+
``FLOW_LOCALISED_URL_RE``).
|
|
18
|
+
|
|
19
|
+
That hypothesis is a *timing* claim, so no unit test can close it. The number it
|
|
20
|
+
turns on — **how long after ``goto`` the flip actually lands** — is also what
|
|
21
|
+
decides the fix: a flip at ~50 ms means a cheap bounded wait is viable, a flip at
|
|
22
|
+
several seconds means the guard has to be re-checked at a point the run already
|
|
23
|
+
waits at, or the navigation has to target the migrated origin directly.
|
|
24
|
+
|
|
25
|
+
**What it reports**, per navigation: the URL the moment ``goto`` returns, every
|
|
26
|
+
subsequent URL change with its offset, the offset at which ``flow_host_kind``
|
|
27
|
+
first answers ``"migrated"``, and ``document.documentElement.lang`` at the end.
|
|
28
|
+
|
|
29
|
+
uv run python scripts/dev/measure_migrated_host_flip.py ffroliva <project-id>
|
|
30
|
+
uv run python scripts/dev/measure_migrated_host_flip.py --rounds 3 ffroliva <project-id>
|
|
31
|
+
|
|
32
|
+
On Windows prefer ``.venv/Scripts/python.exe`` (memory: `uv run pytest` is broken
|
|
33
|
+
there; the same launcher quirk applies to long-running scripts).
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
from __future__ import annotations
|
|
37
|
+
|
|
38
|
+
import argparse
|
|
39
|
+
import asyncio
|
|
40
|
+
import json
|
|
41
|
+
import sys
|
|
42
|
+
from pathlib import Path
|
|
43
|
+
from time import perf_counter
|
|
44
|
+
from typing import Any
|
|
45
|
+
|
|
46
|
+
sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "src"))
|
|
47
|
+
|
|
48
|
+
from gflow_cli.api import routes # noqa: E402
|
|
49
|
+
from gflow_cli.api.transports._common import flow_host_kind # noqa: E402
|
|
50
|
+
from gflow_cli.profile_store import read_account_locale # noqa: E402
|
|
51
|
+
|
|
52
|
+
from _spike_common import build_client, default_out_path, resolve_profile_dir # noqa: E402, isort: skip
|
|
53
|
+
|
|
54
|
+
# Fine enough to distinguish "already flipped when goto returned" from "flipped a
|
|
55
|
+
# few hundred ms later" — the distinction the fix turns on.
|
|
56
|
+
POLL_MS = 25
|
|
57
|
+
WATCH_S = 20.0
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
async def _watch(page: Any, label: str, url: str, watch_s: float = WATCH_S) -> dict[str, Any]:
|
|
61
|
+
"""Navigate, then sample ``page.url`` until it settles or *watch_s* elapses."""
|
|
62
|
+
started = perf_counter()
|
|
63
|
+
await page.goto(url, wait_until="domcontentloaded", timeout=45_000)
|
|
64
|
+
at_goto_return = perf_counter() - started
|
|
65
|
+
seen = page.url
|
|
66
|
+
changes: list[dict[str, Any]] = [{"ms": round(at_goto_return * 1000), "url": seen}]
|
|
67
|
+
flipped_ms: float | None = None
|
|
68
|
+
if flow_host_kind(seen) == "migrated":
|
|
69
|
+
flipped_ms = at_goto_return * 1000
|
|
70
|
+
|
|
71
|
+
while perf_counter() - started < watch_s:
|
|
72
|
+
await page.wait_for_timeout(POLL_MS)
|
|
73
|
+
current = page.url
|
|
74
|
+
if current == seen:
|
|
75
|
+
continue
|
|
76
|
+
seen = current
|
|
77
|
+
offset = (perf_counter() - started) * 1000
|
|
78
|
+
changes.append({"ms": round(offset), "url": current})
|
|
79
|
+
if flipped_ms is None and flow_host_kind(current) == "migrated":
|
|
80
|
+
flipped_ms = offset
|
|
81
|
+
|
|
82
|
+
try:
|
|
83
|
+
lang = await page.evaluate("() => document.documentElement.lang || ''")
|
|
84
|
+
except Exception as exc: # noqa: BLE001 — observation only
|
|
85
|
+
lang = f"<probe failed: {type(exc).__name__}>"
|
|
86
|
+
|
|
87
|
+
return {
|
|
88
|
+
"label": label,
|
|
89
|
+
"requested": url,
|
|
90
|
+
"url_when_goto_returned": changes[0]["url"],
|
|
91
|
+
"goto_returned_ms": round(at_goto_return * 1000),
|
|
92
|
+
"host_kind_when_goto_returned": flow_host_kind(changes[0]["url"]),
|
|
93
|
+
"migrated_flip_ms": None if flipped_ms is None else round(flipped_ms),
|
|
94
|
+
"changes": changes,
|
|
95
|
+
"final_url": seen,
|
|
96
|
+
"final_host_kind": flow_host_kind(seen),
|
|
97
|
+
"html_lang": lang,
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
async def _main(profile: str, project_id: str, rounds: int, watch_s: float) -> int:
|
|
102
|
+
profile_dir = resolve_profile_dir(profile)
|
|
103
|
+
cached_locale = read_account_locale(profile_dir)
|
|
104
|
+
rows: list[dict[str, Any]] = []
|
|
105
|
+
|
|
106
|
+
async with build_client(profile_dir) as client:
|
|
107
|
+
page = client._page # noqa: SLF001 — dev instrument
|
|
108
|
+
assert page is not None
|
|
109
|
+
# The locale the client actually resolved decides which URL shape the
|
|
110
|
+
# transport builds, so both are recorded rather than assumed.
|
|
111
|
+
locale = client._account_locale # noqa: SLF001 — dev instrument
|
|
112
|
+
editor_url = routes.project_editor_url(locale, project_id)
|
|
113
|
+
|
|
114
|
+
for i in range(rounds):
|
|
115
|
+
rows.append(await _watch(page, f"bootstrap[{i}]", routes.EDITOR_BOOTSTRAP_URL, watch_s))
|
|
116
|
+
rows.append(await _watch(page, f"project[{i}]", editor_url, watch_s))
|
|
117
|
+
|
|
118
|
+
out = {
|
|
119
|
+
"profile": profile,
|
|
120
|
+
"cached_locale_state": repr(cached_locale),
|
|
121
|
+
"resolved_account_locale": locale,
|
|
122
|
+
"project_editor_url": editor_url,
|
|
123
|
+
"poll_ms": POLL_MS,
|
|
124
|
+
"watch_s": watch_s,
|
|
125
|
+
"navigations": rows,
|
|
126
|
+
}
|
|
127
|
+
path = default_out_path("migrated_host_flip")
|
|
128
|
+
path.write_text(json.dumps(out, indent=2), encoding="utf-8")
|
|
129
|
+
|
|
130
|
+
print(f"\ncached locale state: {cached_locale!r} resolved: {locale!r}")
|
|
131
|
+
print(f"project URL built: {editor_url}")
|
|
132
|
+
print(f"\n{'navigation':<14} {'goto ret':>9} {'host@goto':>10} {'flip':>8} final host")
|
|
133
|
+
print("-" * 62)
|
|
134
|
+
for r in rows:
|
|
135
|
+
flip = "—" if r["migrated_flip_ms"] is None else f'{r["migrated_flip_ms"]} ms'
|
|
136
|
+
print(
|
|
137
|
+
f'{r["label"]:<14} {r["goto_returned_ms"]:>7} ms '
|
|
138
|
+
f'{str(r["host_kind_when_goto_returned"]):>10} {flip:>8} {r["final_host_kind"]}'
|
|
139
|
+
)
|
|
140
|
+
print(f"\nhtml lang (last): {rows[-1]['html_lang']!r}")
|
|
141
|
+
print(f"written: {path}")
|
|
142
|
+
return 0
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
if __name__ == "__main__":
|
|
146
|
+
ap = argparse.ArgumentParser(description=__doc__)
|
|
147
|
+
ap.add_argument("profile")
|
|
148
|
+
ap.add_argument("project_id")
|
|
149
|
+
ap.add_argument("--rounds", type=int, default=2)
|
|
150
|
+
ap.add_argument("--watch", type=float, default=WATCH_S)
|
|
151
|
+
ns = ap.parse_args()
|
|
152
|
+
raise SystemExit(asyncio.run(_main(ns.profile, ns.project_id, ns.rounds, ns.watch)))
|