gflow-cli 0.66.2__tar.gz → 0.66.3__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.2 → gflow_cli-0.66.3}/.codex-plugin/plugin.json +1 -1
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/CHANGELOG.md +38 -1
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/PKG-INFO +1 -1
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/INDEX.md +2 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.66.2.md +57 -6
- gflow_cli-0.66.3/docs/LIVE_VERIFICATION_v0.66.3.md +97 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/PROJECT_STATUS.md +49 -5
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/pyproject.toml +1 -1
- gflow_cli-0.66.3/scripts/dev/measure_html_lang_settle.py +81 -0
- gflow_cli-0.66.3/scripts/dev/verify_lang_settle_fix.py +75 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/__init__.py +1 -1
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/api/client.py +62 -6
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_client_locale_cache.py +66 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_routes_locale.py +17 -5
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/uv.lock +1 -1
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.agents/plugins/marketplace.json +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.claude/README.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.claude/commands/gflow/active.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.claude/commands/gflow/branch-review.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.claude/commands/gflow/changelog.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.claude/commands/gflow/check.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.claude/commands/gflow/doc-review.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.claude/commands/gflow/issue-assessment.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.claude/commands/gflow/issue-resolve.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.claude/commands/gflow/known-issues.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.claude/commands/gflow/live-verify.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.claude/commands/gflow/llm-council.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.claude/commands/gflow/next.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.claude/commands/gflow/plan.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.claude/commands/gflow/pr-council-review.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.claude/commands/gflow/predict.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.claude/commands/gflow/release.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.claude/commands/gflow/scenario.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.claude/commands/gflow/sonar.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.claude/commands/gflow/status.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.env.template +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.gitattributes +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.github/CODEOWNERS +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.github/FUNDING.yml +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.github/copilot-instructions.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.github/dependabot.yml +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.github/workflows/ci.yml +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.github/workflows/deps-watch.yml +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.github/workflows/external-pr-triage.yml +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.github/workflows/governance-advisory.yml +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.github/workflows/governance-benchmark.yml +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.github/workflows/labels.yml +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.github/workflows/main-base-guard.yml +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.github/workflows/pages.yml +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.github/workflows/release.yml +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.github/workflows/scorecard.yml +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.github/workflows/selector-probe.yml +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.github/workflows/star-history-watch.yml +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.gitignore +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.gitleaks.toml +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.pre-commit-config.yaml +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/.secrets.baseline +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/AGENTS.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/CLAUDE.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/CONFIGURATION.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/CONTRIBUTING.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/DISCLAIMER.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/KNOWN_ISSUES.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/LICENSE +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/PLAN.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/README.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/RELEASE.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/ROADMAP.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/conftest.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/deploy/PR-TRIAGE-AUTOPILOT-OPS.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/deploy/logrotate-pr-triage +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docker-compose.yml +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/ACCOUNT_SAFETY.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/AGENT_GUIDE.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/AGENT_UI_E2E.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/AGENT_UI_RECON.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/ASSET_TAGGING_RECON.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/CHARACTER.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/CHARACTER_RECON.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/CONFIGURATION.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/DATA_LAYER.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/DEMOS.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/E2E_TESTING.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/GITHUB.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/GOVERNANCE_BENCHMARK.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/IMAGE_UPSCALE_RECON.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/INSTRUCTIONS.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_playwright_1.61.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_reference_entity_guard.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.21.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.22.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.23.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.24.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.25.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.26.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.27.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.27.1.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.28.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.29.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.30.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.31.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.32.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.32.1.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.33.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.34.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.35.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.36.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.37.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.38.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.38.1.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.39.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.40.0-production-readiness.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.40.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.41.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.42.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.43.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.44.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.45.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.46.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.46.1.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.47.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.48.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.49.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.50.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.51.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.52.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.54.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.55.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.56.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.57.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.57.1.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.58.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.59.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.60.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.61.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.62.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.62.1.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.63.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.64.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.65.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.66.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.66.1.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/LIVE_VERIFICATION_video_download.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/MCP.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/MEDIA_LIBRARY.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/MOVIE.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/PROMPT_EXPANSION.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/REFERENCE_STRATEGIES.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/SECURITY.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/TOOLS.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/USAGE.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/USER_GUIDE.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/assets/demo-split-pf.gif +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/assets/example-run.gif +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/assets/examples.webp +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/medium_tutorial.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/schemas/movie-handoff.schema.json +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/sonar-cleanup-tracker.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-07-08-pr-triage-autopilot/PLAN.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-07-09-camoufox-adoption/PLAN.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-07-14-storyboarding-and-visual-curation/PLAN.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-07-18-asset-tagging/PLAN.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-07-19-live-verify/PLAN.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-07-19-production-readiness-browser-lifecycle.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-07-19-production-readiness-driver-cdp-verification.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-07-19-production-readiness-public-truth.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-07-19-production-readiness-queue-safety.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-07-26-character-prompt-polishing/PLAN.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-07-26-project-name-management/PLAN.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-07-26-self-documenting-errors/PLAN.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-07-27-overlay-banner-dismissal/PLAN.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/PLAN.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/SCENARIO.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-08-04-mcp-tasks/PLAN.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-08-04-output-hardening/PLAN.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-08-05-issue-317-intra-batch-references/PLAN.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-08-05-issue-317-intra-batch-references/SCENARIO.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-08-05-issue-402-entity-provenance/PLAN.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-08-05-issue-402-entity-provenance/SCENARIO.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-08-05-issue-451-duration-tab-drift/PLAN.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-08-05-issue-451-duration-tab-drift/SCENARIO.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-08-06-driver-delay-jittering/PLAN.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-08-06-driver-delay-jittering/SCENARIO.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-08-06-overlay-changelog-watermark/PLAN.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-08-06-overlay-changelog-watermark/SCENARIO.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-08-06-ui-mode-policy/PLAN.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-08-06-ui-mode-policy/SCENARIO.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-08-14-video-ui-mode-policy/PLAN.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-08-14-video-ui-mode-policy/SCENARIO.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-08-21-selector-registry.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-08-25-workflow-hardening-gaps.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/plans/2026-09-01-video-extend/PLAN.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/research/2026-06-27-tool-abstraction-evaluation.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/specs/2026-06-29-issue-assessment-workflow-design.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/specs/2026-07-04-pr-triage-autopilot-design.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/specs/2026-07-18-asset-tagging-design.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/specs/2026-07-19-live-verify-design.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/specs/2026-07-19-production-readiness-hardening-design.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/specs/2026-08-21-selector-registry-design.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/specs/2026-08-26-model-attribution-provenance.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/specs/2026-08-26-model-cost-quota-catalog.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/specs/2026-08-27-changelog-modal-precondition-design.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/spikes/2026-07-09-camoufox-waf-403.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/spikes/2026-07-12-ui-cohort-backend-config.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/spikes/2026-07-17-production-readiness-assessment.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/spikes/2026-08-01-mcp-2026-07-28-spec-impact.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/spikes/2026-08-14-video-model-capability-matrix.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/spikes/2026-08-15-picker-tile-alt-text.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/docs/superpowers/spikes/2026-08-31-veo-extend-route-recon.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/eval/pr_triage_eval.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/eval/pr_triage_fixtures.json +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/examples/README.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/examples/batch_from_config.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/examples/multi_prompt_t2i.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/examples/sample_config.json +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/examples/sample_prompts.txt +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/examples/single_image_t2i.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/examples/workflow_chain.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/index.html +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/llms.txt +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/samples/README.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/samples/captured/01_upload_image.json +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/samples/captured/04_archive_workflow.json +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/samples/captured/05_createProject.json +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/samples/captured/06_batchGenerateImages.json +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/samples/captured/12_create_scene.json +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/samples/captured/13_sceneWorkflows_update.json +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/samples/captured/14_get_scene_workflows.json +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/samples/captured/15_commit_flowWorkflow.json +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/autopilot/Dockerfile.triage +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/autopilot/entrypoint.sh +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/autopilot/package-lock.json +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/autopilot/package.json +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/autopilot/pr_triage_autopilot.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/autopilot/pr_triage_gate.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/autopilot/run_sandboxed_review.sh +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/canary/register_task.ps1 +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/canary/run_canary.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/ci/check_doc_links.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/ci/check_materiality.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/ci/check_release_artifacts.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/ci/check_repo_hygiene.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/ci/check_test_count.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/ci/check_website_docs_pii.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/ci/generate_website_docs.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/debug_editor.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/debug_gen_settings.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/debug_settings.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/_recording_client.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/_spike_common.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/active_plan.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/capture_frames_mode_trigger_ligature.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/capture_image_add_media_dom.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/capture_locale_invariants.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/capture_lower_priority_model_cost.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/capture_project_listing.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/capture_r2v_ingredient_lifecycle.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/capture_sidebar_state_dom.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/capture_video_model_capability_matrix.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/cdp_drive_and_probe.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/character_create_spike.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/character_create_spike_v2.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/dump_character_selectors.js +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/incident_bundle_quality.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/live_verify_mcp_tasks.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/live_verify_policy_400_v060.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/live_verify_video_model_select.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/make_project.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/materiality_backtest.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/measure_locale_probe.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/measure_migrated_host_flip.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/patch_character.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/skillopt/README.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/skillopt/harness.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/skillopt/tasks.json +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/sonar-local-scan.sh +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/sonar-pre-push-gate.sh +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/spike_changelog_capture.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/spike_char_editor_dom.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/spike_char_gen_capture.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/spike_character_prompt_format.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/spike_extend_model_recon.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/spike_extend_ourstack_verify.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/spike_extend_route_capture.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/spike_extend_submit_capture.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/spike_extend_ui_recon.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/spike_image_upscale_capture.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/spike_image_upscale_drive.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/spike_incident_live.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/spike_issue313_agent_mode_controls.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/spike_issue314_picker_filename_search.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/spike_issue404_count_tabs_recon.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/spike_locale_poison.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/spike_mode_roundtrip.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/spike_mode_switch_agentic_to_classic.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/spike_model_inventory.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/spike_movie_attach_payload.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/spike_movie_entity_recon.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/spike_movie_gen_capture.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/spike_movie_picker_select.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/spike_movie_voice_list.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/spike_omni_flash_i2v_ui_recon.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/spike_patch_entity.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/spike_patchright.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/spike_trpc_origin_referer_401.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/spike_video_tab_dom.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/verify_language_agnostic.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/verify_locale_navigation_race.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/dev/verify_model_attribution.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/diag/README.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/diag/capture_flow_traffic.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/diag/diag_aisandbox_bearer.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/diag/memory_profile.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/diag/recaptcha_mint.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/diag/spike_387_openai_compat.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/e2e/capture_agent_toggle.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/probe/run_probe.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/probe/spike_auth_matrix.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/record_demo.ps1 +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/smoke_image.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/smoke_video_editor.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/smoke_worker_style.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/spike_waf_camoufox.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/scripts/verify_chrome_auth_viability.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/skills/README.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/skills/changelog/SKILL.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/skills/check/SKILL.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/skills/doc-review/SKILL.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/skills/gflow-cli/SKILL.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/skills/issue-assessment/SKILL.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/skills/issue-resolve/SKILL.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/skills/known-issues/SKILL.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/skills/live-verify/SKILL.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/skills/llm-council/SKILL.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/skills/plan/SKILL.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/skills/pr-council-review/SKILL.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/skills/predict/SKILL.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/skills/release/SKILL.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/skills/scenario/SKILL.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/skills/sonar/SKILL.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/skills/status/SKILL.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/sonar-project.properties +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/__main__.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/_cli_helpers.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/api/__init__.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/api/_engine.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/api/_retry.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/api/_sapisidhash.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/api/character.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/api/dto.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/api/extend_chain.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/api/image.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/api/image_upscale.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/api/recaptcha.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/api/routes.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/api/scene.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/api/transports/__init__.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/api/transports/_common.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/api/transports/base.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/api/transports/drivers/agentic.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/api/transports/drivers/base.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/api/transports/drivers/classic.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/api/transports/drivers/factory.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/api/transports/mode_control.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/api/transports/ui_automation.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/api/transports/ui_automation_video.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/api/video.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/api/video_extend.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/auth/__init__.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/auth/base.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/auth/cookies.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/auth/factory.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/auth/internal_chromium.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/auth/real_chrome.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/auth/strategies.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/auth/verification.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/browser_manager.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/chain.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/chain_manifest.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/cli.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/cli_character.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/cli_data.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/cli_doctor.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/cli_image.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/cli_instructions.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/cli_models.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/cli_movie.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/cli_project.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/cli_run.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/cli_scene.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/cli_tools.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/cli_video.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/composition.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/config.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/data/__init__.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/data/chain_repo.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/data/migrations/0007_queue.sql +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/data/migrations/0008_add_operation_expanded_prompt.sql +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/data/migrations/0009_queue_claims.sql +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/data/migrations/__init__.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/data/models.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/data/queries.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/data/recorder.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/data/redaction.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/data/repository.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/data/store.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/diagnostics.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/errors.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/exceptions.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/file_integrity.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/flow_selectors/__init__.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/flow_selectors/grading.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/flow_selectors/model.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/flow_selectors/registry.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/image_batch.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/json_output.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/mcp/__init__.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/mcp/prompts.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/mcp/resources.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/mcp/server.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/mcp/setup.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/mcp/tasks_extension.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/mcp/tools.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/media.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/movie_manifest.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/observability.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/paths.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/profile_lease.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/profile_store.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/redaction.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/services/__init__.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/services/catalog_sync.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/services/character_create.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/services/doctor.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/services/mentions.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/storage.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/tools/__init__.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/tools/banned.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/tools/builtin/__init__.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/tools/builtin/creative-director.toml +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/tools/builtin/reverse-engineer.toml +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/tools/builtin/storyboard.toml +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/tools/expander.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/tools/invocation.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/tools/loader.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/tools/registry.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/tools/runtime.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/tools/spec.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/ui/app.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/ui/server.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/update_check.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/winsec.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/worker/codec.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/worker/daemon.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/src/gflow_cli/worker/queue.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tasks/lessons.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/test_assets/sample_batch.json +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/test_assets/sample_batch.tsv +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/test_assets/sample_batch_invalid.tsv +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/__init__.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/__init__.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/fixtures/character_gen_response.json +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/fixtures/patch_entity_response.json +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/fixtures/project_initial_data_extend_models.json +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_aisandbox_auth_error.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_aisandbox_auth_headers.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_bearer_redaction.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_character.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_client.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_client_character.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_client_delete_characters.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_client_errors.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_client_extend.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_client_generate_character.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_client_image.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_client_incidents.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_client_launch_kwargs.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_client_patch_entity.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_client_scene.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_client_upscale.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_concurrency.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_dto.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_engine.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_extend_chain.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_image.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_image_dto.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_image_upscale.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_post_json_aisandbox_auth.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_recaptcha.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_retry.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_routes.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_routes_character.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_routes_scene.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_sapisidhash_helper.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_scene_models.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_video.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_video_extend.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_video_request.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/test_video_status_poll.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/transports/__init__.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/transports/conftest.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/transports/drivers/test_agentic.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/transports/drivers/test_classic.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/transports/drivers/test_factory.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/transports/drivers/test_ui_mode.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/transports/test_agentic_cohort_detection.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/transports/test_base.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/transports/test_bearer.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/transports/test_common.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/transports/test_evaluate_fetch.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/transports/test_factory.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/transports/test_fingerprint.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/transports/test_locale_navigation.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/transports/test_migrated_host_gate.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/transports/test_mode_control.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/transports/test_model_selection_loud.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/transports/test_navigation_settled.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/transports/test_overlay_precondition.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/transports/test_policy_400.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/transports/test_sapisidhash.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/transports/test_selector_symmetry.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/transports/test_transport_timeout.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/transports/test_ui_automation.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/transports/test_ui_automation_batch.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/transports/test_ui_automation_video.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/transports/test_ui_character_editor.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/api/transports/test_video_model_selection_loud.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/auth/strategies/test_factory.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/auth/strategies/test_strategies.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/auth/test_cookies.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/auth/test_real_chrome.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/auth/test_verification.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/auth/test_windows_acl.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/autopilot/test_pr_triage_autopilot.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/cli/__init__.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/cli/test_auth_status.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/cli/test_cli_auth_list.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/cli/test_cli_character.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/cli/test_cli_character_create.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/cli/test_cli_data.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/cli/test_cli_data_errors.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/cli/test_cli_data_errors_retention.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/cli/test_cli_data_sync.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/cli/test_cli_doctor.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/cli/test_cli_image.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/cli/test_cli_image_seed_removed.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/cli/test_cli_image_selector_drift.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/cli/test_cli_image_upscale.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/cli/test_cli_image_uuid_ref_enrichment.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/cli/test_cli_instructions.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/cli/test_cli_models.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/cli/test_cli_movie.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/cli/test_cli_run.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/cli/test_cli_scene.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/cli/test_cli_tools.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/cli/test_cli_video.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/cli/test_cli_video_chain.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/cli/test_cli_video_extend.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/cli/test_error_handling.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/cli/test_failure_funnel.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/cli/test_helpers.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/cli/test_incident_output.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/cli/test_movie_manifest.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/cli/test_movie_manifest_style_variants.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/cli/test_predictable_output.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/cli/test_run_with_handlers_interrupt.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/cli/test_settings_validation.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/cli/test_t2i_multi_prompt.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/composition/test_character.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/composition/test_compose_prompt.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/composition/test_handoff.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/composition/test_style_variants.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/composition/test_style_variants_e2e.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/conftest.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/data/__init__.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/data/test_chain_repo.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/data/test_failure_recording.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/data/test_find_incomplete_character.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/data/test_models.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/data/test_null_columns_stay_null.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/data/test_packaging.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/data/test_recorder.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/data/test_recorder_character.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/data/test_redaction.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/data/test_repository.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/data/test_scene_persistence.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/data/test_settings_and_errors.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/data/test_store.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/data/test_store_migrations.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/dev/test_recording_client.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/e2e/__init__.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/e2e/conftest.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/e2e/test_agentic_count_enforcement_e2e.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/e2e/test_aisandbox_auth_live.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/e2e/test_asset_tagging_e2e.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/e2e/test_auth_verification_e2e.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/e2e/test_cancellation_e2e.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/e2e/test_chain_e2e.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/e2e/test_character_create_e2e.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/e2e/test_classic_count_setter_e2e.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/e2e/test_crash_recovery_e2e.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/e2e/test_daemon_e2e.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/e2e/test_data_layer_e2e.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/e2e/test_data_sync_names_e2e.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/e2e/test_entity_provenance_e2e.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/e2e/test_entity_smuggling_e2e.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/e2e/test_i2v_flags_e2e.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/e2e/test_image_batch_e2e.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/e2e/test_image_uuid_ref_e2e.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/e2e/test_incident_quality_e2e.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/e2e/test_json_output_e2e.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/e2e/test_live_agentic_instructions.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/e2e/test_locale_selectors_e2e.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/e2e/test_project_naming_e2e.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/e2e/test_refresh_on_miss_e2e.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/e2e/test_scene_compose_live.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/e2e/test_sidebar_recovery_e2e.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/e2e/test_tools_e2e.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/e2e/test_transports_e2e.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/e2e/test_video_r2v_uuid_name_e2e.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/e2e/test_video_t2v_e2e.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/__init__.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/asset_tagging.feature +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/auth.feature +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/auth_login.feature +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/character_create.feature +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/character_read.feature +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/conftest.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/duration_tab_drift.feature +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/entity_provenance.feature +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/image.feature +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/image_batch_references.feature +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/image_upscale.feature +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/incident_diagnostics.feature +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/instructions.feature +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/latched_locale_recovery.feature +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/locale_picker_include.feature +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/mcp_tasks.feature +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/media_picker_tiers.feature +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/migrated_host_gate.feature +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/output_hardening.feature +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/test_asset_tagging_steps.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/test_auth_login_steps.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/test_auth_steps.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/test_character_create_steps.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/test_character_read_steps.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/test_image_steps.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/test_image_upscale_steps.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/test_incident_diagnostics_steps.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/test_instructions_steps.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/test_locale_picker_include_steps.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/test_mcp_tasks_steps.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/test_media_picker_tiers_steps.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/test_migrated_host_gate_steps.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/test_output_hardening_steps.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/test_step_collision_guard.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/test_video_agent_ui_steps.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/test_video_chain_steps.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/video_agent_ui.feature +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/features/video_chain.feature +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/fixtures/__init__.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/fixtures/changelog_modal_page.html +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/fixtures/doctor_env.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/fixtures/flow_model_inventory.json +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/fixtures/flow_project_listing_media.json +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/fixtures/listing_payload.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/fixtures/seeded_catalog.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/flow_selectors/__init__.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/flow_selectors/test_grading.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/flow_selectors/test_model.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/flow_selectors/test_model_governance.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/flow_selectors/test_registry.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/flow_selectors/test_report.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/image_batch/__init__.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/image_batch/test_image_manifest.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/image_batch/test_jitter_config.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/image_batch/test_observability_events.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/integration/__init__.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/integration/conftest.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/integration/constants.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/integration/test_expander_gateway.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/integration/test_storage_gcs.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/integration/test_storage_s3.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/mcp/__init__.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/mcp/conftest.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/mcp/test_auth_status_tool.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/mcp/test_cli_parity.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/mcp/test_error_funnel.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/mcp/test_http_transport.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/mcp/test_known_issues_resource.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/mcp/test_no_spend.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/mcp/test_rate_limit_envelope.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/mcp/test_resources.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/mcp/test_server.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/mcp/test_setup.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/mcp/test_stdio_transport.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/mcp/test_tasks_extension.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/mcp/test_tools_helpers.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/mcp/test_tools_instructions.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/mcp/test_tools_wired.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/scripts/test_canary_classify.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/scripts/test_canary_reexec.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/scripts/test_capture_locale_invariants.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/scripts/test_check_materiality.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/scripts/test_check_release_artifacts.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/scripts/test_check_repo_hygiene.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/scripts/test_check_test_count.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/scripts/test_check_website_docs_pii.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/scripts/test_codex_plugin.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/scripts/test_generate_website_docs.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/scripts/test_incident_bundle_quality.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/scripts/test_materiality_backtest.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/scripts/test_workflow_hardening.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/services/__init__.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/services/test_catalog_sync.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/services/test_character_create_redaction.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/services/test_character_create_saga.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/services/test_character_gen_no_direct_post.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/services/test_doctor.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/services/test_media_attribution.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/services/test_mentions_observability.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/services/test_mentions_parse.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/services/test_mentions_resolve.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/services/test_resolve_and_apply.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/smoke/__init__.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/smoke/test_profile_account_smoke.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/smoke/test_real_flow.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_auth.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_browser_manager.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_chain.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_chain_manifest.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_cli_data.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_cli_project.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_config.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_conftest_isolation.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_data_queries.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_diagnostics_bundle.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_diagnostics_events.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_diagnostics_journal.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_diagnostics_recorder.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_diagnostics_retention.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_diagnostics_sanitize.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_documentation_gate.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_duration_tab_drift.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_entity_provenance.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_errors.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_errors_classification.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_image_batch_references.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_incident_generation_requests.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_json_output.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_marker_registry.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_media.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_observability.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_overlay_banner_dismissal.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_paths.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_playwright_pin.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_profile_lease.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_profile_lease_subprocess.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_profile_store.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_profile_store_locale.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_project_list_urls.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_self_documenting_errors.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_smoke.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/test_update_check.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/tools/__init__.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/tools/test_banned.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/tools/test_expander.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/tools/test_invocation.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/tools/test_loader.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/tools/test_registry.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/tools/test_runtime.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/tools/test_spec.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/ui/test_app.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/worker/test_codec.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/worker/test_daemon.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/worker/test_mcp_daemon_race.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/worker/test_queue.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/worker/test_queue_multiprocess.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/tests/worker/test_queue_reconciliation.py +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/website/docs/ACCOUNT_SAFETY.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/website/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/website/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/website/docs/CHARACTER.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/website/docs/CONFIGURATION.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/website/docs/DATA_LAYER.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/website/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/website/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/website/docs/E2E_TESTING.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/website/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/website/docs/INSTRUCTIONS.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/website/docs/KNOWN_ISSUES.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/website/docs/MCP.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/website/docs/MEDIA_LIBRARY.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/website/docs/MOVIE.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/website/docs/PROMPT_EXPANSION.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/website/docs/SECURITY.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/website/docs/TOOLS.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/website/docs/USAGE.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/website/docs/USER_GUIDE.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/website/docs/agents.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/website/docs/index.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/website/docs/installation.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/website/docs/onboarding-mockup.html +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/website/docs/onboarding.md +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/website/docs/stylesheets/extra.css +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/website/mkdocs.yml +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/website/requirements.in +0 -0
- {gflow_cli-0.66.2 → gflow_cli-0.66.3}/website/requirements.txt +0 -0
|
@@ -7,6 +7,42 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.66.3] — 2026-09-03
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- **`<html lang>` was read before the app set it, so every account whose URL could not answer
|
|
15
|
+
resolved to `en` ([#651](https://github.com/ffroliva/gflow-cli/issues/651)).** Flow serves an
|
|
16
|
+
**`en` shell** and rewrites `lang` during hydration. The single early read added by
|
|
17
|
+
[#643](https://github.com/ffroliva/gflow-cli/issues/643) therefore returned the shell value —
|
|
18
|
+
and the accounts it hit are exactly the ones #643 was written for: those where the URL carries
|
|
19
|
+
no locale segment. Reported by
|
|
20
|
+
[@maipmacrothorax-75](https://github.com/maipmacrothorax-75) on a pt-BR account resolving `en`
|
|
21
|
+
while both pages served `<html lang="pt">`, with the mechanism offered explicitly as a guess.
|
|
22
|
+
|
|
23
|
+
The guess is confirmed, and it reproduces on the **old** host — so this was never a migration
|
|
24
|
+
bug. Measured on a pt account, two consecutive loads:
|
|
25
|
+
|
|
26
|
+
| t (ms) | `lang` | `readyState` |
|
|
27
|
+
|---|---|---|
|
|
28
|
+
| 887 | `en` | interactive |
|
|
29
|
+
| **1510** | `en` | **complete** |
|
|
30
|
+
| 2092 | `en` | complete |
|
|
31
|
+
| **2488** | **`pt`** | complete |
|
|
32
|
+
|
|
33
|
+
**`readyState` is not a usable signal** — it reaches `complete` a full second *before* the
|
|
34
|
+
flip, so the obvious "wait for complete, then read" would have shipped the same bug with more
|
|
35
|
+
code. The DOM node count oscillates (136 → 300 → 249 → 251) and does not discriminate either.
|
|
36
|
+
Nothing cheap predicts the flip, so `_resolve_account_locale` now **observes** it: read once,
|
|
37
|
+
bounded-wait for the value to change, re-read.
|
|
38
|
+
|
|
39
|
+
A timeout is an **answer**, not a failure — either the account's locale genuinely equals the
|
|
40
|
+
shell default, or the page never hydrated in the window. Both leave the first read as the best
|
|
41
|
+
available answer, which is exactly the previous behaviour, so the branch can never be worse
|
|
42
|
+
than what it replaces. It is logged as `client.account_locale_lang_unchanged` so the field can
|
|
43
|
+
tell the two apart. Cost: an account whose locale **is** the shell default pays the 4 s bound
|
|
44
|
+
once per process.
|
|
45
|
+
|
|
10
46
|
## [0.66.2] — 2026-09-03
|
|
11
47
|
|
|
12
48
|
### Fixed
|
|
@@ -3784,7 +3820,8 @@ shell-script template that branches on these codes.
|
|
|
3784
3820
|
|
|
3785
3821
|
First skeleton. Not functional end-to-end yet.
|
|
3786
3822
|
|
|
3787
|
-
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.66.
|
|
3823
|
+
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.66.3...HEAD
|
|
3824
|
+
[0.66.3]: https://github.com/ffroliva/gflow-cli/compare/v0.66.2...v0.66.3
|
|
3788
3825
|
[0.66.2]: https://github.com/ffroliva/gflow-cli/compare/v0.66.1...v0.66.2
|
|
3789
3826
|
[0.66.1]: https://github.com/ffroliva/gflow-cli/compare/v0.66.0...v0.66.1
|
|
3790
3827
|
[0.66.0]: https://github.com/ffroliva/gflow-cli/compare/v0.65.0...v0.66.0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: gflow-cli
|
|
3
|
-
Version: 0.66.
|
|
3
|
+
Version: 0.66.3
|
|
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.3?"** → [LIVE_VERIFICATION_v0.66.3](LIVE_VERIFICATION_v0.66.3.md) — the `<html lang>` hydration race, with the negative result that chose the design: **`readyState` reaches `complete` a full second BEFORE the attribute flips**, so "wait for complete, then read" would have shipped the same bug. Component and end-to-end measurements are reported separately on purpose. NOT verified: the migrated origin (fix proven on the old host, where the race also occurs) and the 4 s bound against a cold first load.
|
|
166
|
+
|
|
165
167
|
**"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
168
|
|
|
167
169
|
**"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.
|
|
@@ -153,18 +153,69 @@ the *cached* state. Because the lang-derived locale is deliberately not persiste
|
|
|
153
153
|
unchanged by this branch — the earlier claim that they become "account-correct" was wrong and is
|
|
154
154
|
retracted here rather than shipped.
|
|
155
155
|
|
|
156
|
+
## Layer 6 — the migrated path, verified independently by the reporter
|
|
157
|
+
|
|
158
|
+
Everything above was measured on maintainer accounts that had flapped back to the old host. The
|
|
159
|
+
migrated path was verified by [@maipmacrothorax-75](https://github.com/maipmacrothorax-75) on a
|
|
160
|
+
permanently-migrated account — branch installed from git, reverted afterwards, zero credits,
|
|
161
|
+
posted to [#639](https://github.com/ffroliva/gflow-cli/issues/639).
|
|
162
|
+
|
|
163
|
+
| | v0.66.1 | branch, before the `mode_control` guard | v0.66.2 |
|
|
164
|
+
|---|---|---|---|
|
|
165
|
+
| total, per run | 57.0 / 58.3 / 57.0 s | 19.4 / 15.0 / 14.9 s | **4.08 – 4.26 s** |
|
|
166
|
+
| `ui_driver.migrated_host_bail` | **absent** | present, `at=detect_ui_mode` | present, **`at=mode_control`** |
|
|
167
|
+
| `mode_control.ensure_media_incomplete` | every run | every run | **never** |
|
|
168
|
+
| `ui_automation_video.selector_probe_failed` | every run | never | never |
|
|
169
|
+
|
|
170
|
+
Typical v0.66.2 timeline on a migrated load:
|
|
171
|
+
|
|
172
|
+
```
|
|
173
|
+
2.82 ui_automation.url_stable_after_goto
|
|
174
|
+
3.44 ui_driver.migrated_host_bail at=mode_control (+0.62)
|
|
175
|
+
4.09 error_raised FlowHostMigratedError, exit 36, retryable
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
**~0.6 s from the host becoming knowable to the abort**; ~4 s total, essentially browser launch
|
|
179
|
+
plus navigation. Nine runs on the final build, `at=mode_control` every time.
|
|
180
|
+
|
|
181
|
+
Two things this settles that no maintainer measurement could:
|
|
182
|
+
|
|
183
|
+
1. **The `at=` field earned itself.** The intermediate run bailed at `detect_ui_mode`, not
|
|
184
|
+
`exit_agent_mode` — which is how the reporter identified, from the log alone, that the
|
|
185
|
+
`exit_agent_mode` guard sat *after* the ~11 s dismissal rather than before it. A late review
|
|
186
|
+
angle found the same gap independently; the log field is what made it visible from outside
|
|
187
|
+
the codebase.
|
|
188
|
+
2. **57 s → 4 s is real**, and it is the difference between a caller's retry loop being viable
|
|
189
|
+
and not.
|
|
190
|
+
|
|
191
|
+
**One unexplained anomaly, recorded because it was observed.** The first run after a fresh
|
|
192
|
+
install ended in `error_unhandled` at 3.42 s — after `setup_shared_page`, before
|
|
193
|
+
`entering_existing_project` — `exception_class: "Error"` (Playwright's base class), message
|
|
194
|
+
redacted to hashes. It did not reproduce; the other 8 runs on that build were clean exit 36. A
|
|
195
|
+
one-off that cannot be reproduced is not evidence, and it is here only so a second sighting has
|
|
196
|
+
something to match against.
|
|
197
|
+
|
|
156
198
|
## Recorded as NOT verified rather than omitted
|
|
157
199
|
|
|
158
|
-
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
permanently-migrated account
|
|
162
|
-
|
|
163
|
-
|
|
200
|
+
- ~~**The migrated path firing fast.**~~ **Now verified — see Layer 6.** This entry originally
|
|
201
|
+
said unverified because 72/72 navigations *from this machine* landed on the old host. That was
|
|
202
|
+
true of this machine and false of the project: the reporter had already run it on a
|
|
203
|
+
permanently-migrated account and posted the numbers to #639 before the tag was cut, and they
|
|
204
|
+
were not read in time. Kept rather than deleted — "I could not measure it" and "nobody measured
|
|
205
|
+
it" are different claims, and this doc conflated them.
|
|
164
206
|
- **Driving the migrated frontend.** Still impossible. #639 stays open; this PR says `Refs`.
|
|
165
207
|
- **A non-English profile recovering live.** `denon82` is cached `"pt"` (it genuinely redirects),
|
|
166
208
|
so the lang-recovery path was exercised live only on `en`. The `pt` case is unit-tested.
|
|
167
209
|
- **The `en-GB` → `en` region reduction where region is load-bearing** (`zh-Hans`/`zh-Hant`).
|
|
168
210
|
Unchanged from v0.66.1, still only two locales observed.
|
|
211
|
+
- **A defect this verification found, shipped in v0.66.2 and not fixed by it.** On the reporter's
|
|
212
|
+
**pt-BR** account the locale resolves to `en`, while `document.documentElement.lang` reads `pt`
|
|
213
|
+
on both `flow.google.com/` and `flow.google.com/project/<id>`, `navigator.language` is `pt-BR`,
|
|
214
|
+
and the whole UI renders in Portuguese. The probe logs at ~1.63 s, before
|
|
215
|
+
`entering_existing_project` at ~2.31 s — early enough that it may be reading the initial HTML
|
|
216
|
+
shell before the app sets `lang`. **The mismatch is measured; the mechanism is a hypothesis and
|
|
217
|
+
was not instrumented.** This is precisely the population #643 was written for, so the
|
|
218
|
+
`<html lang>` fallback (shipped v0.66.1) can latch a locale the account does not use. Tracked
|
|
219
|
+
separately — it is not a migration bug.
|
|
169
220
|
- **Full-suite coverage %.** The targeted suites ran without `--cov` (an unscoped `pytest --cov`
|
|
170
221
|
OOMs this machine); the 80% floor is enforced by CI.
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# Live Verification — v0.66.3 (`<html lang>` is read after hydration, not before)
|
|
2
|
+
|
|
3
|
+
**Date:** 2026-09-03 · **Accounts:** `denon82` (pt), `ffroliva` (en) · **Platform:** Windows 11, Chrome strategy
|
|
4
|
+
**Credits spent:** **0** — navigation and DOM reads only; nothing submits.
|
|
5
|
+
|
|
6
|
+
## What had to be proven
|
|
7
|
+
|
|
8
|
+
One fix ([#651](https://github.com/ffroliva/gflow-cli/issues/651)): the account locale must come
|
|
9
|
+
from `<html lang>` **after** Flow's app has set it, not from the `en` shell it serves first.
|
|
10
|
+
|
|
11
|
+
## Layer 1 — the defect, measured (this is what chose the design)
|
|
12
|
+
|
|
13
|
+
Sampling `document.documentElement.lang` after `page.goto(wait_until="domcontentloaded")` returns,
|
|
14
|
+
on a **pt** account, two consecutive loads (`scripts/dev/measure_html_lang_settle.py`):
|
|
15
|
+
|
|
16
|
+
| t (ms) | `lang` | `readyState` | DOM nodes |
|
|
17
|
+
|---|---|---|---|
|
|
18
|
+
| 887 | `en` | interactive | 136 |
|
|
19
|
+
| **1510** | `en` | **complete** | 300 |
|
|
20
|
+
| 2092 | `en` | complete | 249 |
|
|
21
|
+
| **2488** | **`pt`** | complete | 262 |
|
|
22
|
+
| 7398 | `pt` | complete | 251 |
|
|
23
|
+
|
|
24
|
+
Two negative results that mattered more than the positive one:
|
|
25
|
+
|
|
26
|
+
- **`readyState` is not a hydration signal for `lang`.** It reaches `complete` a full second
|
|
27
|
+
*before* the flip. "Wait for complete, then read" — the obvious fix — would have shipped the
|
|
28
|
+
same bug with more code.
|
|
29
|
+
- **DOM node count does not discriminate.** It oscillates 136 → 300 → 249 → 251 and settles
|
|
30
|
+
within 2 of its pre-flip value.
|
|
31
|
+
|
|
32
|
+
Nothing cheap predicts the flip, so the fix **observes** it.
|
|
33
|
+
|
|
34
|
+
## Layer 2 — the fix, on a live page (COMPONENT measurement)
|
|
35
|
+
|
|
36
|
+
`scripts/dev/verify_lang_settle_fix.py`, part A. This calls the helper directly against a real
|
|
37
|
+
bootstrap page — **it is a component measurement and is labelled as one.**
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
[A · COMPONENT — helper on a live page] profile=denon82
|
|
41
|
+
naive early read : 'en'
|
|
42
|
+
_settled_lang : 'pt' (+638 ms)
|
|
43
|
+
verdict : CAPTURED THE FLIP
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Layer 3 — the real bootstrap (END-TO-END measurement)
|
|
47
|
+
|
|
48
|
+
Part B, on the account that exercises the *timeout* branch — its locale equals the `en` shell, so
|
|
49
|
+
the attribute never changes:
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
client.account_locale_lang_unchanged lang=en waited_ms=4000 reason=TimeoutError
|
|
53
|
+
client.account_locale_resolved locale=en source=html_lang
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Correct answer, and the cost is visible: **the 4 s bound, once per process** (bootstrap ~2.7 s →
|
|
57
|
+
~6 s on this account). That is the price of not guessing, and it is bounded. The event name makes
|
|
58
|
+
"the shell value was already right" distinguishable from "we timed out" in any field log.
|
|
59
|
+
|
|
60
|
+
**Layers 2 and 3 are reported separately on purpose.** Collapsing a component number into a
|
|
61
|
+
user-facing claim is precisely the error corrected at the top of
|
|
62
|
+
[LIVE_VERIFICATION_v0.66.1](LIVE_VERIFICATION_v0.66.1.md), and this release is not going to
|
|
63
|
+
repeat it one version later.
|
|
64
|
+
|
|
65
|
+
## Layer 4 — offline
|
|
66
|
+
|
|
67
|
+
- Tests written red first; **A/B control**: neutering `_settled_lang` fails **exactly 3** — the
|
|
68
|
+
two new cases plus the probe-failure test, since the helper owns the error handling too.
|
|
69
|
+
- `1663 passed / 3 skipped` across `tests/api`, `tests/features`, `tests/mcp`, `tests/worker`.
|
|
70
|
+
- `ruff check` / `ruff format --check` clean on `src tests`; `pyright src` at the `develop`
|
|
71
|
+
baseline; repo hygiene, doc links, website-docs PII and the `website/docs` mirror all green.
|
|
72
|
+
- CI on [#652](https://github.com/ffroliva/gflow-cli/pull/652): **15/15**, including the
|
|
73
|
+
SonarCloud quality gate.
|
|
74
|
+
|
|
75
|
+
## Layer 5 — MCP
|
|
76
|
+
|
|
77
|
+
No CLI leaf, option, or request-DTO field changed. The fix is in `FlowApiClient`, which the MCP
|
|
78
|
+
worker constructs identically to the CLI, so both surfaces inherit it and no `mcp/tools.py`
|
|
79
|
+
change is implied.
|
|
80
|
+
|
|
81
|
+
## Recorded as NOT verified rather than omitted
|
|
82
|
+
|
|
83
|
+
- **A non-`en` account on the MIGRATED origin.** The fix is proven on the old host, where the
|
|
84
|
+
race also occurs — that is what made it testable at all. The reporter's pt-BR migrated account
|
|
85
|
+
is where it originally surfaced, and it has not been re-run there since the fix.
|
|
86
|
+
- **The 4 s bound against a cold first load.** One observed session had `lang` fail to flip
|
|
87
|
+
within 4 s on its first navigation, yet flip in 638 ms two seconds later. Either Flow served
|
|
88
|
+
English on that load (its URL settle also timed out, so no redirect either) or the bound is
|
|
89
|
+
short cold. Unresolved; `client.account_locale_lang_unchanged` is the signal that will tell us.
|
|
90
|
+
- **The `was=pt now=?` demotion introduced in v0.66.2.** Folding only the URL-derived segment
|
|
91
|
+
means a learned `pt` drops to PROVISIONAL whenever the URL settle times out. Self-healing on
|
|
92
|
+
the next redirecting run, and the locale is re-derived per run, so nothing is permanently lost
|
|
93
|
+
— but it is the same *shape* of demotion #643 complained about and deserves a decision.
|
|
94
|
+
- **Whether a wrong locale segment causes a redirect bounce** (`/fx/en/...` on a non-`en`
|
|
95
|
+
account) or merely an English UI. Only the reporter's account can settle this.
|
|
96
|
+
- **Full-suite coverage %.** Run without `--cov` (an unscoped `pytest --cov` OOMs this machine);
|
|
97
|
+
the 80% floor is enforced by CI.
|
|
@@ -4,6 +4,40 @@
|
|
|
4
4
|
|
|
5
5
|
## Current release
|
|
6
6
|
|
|
7
|
+
**v0.66.3 — alpha.** **gflow was reading Flow's locale off the `en` shell it serves before the
|
|
8
|
+
app rewrites it, so every account whose URL could not answer came back English.**
|
|
9
|
+
|
|
10
|
+
Flow serves an `en` shell and sets the real `<html lang>` during hydration. The single early read
|
|
11
|
+
added by [#643](https://github.com/ffroliva/gflow-cli/issues/643) therefore returned `en` — for
|
|
12
|
+
exactly the accounts #643 existed to help, the ones whose URL carries no locale segment. Reported
|
|
13
|
+
by [@maipmacrothorax-75](https://github.com/maipmacrothorax-75) on a pt-BR account resolving `en`
|
|
14
|
+
while both pages served `<html lang="pt">`, with the mechanism offered explicitly as a guess.
|
|
15
|
+
|
|
16
|
+
The guess was right, and it **reproduces on the old host** — so this was never a migration bug.
|
|
17
|
+
Measured, two consecutive loads:
|
|
18
|
+
|
|
19
|
+
| t (ms) | `lang` | `readyState` |
|
|
20
|
+
|---|---|---|
|
|
21
|
+
| 887 | `en` | interactive |
|
|
22
|
+
| **1510** | `en` | **complete** |
|
|
23
|
+
| 2092 | `en` | complete |
|
|
24
|
+
| **2488** | **`pt`** | complete |
|
|
25
|
+
|
|
26
|
+
The useful part of that table is the negative result: **`readyState` reaches `complete` a full
|
|
27
|
+
second before the flip**, so the obvious "wait for complete, then read" would have shipped the
|
|
28
|
+
same bug with more code. DOM node count oscillates and does not discriminate either. Nothing
|
|
29
|
+
cheap predicts the flip, so the resolver now **observes** it — read, bounded-wait for a change,
|
|
30
|
+
re-read — and treats a timeout as an *answer* (the shell value was already correct) rather than a
|
|
31
|
+
failure, logged distinctly so the field can tell the two apart.
|
|
32
|
+
|
|
33
|
+
Verification: [LIVE_VERIFICATION_v0.66.3](LIVE_VERIFICATION_v0.66.3.md). Proven at zero credits:
|
|
34
|
+
the helper captures the flip live (`en` → `pt`, +638 ms) and a real bootstrap on an `en` account
|
|
35
|
+
resolves correctly at the cost of the 4 s bound. Those two are reported **separately**, because
|
|
36
|
+
collapsing a component measurement into a user-facing claim is the mistake v0.66.1 made and
|
|
37
|
+
v0.66.2 corrected.
|
|
38
|
+
|
|
39
|
+
<details><summary>v0.66.2 — the fast-fail that had never fired, and a locale cache answering the wrong question</summary>
|
|
40
|
+
|
|
7
41
|
**v0.66.2 — alpha.** **The fast-fail v0.66.1 announced had never once fired, and the locale
|
|
8
42
|
cache was answering a question nobody asked it.**
|
|
9
43
|
|
|
@@ -42,11 +76,21 @@ day it shipped).
|
|
|
42
76
|
Still not drivable — #639 stays open for that.
|
|
43
77
|
|
|
44
78
|
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).
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
79
|
+
live at zero credits (**exit 0**, real 768x1376 JPEG, twice). The **migrated** path — which no
|
|
80
|
+
maintainer account could reach, because the rollout flapped back mid-work — was verified by
|
|
81
|
+
[@maipmacrothorax-75](https://github.com/maipmacrothorax-75) on a permanently-migrated account:
|
|
82
|
+
**57 s → 4.08–4.26 s**, `ui_driver.migrated_host_bail` present with `at=mode_control` on all nine
|
|
83
|
+
runs, and the crop cascade and agent dismissal both gone. That measurement was posted to #639
|
|
84
|
+
before the tag was cut and was not read in time, so the shipped verification doc understated its
|
|
85
|
+
own result; the correction is recorded there rather than quietly applied.
|
|
86
|
+
|
|
87
|
+
**Found by that same verification and NOT fixed here:** on a pt-BR account the locale resolves
|
|
88
|
+
`en` while both pages serve `<html lang="pt">` — the probe appears to read before the app sets
|
|
89
|
+
the attribute. That is the population #643 was written for, so the `<html lang>` fallback can
|
|
90
|
+
latch a locale the account does not use. Tracked separately; it is not a migration bug.
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
</details>
|
|
50
94
|
|
|
51
95
|
<details><summary>v0.66.1 — a fast-fail that never fired (superseded by v0.66.2)</summary>
|
|
52
96
|
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"""Does `<html lang>` change between goto-return and hydration, and what signals it? (#651)
|
|
2
|
+
|
|
3
|
+
The reporter measured `locale=en` on a pt-BR account whose pages serve
|
|
4
|
+
`<html lang="pt">`, and offered the mechanism as an explicit guess: the probe reads
|
|
5
|
+
the initial HTML shell before the app sets `lang`.
|
|
6
|
+
|
|
7
|
+
Run 1 confirmed the race on the OLD host (no migrated account needed):
|
|
8
|
+
`en` until ~1.9 s, `pt` from ~2.9 s.
|
|
9
|
+
|
|
10
|
+
This run adds `readyState` and a DOM-node count alongside `lang`, to find a
|
|
11
|
+
*hydration signal* the fix can key on instead of a guessed timing constant.
|
|
12
|
+
|
|
13
|
+
Zero credits: navigation only.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import asyncio
|
|
19
|
+
import sys
|
|
20
|
+
from time import perf_counter
|
|
21
|
+
from typing import Any
|
|
22
|
+
|
|
23
|
+
sys.path.insert(0, r"C:\development\github\gflow-cli\src")
|
|
24
|
+
sys.path.insert(0, r"C:\development\github\gflow-cli\scripts\dev")
|
|
25
|
+
|
|
26
|
+
from gflow_cli.api import routes # noqa: E402
|
|
27
|
+
from gflow_cli.api.routes import locale_segment_from_lang_attr # noqa: E402
|
|
28
|
+
|
|
29
|
+
from _spike_common import build_client, resolve_profile_dir # noqa: E402, isort: skip
|
|
30
|
+
|
|
31
|
+
SAMPLES_MS = [0, 200, 400, 600, 900, 1200, 1600, 2000, 2400, 2800, 3200, 4000, 6000]
|
|
32
|
+
|
|
33
|
+
_SNAP = """() => ({
|
|
34
|
+
lang: document.documentElement.lang || '',
|
|
35
|
+
ready: document.readyState,
|
|
36
|
+
nodes: document.querySelectorAll('*').length
|
|
37
|
+
})"""
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
async def _sample(page: Any, label: str, url: str) -> None:
|
|
41
|
+
t0 = perf_counter()
|
|
42
|
+
await page.goto(url, wait_until="domcontentloaded", timeout=45_000)
|
|
43
|
+
rows: list[tuple[int, str, str | None, str, int]] = []
|
|
44
|
+
prev = 0
|
|
45
|
+
for target in SAMPLES_MS:
|
|
46
|
+
if target - prev > 0:
|
|
47
|
+
await page.wait_for_timeout(target - prev)
|
|
48
|
+
prev = target
|
|
49
|
+
try:
|
|
50
|
+
snap = await page.evaluate(_SNAP)
|
|
51
|
+
except Exception as exc: # noqa: BLE001
|
|
52
|
+
snap = {"lang": f"<{type(exc).__name__}>", "ready": "?", "nodes": -1}
|
|
53
|
+
rows.append(
|
|
54
|
+
(
|
|
55
|
+
round((perf_counter() - t0) * 1000),
|
|
56
|
+
snap["lang"],
|
|
57
|
+
locale_segment_from_lang_attr(snap["lang"]),
|
|
58
|
+
snap["ready"],
|
|
59
|
+
snap["nodes"],
|
|
60
|
+
)
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
print(f"\n--- {label} {url}")
|
|
64
|
+
print(f"{'t_ms':>7} {'lang':<8} {'seg':<8} {'readyState':<12} {'DOM nodes'}")
|
|
65
|
+
for ms, lang, seg, ready, nodes in rows:
|
|
66
|
+
print(f"{ms:>7} {lang!r:<8} {seg!r:<8} {ready:<12} {nodes}")
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
async def _main(profile: str) -> int:
|
|
70
|
+
pdir = resolve_profile_dir(profile)
|
|
71
|
+
async with build_client(pdir) as client:
|
|
72
|
+
page = client._page # noqa: SLF001 — dev instrument
|
|
73
|
+
assert page is not None
|
|
74
|
+
print(f"profile={profile} client-resolved locale={client._account_locale!r}") # noqa: SLF001
|
|
75
|
+
await _sample(page, "bootstrap", routes.EDITOR_BOOTSTRAP_URL)
|
|
76
|
+
await _sample(page, "bootstrap (2nd load)", routes.EDITOR_BOOTSTRAP_URL)
|
|
77
|
+
return 0
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
if __name__ == "__main__":
|
|
81
|
+
raise SystemExit(asyncio.run(_main(sys.argv[1] if len(sys.argv) > 1 else "denon82")))
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"""Live proof for #651 — `<html lang>` is read after hydration, not before.
|
|
2
|
+
|
|
3
|
+
Two measurements, deliberately kept distinct, because conflating them is the error
|
|
4
|
+
this whole line of work exists to correct (see the correction block atop
|
|
5
|
+
``docs/LIVE_VERIFICATION_v0.66.1.md``):
|
|
6
|
+
|
|
7
|
+
**A — the helper, exercised against a live page.** ``_settled_lang`` is called
|
|
8
|
+
directly on a real bootstrap page of a **pt** account. This proves the flip is
|
|
9
|
+
captured: the naive early read returns ``en``, the fixed read returns ``pt``. It is
|
|
10
|
+
a component measurement and is labelled as one.
|
|
11
|
+
|
|
12
|
+
**B — the real bootstrap, end to end.** ``FlowApiClient.__aenter__`` on a latched
|
|
13
|
+
profile whose locale *equals* the shell default, which is the case that pays the
|
|
14
|
+
settle timeout. This is the user-visible cost, on the path a user actually takes.
|
|
15
|
+
|
|
16
|
+
Zero credits: navigation only.
|
|
17
|
+
|
|
18
|
+
uv run python scripts/dev/verify_lang_settle_fix.py denon82 ffroliva
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
import asyncio
|
|
24
|
+
import sys
|
|
25
|
+
from pathlib import Path
|
|
26
|
+
from time import perf_counter
|
|
27
|
+
from typing import Any
|
|
28
|
+
|
|
29
|
+
sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "src"))
|
|
30
|
+
|
|
31
|
+
from gflow_cli.api import routes # noqa: E402
|
|
32
|
+
|
|
33
|
+
from _spike_common import build_client, resolve_profile_dir # noqa: E402, isort: skip
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
async def _component_check(profile: str) -> None:
|
|
37
|
+
"""A — does the helper capture the post-hydration value on a live page?"""
|
|
38
|
+
async with build_client(resolve_profile_dir(profile)) as client:
|
|
39
|
+
page: Any = client._page # noqa: SLF001 — dev instrument
|
|
40
|
+
await page.goto(routes.EDITOR_BOOTSTRAP_URL, wait_until="domcontentloaded", timeout=45_000)
|
|
41
|
+
|
|
42
|
+
naive = await page.evaluate("() => document.documentElement.lang || ''")
|
|
43
|
+
t0 = perf_counter()
|
|
44
|
+
settled = await client._settled_lang(page) # type: ignore[attr-defined] # noqa: SLF001
|
|
45
|
+
ms = round((perf_counter() - t0) * 1000)
|
|
46
|
+
|
|
47
|
+
print(f"\n[A · COMPONENT — helper on a live page] profile={profile}")
|
|
48
|
+
print(f" naive early read : {naive!r}")
|
|
49
|
+
print(f" _settled_lang : {settled!r} (+{ms} ms)")
|
|
50
|
+
print(f" verdict : {'CAPTURED THE FLIP' if settled != naive else 'no flip seen'}")
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
async def _end_to_end(profile: str) -> None:
|
|
54
|
+
"""B — what a real bootstrap costs on the account that pays the timeout."""
|
|
55
|
+
t0 = perf_counter()
|
|
56
|
+
async with build_client(resolve_profile_dir(profile)) as client:
|
|
57
|
+
ms = round((perf_counter() - t0) * 1000)
|
|
58
|
+
print(f"\n[B · END-TO-END — real bootstrap] profile={profile}")
|
|
59
|
+
print(f" resolved locale : {client._account_locale!r}") # noqa: SLF001
|
|
60
|
+
print(f" __aenter__ total : {ms} ms")
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
async def _main(flip_profile: str, shell_profile: str) -> int:
|
|
64
|
+
await _component_check(flip_profile)
|
|
65
|
+
await _end_to_end(shell_profile)
|
|
66
|
+
print(
|
|
67
|
+
"\nA is a component measurement; B is the user path. Reporting A's number as"
|
|
68
|
+
"\nthe user-visible one is precisely the v0.66.1 mistake."
|
|
69
|
+
)
|
|
70
|
+
return 0
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
if __name__ == "__main__":
|
|
74
|
+
args = sys.argv[1:] or ["denon82", "ffroliva"]
|
|
75
|
+
raise SystemExit(asyncio.run(_main(args[0], args[1])))
|
|
@@ -22,7 +22,7 @@ import time
|
|
|
22
22
|
import uuid
|
|
23
23
|
from dataclasses import replace as _dataclass_replace
|
|
24
24
|
from datetime import datetime
|
|
25
|
-
from typing import TYPE_CHECKING, Any, NoReturn, Self, TypeVar, cast
|
|
25
|
+
from typing import TYPE_CHECKING, Any, ClassVar, NoReturn, Self, TypeVar, cast
|
|
26
26
|
from urllib.parse import quote, urlsplit, urlunsplit
|
|
27
27
|
|
|
28
28
|
import structlog
|
|
@@ -849,11 +849,7 @@ class FlowApiClient:
|
|
|
849
849
|
# returns None and `next_locale_state` DEMOTES an already-learned locale
|
|
850
850
|
# to PROVISIONAL (measured: a pt account lost its "pt" on every migrated
|
|
851
851
|
# load). Best-effort: a probe failure must never break navigation.
|
|
852
|
-
|
|
853
|
-
lang = await page.evaluate("() => document.documentElement.lang || ''")
|
|
854
|
-
except Exception as exc: # noqa: BLE001 - observation only
|
|
855
|
-
logger.info("client.account_locale_lang_probe_failed", error=type(exc).__name__)
|
|
856
|
-
lang = None
|
|
852
|
+
lang = await self._settled_lang(page)
|
|
857
853
|
segment = routes.locale_segment_from_lang_attr(lang)
|
|
858
854
|
if segment is not None:
|
|
859
855
|
logger.info("client.account_locale_resolved", locale=segment, source="html_lang")
|
|
@@ -861,6 +857,66 @@ class FlowApiClient:
|
|
|
861
857
|
logger.info("client.account_locale_unresolved", last_url=settled)
|
|
862
858
|
return None, None
|
|
863
859
|
|
|
860
|
+
#: How long to wait for `<html lang>` to leave the server-default shell value
|
|
861
|
+
#: (#651). Measured on a pt account, two consecutive loads: the attribute reads
|
|
862
|
+
#: `en` until ~1.9 s and flips to `pt` at 2.26 / 2.49 s. 4 s leaves margin
|
|
863
|
+
#: without being open-ended; a slower network could still exceed it, which the
|
|
864
|
+
#: `lang_unchanged` event makes visible rather than silent.
|
|
865
|
+
_LANG_SETTLE_TIMEOUT_MS: ClassVar[float] = 4_000.0
|
|
866
|
+
|
|
867
|
+
async def _settled_lang(self, page: Any) -> str | None:
|
|
868
|
+
"""Read ``<html lang>`` only after hydration has had a chance to set it (#651).
|
|
869
|
+
|
|
870
|
+
Flow serves an **`en` shell** and the app rewrites ``lang`` during
|
|
871
|
+
hydration, so a single early read returns ``en`` for every account. That is
|
|
872
|
+
not a migrated-origin quirk — it was measured on the OLD host:
|
|
873
|
+
|
|
874
|
+
=========== ========== ==============
|
|
875
|
+
t (ms) ``lang`` ``readyState``
|
|
876
|
+
=========== ========== ==============
|
|
877
|
+
887 ``en`` interactive
|
|
878
|
+
1510 ``en`` **complete**
|
|
879
|
+
2092 ``en`` complete
|
|
880
|
+
**2488** **``pt``** complete
|
|
881
|
+
=========== ========== ==============
|
|
882
|
+
|
|
883
|
+
**``readyState`` is not a usable signal** — it reaches ``complete`` a full
|
|
884
|
+
second *before* the flip, so the obvious "wait for complete, then read" is
|
|
885
|
+
wrong. The DOM node count oscillates (136 → 300 → 249 → 251) and does not
|
|
886
|
+
discriminate either. Nothing cheap predicts the flip, so this observes it.
|
|
887
|
+
|
|
888
|
+
Cost: an account whose real locale IS the shell default never changes the
|
|
889
|
+
attribute and pays the full timeout once per process. That is the price of
|
|
890
|
+
not guessing, and it is bounded; the alternative shipped a wrong locale for
|
|
891
|
+
every account whose URL could not answer.
|
|
892
|
+
"""
|
|
893
|
+
try:
|
|
894
|
+
first = await page.evaluate("() => document.documentElement.lang || ''")
|
|
895
|
+
except Exception as exc: # noqa: BLE001 - observation only
|
|
896
|
+
logger.info("client.account_locale_lang_probe_failed", error=type(exc).__name__)
|
|
897
|
+
return None
|
|
898
|
+
try:
|
|
899
|
+
await page.wait_for_function(
|
|
900
|
+
"initial => (document.documentElement.lang || '') !== initial",
|
|
901
|
+
arg=first,
|
|
902
|
+
timeout=self._LANG_SETTLE_TIMEOUT_MS,
|
|
903
|
+
)
|
|
904
|
+
after = await page.evaluate("() => document.documentElement.lang || ''")
|
|
905
|
+
except Exception as exc: # noqa: BLE001 - a timeout is an ANSWER, not a failure
|
|
906
|
+
# Either the account's locale genuinely equals the shell default, or the
|
|
907
|
+
# page never hydrated within the window. Both leave the first read as the
|
|
908
|
+
# best available answer — which is exactly the pre-#651 behaviour, so this
|
|
909
|
+
# branch can never be worse than what it replaces.
|
|
910
|
+
logger.info(
|
|
911
|
+
"client.account_locale_lang_unchanged",
|
|
912
|
+
lang=first,
|
|
913
|
+
waited_ms=self._LANG_SETTLE_TIMEOUT_MS,
|
|
914
|
+
reason=type(exc).__name__,
|
|
915
|
+
)
|
|
916
|
+
return first
|
|
917
|
+
logger.info("client.account_locale_lang_settled", was=first, now=after)
|
|
918
|
+
return after
|
|
919
|
+
|
|
864
920
|
async def _launch_persistent_context(self, kwargs: JsonObject) -> BrowserContext:
|
|
865
921
|
"""Launch the persistent context; translate a launch-time crash into ProfileLockedError."""
|
|
866
922
|
assert self._pw is not None
|