gflow-cli 0.46.0__tar.gz → 0.46.1__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.46.0 → gflow_cli-0.46.1}/.codex-plugin/plugin.json +1 -1
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/CHANGELOG.md +20 -1
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/KNOWN_ISSUES.md +9 -4
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/PKG-INFO +1 -1
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/INDEX.md +1 -1
- gflow_cli-0.46.1/docs/LIVE_VERIFICATION_v0.46.1.md +78 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/PROJECT_STATUS.md +20 -1
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/pyproject.toml +1 -1
- gflow_cli-0.46.1/scripts/dev/spike_issue404_count_tabs_recon.py +283 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/__init__.py +1 -1
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/api/transports/drivers/agentic.py +2 -1
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/api/transports/ui_automation.py +58 -36
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/api/transports/ui_automation_video.py +9 -5
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/transports/test_ui_automation.py +249 -205
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/transports/test_ui_automation_batch.py +47 -31
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/transports/test_ui_automation_video.py +9 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/e2e/test_agentic_count_enforcement_e2e.py +30 -5
- gflow_cli-0.46.1/tests/e2e/test_classic_count_setter_e2e.py +89 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/uv.lock +1 -1
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/website/docs/KNOWN_ISSUES.md +9 -4
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.agents/plugins/marketplace.json +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.claude/README.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.claude/commands/gflow/active.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.claude/commands/gflow/branch-review.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.claude/commands/gflow/changelog.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.claude/commands/gflow/check.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.claude/commands/gflow/doc-review.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.claude/commands/gflow/issue-assessment.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.claude/commands/gflow/issue-resolve.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.claude/commands/gflow/known-issues.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.claude/commands/gflow/live-verify.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.claude/commands/gflow/llm-council.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.claude/commands/gflow/next.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.claude/commands/gflow/plan.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.claude/commands/gflow/pr-council-review.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.claude/commands/gflow/predict.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.claude/commands/gflow/release.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.claude/commands/gflow/scenario.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.claude/commands/gflow/sonar.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.claude/commands/gflow/status.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.env.template +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.gitattributes +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.github/CODEOWNERS +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.github/copilot-instructions.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.github/dependabot.yml +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.github/workflows/ci.yml +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.github/workflows/external-pr-triage.yml +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.github/workflows/governance-advisory.yml +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.github/workflows/governance-benchmark.yml +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.github/workflows/main-base-guard.yml +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.github/workflows/pages.yml +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.github/workflows/release.yml +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.gitignore +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.gitleaks.toml +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.pre-commit-config.yaml +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/.secrets.baseline +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/AGENTS.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/CLAUDE.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/CONFIGURATION.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/CONTRIBUTING.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/DISCLAIMER.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/LICENSE +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/PLAN.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/README.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/RELEASE.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/ROADMAP.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/conftest.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/deploy/PR-TRIAGE-AUTOPILOT-OPS.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docker-compose.yml +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/AGENT_GUIDE.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/AGENT_UI_E2E.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/AGENT_UI_RECON.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/ASSET_TAGGING_RECON.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/CHARACTER.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/CHARACTER_RECON.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/CONFIGURATION.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/DATA_LAYER.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/DEMOS.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/E2E_TESTING.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/GITHUB.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/GOVERNANCE_BENCHMARK.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/IMAGE_UPSCALE_RECON.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/INSTRUCTIONS.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.21.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.22.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.23.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.24.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.25.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.26.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.27.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.27.1.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.28.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.29.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.30.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.31.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.32.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.32.1.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.33.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.34.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.35.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.36.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.37.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.38.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.38.1.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.39.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.40.0-production-readiness.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.40.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.41.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.42.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.43.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.44.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.45.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.46.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/LIVE_VERIFICATION_video_download.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/MCP.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/MOVIE.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/PROMPT_EXPANSION.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/REFERENCE_STRATEGIES.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/SECURITY.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/TOOLS.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/USAGE.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/USER_GUIDE.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/assets/demo-split-pf.gif +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/assets/example-run.gif +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/assets/examples.webp +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/medium_tutorial.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/schemas/movie-handoff.schema.json +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/sonar-cleanup-tracker.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/superpowers/plans/2026-07-08-pr-triage-autopilot/PLAN.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/superpowers/plans/2026-07-09-camoufox-adoption/PLAN.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/superpowers/plans/2026-07-14-storyboarding-and-visual-curation/PLAN.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/superpowers/plans/2026-07-18-asset-tagging/PLAN.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/superpowers/plans/2026-07-19-live-verify/PLAN.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/superpowers/plans/2026-07-19-production-readiness-browser-lifecycle.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/superpowers/plans/2026-07-19-production-readiness-driver-cdp-verification.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/superpowers/plans/2026-07-19-production-readiness-public-truth.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/superpowers/plans/2026-07-19-production-readiness-queue-safety.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/superpowers/plans/2026-07-26-character-prompt-polishing/PLAN.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/superpowers/plans/2026-07-26-project-name-management/PLAN.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/superpowers/plans/2026-07-26-self-documenting-errors/PLAN.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/superpowers/plans/2026-07-27-overlay-banner-dismissal/PLAN.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/PLAN.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/SCENARIO.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/superpowers/research/2026-06-27-tool-abstraction-evaluation.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/superpowers/specs/2026-06-29-issue-assessment-workflow-design.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/superpowers/specs/2026-07-04-pr-triage-autopilot-design.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/superpowers/specs/2026-07-18-asset-tagging-design.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/superpowers/specs/2026-07-19-live-verify-design.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/superpowers/specs/2026-07-19-production-readiness-hardening-design.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/superpowers/spikes/2026-07-09-camoufox-waf-403.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/superpowers/spikes/2026-07-12-ui-cohort-backend-config.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/docs/superpowers/spikes/2026-07-17-production-readiness-assessment.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/eval/pr_triage_eval.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/eval/pr_triage_fixtures.json +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/examples/README.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/examples/batch_from_config.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/examples/multi_prompt_t2i.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/examples/sample_config.json +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/examples/sample_prompts.txt +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/examples/single_image_t2i.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/examples/workflow_chain.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/index.html +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/llms.txt +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/samples/README.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/samples/captured/01_upload_image.json +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/samples/captured/04_archive_workflow.json +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/samples/captured/05_createProject.json +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/samples/captured/06_batchGenerateImages.json +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/samples/captured/12_create_scene.json +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/samples/captured/13_sceneWorkflows_update.json +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/samples/captured/14_get_scene_workflows.json +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/samples/captured/15_commit_flowWorkflow.json +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/autopilot/Dockerfile.triage +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/autopilot/entrypoint.sh +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/autopilot/pr_triage_autopilot.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/autopilot/pr_triage_gate.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/autopilot/run_sandboxed_review.sh +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/ci/check_doc_links.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/ci/check_materiality.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/ci/check_release_artifacts.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/ci/check_repo_hygiene.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/ci/check_website_docs_pii.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/ci/generate_website_docs.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/debug_editor.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/debug_gen_settings.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/debug_settings.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/_recording_client.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/_spike_common.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/active_plan.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/capture_image_add_media_dom.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/capture_locale_invariants.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/cdp_drive_and_probe.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/character_create_spike.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/character_create_spike_v2.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/dump_character_selectors.js +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/incident_bundle_quality.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/make_project.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/materiality_backtest.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/monitor_pr_38.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/patch_character.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/skillopt/README.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/skillopt/harness.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/skillopt/tasks.json +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/sonar-local-scan.sh +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/sonar-pre-push-gate.sh +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/spike_char_editor_dom.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/spike_char_gen_capture.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/spike_character_prompt_format.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/spike_image_upscale_capture.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/spike_image_upscale_drive.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/spike_incident_live.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/spike_issue313_agent_mode_controls.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/spike_issue314_picker_filename_search.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/spike_mode_roundtrip.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/spike_mode_switch_agentic_to_classic.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/spike_movie_attach_payload.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/spike_movie_entity_recon.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/spike_movie_gen_capture.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/spike_movie_picker_select.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/spike_movie_voice_list.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/spike_patch_entity.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/dev/spike_patchright.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/diag/README.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/diag/capture_flow_traffic.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/diag/memory_profile.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/diag/recaptcha_mint.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/diag/spike_387_openai_compat.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/e2e/capture_agent_toggle.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/record_demo.ps1 +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/smoke_image.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/smoke_video_editor.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/smoke_worker_style.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/spike_waf_camoufox.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/scripts/verify_chrome_auth_viability.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/skills/README.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/skills/changelog/SKILL.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/skills/check/SKILL.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/skills/doc-review/SKILL.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/skills/gflow-cli/SKILL.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/skills/issue-assessment/SKILL.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/skills/issue-resolve/SKILL.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/skills/known-issues/SKILL.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/skills/live-verify/SKILL.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/skills/llm-council/SKILL.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/skills/plan/SKILL.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/skills/pr-council-review/SKILL.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/skills/predict/SKILL.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/skills/release/SKILL.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/skills/scenario/SKILL.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/skills/sonar/SKILL.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/skills/status/SKILL.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/sonar-project.properties +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/__main__.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/_cli_helpers.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/api/__init__.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/api/_engine.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/api/_retry.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/api/_sapisidhash.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/api/character.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/api/client.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/api/dto.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/api/image.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/api/image_upscale.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/api/recaptcha.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/api/routes.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/api/scene.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/api/transports/__init__.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/api/transports/_common.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/api/transports/base.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/api/transports/drivers/base.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/api/transports/drivers/classic.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/api/transports/drivers/factory.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/api/transports/mode_control.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/api/video.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/auth/__init__.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/auth/base.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/auth/cookies.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/auth/factory.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/auth/internal_chromium.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/auth/real_chrome.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/auth/strategies.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/auth/verification.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/browser_manager.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/chain.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/chain_manifest.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/cli.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/cli_character.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/cli_data.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/cli_image.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/cli_instructions.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/cli_models.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/cli_movie.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/cli_project.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/cli_run.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/cli_scene.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/cli_tools.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/cli_video.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/composition.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/config.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/data/__init__.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/data/chain_repo.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/data/migrations/0007_queue.sql +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/data/migrations/0008_add_operation_expanded_prompt.sql +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/data/migrations/0009_queue_claims.sql +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/data/migrations/__init__.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/data/models.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/data/queries.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/data/recorder.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/data/redaction.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/data/repository.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/data/store.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/diagnostics.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/errors.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/exceptions.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/image_batch.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/json_output.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/mcp/__init__.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/mcp/prompts.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/mcp/resources.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/mcp/server.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/mcp/tools.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/media.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/movie_manifest.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/observability.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/paths.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/profile_lease.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/profile_store.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/redaction.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/services/__init__.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/services/character_create.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/services/mentions.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/storage.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/tools/__init__.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/tools/banned.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/tools/builtin/__init__.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/tools/builtin/creative-director.toml +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/tools/builtin/reverse-engineer.toml +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/tools/builtin/storyboard.toml +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/tools/expander.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/tools/invocation.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/tools/loader.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/tools/registry.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/tools/runtime.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/tools/spec.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/ui/app.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/ui/server.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/worker/codec.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/worker/daemon.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/src/gflow_cli/worker/queue.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tasks/lessons.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/test_assets/sample_batch.json +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/test_assets/sample_batch.tsv +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/test_assets/sample_batch_invalid.tsv +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/__init__.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/__init__.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/fixtures/character_gen_response.json +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/fixtures/patch_entity_response.json +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/test_aisandbox_auth_error.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/test_aisandbox_auth_headers.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/test_bearer_redaction.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/test_character.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/test_client.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/test_client_character.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/test_client_delete_characters.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/test_client_errors.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/test_client_generate_character.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/test_client_image.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/test_client_incidents.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/test_client_launch_kwargs.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/test_client_patch_entity.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/test_client_scene.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/test_client_upscale.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/test_concurrency.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/test_dto.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/test_engine.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/test_image.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/test_image_dto.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/test_image_upscale.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/test_post_json_aisandbox_auth.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/test_recaptcha.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/test_retry.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/test_routes.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/test_routes_character.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/test_routes_scene.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/test_sapisidhash_helper.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/test_scene_models.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/test_video.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/test_video_request.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/transports/__init__.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/transports/conftest.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/transports/drivers/test_agentic.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/transports/drivers/test_classic.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/transports/drivers/test_factory.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/transports/drivers/test_ui_mode.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/transports/test_agentic_cohort_detection.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/transports/test_base.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/transports/test_bearer.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/transports/test_common.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/transports/test_evaluate_fetch.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/transports/test_factory.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/transports/test_fingerprint.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/transports/test_mode_control.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/transports/test_sapisidhash.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/transports/test_selector_symmetry.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/transports/test_transport_timeout.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/api/transports/test_ui_character_editor.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/auth/strategies/test_factory.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/auth/strategies/test_strategies.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/auth/test_cookies.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/auth/test_real_chrome.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/auth/test_verification.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/autopilot/test_pr_triage_autopilot.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/cli/__init__.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/cli/test_cli_auth_list.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/cli/test_cli_character.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/cli/test_cli_character_create.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/cli/test_cli_data.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/cli/test_cli_data_errors.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/cli/test_cli_data_errors_retention.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/cli/test_cli_image.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/cli/test_cli_image_seed_removed.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/cli/test_cli_image_selector_drift.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/cli/test_cli_image_upscale.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/cli/test_cli_image_uuid_ref_enrichment.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/cli/test_cli_instructions.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/cli/test_cli_models.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/cli/test_cli_movie.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/cli/test_cli_run.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/cli/test_cli_scene.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/cli/test_cli_tools.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/cli/test_cli_video.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/cli/test_cli_video_chain.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/cli/test_error_handling.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/cli/test_failure_funnel.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/cli/test_helpers.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/cli/test_incident_output.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/cli/test_movie_manifest.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/cli/test_movie_manifest_style_variants.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/cli/test_settings_validation.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/cli/test_t2i_multi_prompt.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/composition/test_character.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/composition/test_compose_prompt.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/composition/test_handoff.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/composition/test_style_variants.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/composition/test_style_variants_e2e.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/conftest.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/data/__init__.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/data/test_chain_repo.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/data/test_failure_recording.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/data/test_find_incomplete_character.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/data/test_models.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/data/test_packaging.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/data/test_recorder.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/data/test_recorder_character.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/data/test_redaction.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/data/test_repository.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/data/test_scene_persistence.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/data/test_settings_and_errors.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/data/test_store_migrations.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/dev/test_recording_client.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/e2e/__init__.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/e2e/conftest.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/e2e/test_aisandbox_auth_live.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/e2e/test_asset_tagging_e2e.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/e2e/test_auth_verification_e2e.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/e2e/test_cancellation_e2e.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/e2e/test_chain_e2e.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/e2e/test_character_create_e2e.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/e2e/test_crash_recovery_e2e.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/e2e/test_daemon_e2e.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/e2e/test_data_layer_e2e.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/e2e/test_entity_smuggling_e2e.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/e2e/test_i2v_flags_e2e.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/e2e/test_image_batch_e2e.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/e2e/test_image_uuid_ref_e2e.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/e2e/test_incident_quality_e2e.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/e2e/test_json_output_e2e.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/e2e/test_live_agentic_instructions.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/e2e/test_locale_selectors_e2e.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/e2e/test_project_naming_e2e.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/e2e/test_scene_compose_live.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/e2e/test_tools_e2e.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/e2e/test_transports_e2e.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/e2e/test_video_t2v_e2e.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/features/__init__.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/features/asset_tagging.feature +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/features/auth.feature +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/features/auth_login.feature +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/features/character_create.feature +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/features/character_read.feature +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/features/conftest.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/features/image.feature +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/features/image_upscale.feature +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/features/incident_diagnostics.feature +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/features/instructions.feature +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/features/locale_picker_include.feature +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/features/test_asset_tagging_steps.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/features/test_auth_login_steps.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/features/test_auth_steps.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/features/test_character_create_steps.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/features/test_character_read_steps.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/features/test_image_steps.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/features/test_image_upscale_steps.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/features/test_incident_diagnostics_steps.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/features/test_instructions_steps.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/features/test_locale_picker_include_steps.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/features/test_step_collision_guard.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/features/test_video_agent_ui_steps.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/features/test_video_chain_steps.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/features/video_agent_ui.feature +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/features/video_chain.feature +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/fixtures/__init__.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/fixtures/seeded_catalog.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/image_batch/__init__.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/image_batch/test_image_manifest.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/image_batch/test_jitter_config.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/image_batch/test_observability_events.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/integration/__init__.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/integration/conftest.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/integration/constants.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/integration/test_expander_gateway.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/integration/test_storage_gcs.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/integration/test_storage_s3.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/mcp/__init__.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/mcp/conftest.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/mcp/test_cli_parity.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/mcp/test_server.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/mcp/test_stdio_transport.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/mcp/test_tools_helpers.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/mcp/test_tools_instructions.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/mcp/test_tools_wired.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/scripts/test_capture_locale_invariants.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/scripts/test_check_materiality.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/scripts/test_check_release_artifacts.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/scripts/test_check_repo_hygiene.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/scripts/test_check_website_docs_pii.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/scripts/test_codex_plugin.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/scripts/test_generate_website_docs.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/scripts/test_incident_bundle_quality.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/scripts/test_materiality_backtest.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/services/__init__.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/services/test_character_create_redaction.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/services/test_character_create_saga.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/services/test_character_gen_no_direct_post.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/services/test_mentions_observability.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/services/test_mentions_parse.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/services/test_mentions_resolve.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/services/test_resolve_and_apply.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/smoke/__init__.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/smoke/test_profile_account_smoke.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/smoke/test_real_flow.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/test_auth.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/test_browser_manager.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/test_chain.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/test_chain_manifest.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/test_cli_data.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/test_cli_project.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/test_config.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/test_conftest_isolation.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/test_data_queries.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/test_diagnostics_bundle.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/test_diagnostics_events.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/test_diagnostics_journal.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/test_diagnostics_recorder.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/test_diagnostics_retention.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/test_diagnostics_sanitize.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/test_documentation_gate.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/test_errors.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/test_errors_classification.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/test_json_output.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/test_marker_registry.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/test_media.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/test_observability.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/test_overlay_banner_dismissal.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/test_paths.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/test_profile_lease.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/test_profile_lease_subprocess.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/test_profile_store.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/test_self_documenting_errors.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/test_smoke.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/tools/__init__.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/tools/test_banned.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/tools/test_expander.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/tools/test_invocation.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/tools/test_loader.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/tools/test_registry.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/tools/test_runtime.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/tools/test_spec.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/ui/test_app.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/worker/test_codec.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/worker/test_daemon.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/worker/test_mcp_daemon_race.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/worker/test_queue.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/worker/test_queue_multiprocess.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/tests/worker/test_queue_reconciliation.py +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/website/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/website/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/website/docs/CHARACTER.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/website/docs/CONFIGURATION.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/website/docs/DATA_LAYER.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/website/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/website/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/website/docs/E2E_TESTING.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/website/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/website/docs/INSTRUCTIONS.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/website/docs/MCP.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/website/docs/MOVIE.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/website/docs/PROMPT_EXPANSION.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/website/docs/SECURITY.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/website/docs/TOOLS.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/website/docs/USAGE.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/website/docs/USER_GUIDE.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/website/docs/agents.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/website/docs/index.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/website/docs/installation.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/website/docs/onboarding-mockup.html +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/website/docs/onboarding.md +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/website/docs/stylesheets/extra.css +0 -0
- {gflow_cli-0.46.0 → gflow_cli-0.46.1}/website/mkdocs.yml +0 -0
|
@@ -7,6 +7,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.46.1] — 2026-07-31
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- **`image t2i` failed whenever `-n` differed from the displayed count — including
|
|
15
|
+
the default `-n 1` (#404).** Flow renamed the composer's count-tab labels from
|
|
16
|
+
`1x`/`x2`/… to `x1`/`x2`/…, so the count setter's label filter silently dropped
|
|
17
|
+
the count-1 tab and its positional pick clicked the wrong tab (reporting
|
|
18
|
+
per-click success while the value never changed). The count tab is now selected
|
|
19
|
+
by the digit in its label across both label cohorts (`1x`/`x1`), the read-back recognises a
|
|
20
|
+
selected `x1`, and non-convergence raises `UiSelectorDriftError` (exit 23)
|
|
21
|
+
naming desired vs displayed — instead of a bare `RuntimeError` that
|
|
22
|
+
observability hashed into an opaque `UnexpectedError`. The per-click
|
|
23
|
+
`count_click_result` log now carries `effect_observed`, and the video output
|
|
24
|
+
count setter probes both label cohorts too. Verified live on the classic
|
|
25
|
+
composer (new e2e: `tests/e2e/test_classic_count_setter_e2e.py`; evidence:
|
|
26
|
+
[LIVE_VERIFICATION_v0.46.1](docs/LIVE_VERIFICATION_v0.46.1.md)).
|
|
27
|
+
|
|
10
28
|
## [0.46.0] — 2026-07-28
|
|
11
29
|
|
|
12
30
|
### Changed
|
|
@@ -2518,7 +2536,8 @@ shell-script template that branches on these codes.
|
|
|
2518
2536
|
|
|
2519
2537
|
First skeleton. Not functional end-to-end yet.
|
|
2520
2538
|
|
|
2521
|
-
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.46.
|
|
2539
|
+
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.46.1...HEAD
|
|
2540
|
+
[0.46.1]: https://github.com/ffroliva/gflow-cli/compare/v0.46.0...v0.46.1
|
|
2522
2541
|
[0.46.0]: https://github.com/ffroliva/gflow-cli/compare/v0.45.0...v0.46.0
|
|
2523
2542
|
[0.45.0]: https://github.com/ffroliva/gflow-cli/compare/v0.44.0...v0.45.0
|
|
2524
2543
|
[0.44.0]: https://github.com/ffroliva/gflow-cli/compare/v0.43.0...v0.44.0
|
|
@@ -118,7 +118,8 @@ denon82 profile (aborted pre-submit, saving the 10-credit generation).
|
|
|
118
118
|
**Root cause (confirmed live 2026-07-11, screenshot evidence on #288): the
|
|
119
119
|
duration control is ABSENT from this cohort's settings popover** — the panel
|
|
120
120
|
renders mode tabs (Imagem/Video), sub-mode (Frames/Elementos), aspect
|
|
121
|
-
(9:16/16:9), count (1x–x4
|
|
121
|
+
(9:16/16:9), count (1x–x4; labels renamed to xN since — see #404), and the
|
|
122
|
+
model dropdown (Veo 3.1 - Lite), and
|
|
122
123
|
nothing else. The earlier locale hypothesis is refuted: the UI renders in
|
|
123
124
|
Portuguese and the sibling count tabs (`1x`/`x2`) match fine; there is simply
|
|
124
125
|
no duration row to click. Whether Flow removed clip-length selection for this
|
|
@@ -629,10 +630,14 @@ issue and not blocked by any code change in this repo.
|
|
|
629
630
|
locale-leak fix.
|
|
630
631
|
|
|
631
632
|
**Earlier — Phase 7 multi-image-prompt work** addressed the count-tab selectors:
|
|
632
|
-
- `_COUNT_TAB_TEXT_RE = ^(1x|x[
|
|
633
|
+
- `_COUNT_TAB_TEXT_RE = ^(1x|x[1-4])$` only matches the digit+x format Flow
|
|
633
634
|
renders identically in every locale (numbers/symbols are not translated).
|
|
634
|
-
|
|
635
|
-
|
|
635
|
+
Widened for #404: Flow renamed the count-1 label from `1x` to `x1`
|
|
636
|
+
(uniform `xN`, live-verified 2026-07-31); both cohorts are accepted.
|
|
637
|
+
- `_set_count` clicks the tab carrying the desired DIGIT (`1x`/`x1` for
|
|
638
|
+
count=1), not a position — the #404 rename shrank the old filtered set and
|
|
639
|
+
shifted every `.nth(count - 1)` pick by one. Non-convergence raises
|
|
640
|
+
`UiSelectorDriftError` (exit 23) with desired vs displayed counts.
|
|
636
641
|
|
|
637
642
|
**Earlier — PR #48:**
|
|
638
643
|
- Added `--lang=en-US` Chromium launch arg; parts of `NEW_PROJECT_SELECTORS` /
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gflow-cli
|
|
3
|
-
Version: 0.46.
|
|
3
|
+
Version: 0.46.1
|
|
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
|
|
@@ -135,7 +135,7 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
|
|
|
135
135
|
**"A command failed — where is the incident bundle and what's in it?"** → [DEBUGGING § Automatic incident bundles](DEBUGGING.md#automatic-incident-bundles) (layout, triggers, review-before-sharing); privacy boundaries: [SECURITY § Automatic incident bundles](SECURITY.md#automatic-incident-bundles-gflow_cli_incident_capture-default-on); disable via [CONFIGURATION § GFLOW_CLI_INCIDENT_CAPTURE](CONFIGURATION.md#gflow_cli_incident_capture)
|
|
136
136
|
**"Flow's UI broke a selector — how do I diagnose it?"** → [DEBUGGING § Inspecting Flow's live UI](DEBUGGING.md#inspecting-flows-live-ui)
|
|
137
137
|
**"What does each `ui_automation.*` log event mean?"** → [DEBUGGING § Listener & HTTP-layer debugging](DEBUGGING.md#listener--http-layer-debugging)
|
|
138
|
-
**What was actually live-verified for the latest release?** → latest: [LIVE_VERIFICATION_v0.46.0](LIVE_VERIFICATION_v0.46.0.md) (**#387 provider-agnostic prompt-tools transport live-verified 2026-07-28, ZERO credits** — a four-probe capability spike passed 4/4 against BOTH a non-Google gateway and Google's OpenAI-compat endpoint, including a *semantic* multimodal check [a generated solid-red JPEG round-tripped and the model answered 'Red'], which is what proved the native Gemini `inlineData` path could be deleted outright rather than kept as a fallback; the real CLI then returned `was_expanded: true` on gateway/gateway-no-model/Google-default, emitted the loud one-time notice + no-op for the removed `GFLOW_CLI_GEMINI_API_KEY`, and made NO network call when unconfigured. Live verification caught two defects a fully green 2849-test offline suite missed: Google's compat endpoint has no server-side default model [`400 "model is not specified"`, silently no-oping the DEFAULT configuration], and the first redirect guard did not actually work because `build_opener()` installs its default handlers regardless of arguments, so `Authorization` would still have been replayed cross-host. `/code-review high` is recorded as NOT run — it is user-triggered only). Prior: [v0.45.0](LIVE_VERIFICATION_v0.45.0.md) (**#393 UUID `--ref` binding + #395 character-entity binding live-verified 2026-07-27/28** — a controlled A/B on identical input flipped `--ref` from exit 9 to exit 0 via the catalog-backed upload fallback, with the anti-silence guard [an unbindable ref aborts non-zero and writes no image] pinned by a live e2e; picker DOM + HAR showed Flow indexes a short auto-caption, NOT the prompt, so a prompt-derived search hint was dropped rather than shipped on assumption; a CDP spike against Flow's own character flow then captured the `entityContext` contract that gflow's generations were missing, root-causing #395 to two gflow defects [overlay dismissal Escaping Flow's own composer, and a character-route bounce that sent the prompt to the project composer] — both fixed, both character e2e tests now pass live, including `--format-prompt` [#383], with a read-back confirming the character carries its name and `thumbnail_media_id`). Prior: [v0.44.0](LIVE_VERIFICATION_v0.44.0.md) (**#381 dual-side project management & Playwright Chromium transport live-verified 2026-07-26** — real-editor project creation + rename tRPC server/DOM sync, prompt slugging, `gflow project` subcommand family, HTTP 429 adaptive backoff, and full E2E test suite). Prior: [v0.43.0](LIVE_VERIFICATION_v0.43.0.md) (**private incident diagnostics live-verified 2026-07-23, 1 Veo credit**). Prior: [v0.42.0](LIVE_VERIFICATION_v0.42.0.md) (**#361 production-readiness live-gaps confirmed live 2026-07-21, 1 Veo credit** — a real `veo-lite` t2v through the worker path persisted a real `remote_started` checkpoint [observer→checkpoint→DB chain confirmed], crash-recovery classified the task `indeterminate` without resubmitting, and mid-launch cancellation released the `ProfileLease` credit-free; full evidence in [v0.40.0-production-readiness § "2026-07-21 live follow-up"](LIVE_VERIFICATION_v0.40.0-production-readiness.md#2026-07-21-live-follow-up-0420-cycle); #359 content-safety `400`→`ContentPolicyError` classification is unit-covered, not live-triggered [would require a deliberate policy violation]; #360/#362 are docs-only, verified by the documentation gates). Prior: [v0.41.0](LIVE_VERIFICATION_v0.41.0.md) (**#357 production-readiness hardening — stale-session fail-fast, free image gen, paid veo-lite T2V all proven live**). Prior: [v0.40.0](LIVE_VERIFICATION_v0.40.0.md) (**#344 `@`-mention asset-tagging resolution proven live e2e, ~2 Imagen credits** — `gflow character create` staged a real taggable character [bound reference images, `has_reference_images` guard], the e2e test's documented propagation wait cleared Flow's `projectInitialData` lag, and `gflow image t2i "@Zoro …"` passed with returncode 0, a real generated image, and the correctly de-tagged prompt in the catalog — no code changes needed, `resolve_and_apply` as merged in #344 already works end-to-end; pre-existing unrelated issue #174 [Flow media-library A/B flake] can still intermittently block generation regardless of this feature — recorded, not omitted). Prior: [v0.39.0](LIVE_VERIFICATION_v0.39.0.md) (**#341 failed-generation persistence proven live** — a real `image t2i` on denon82 failed at the wire [`batchGenerateImages` HTTP 400 → `WireFormatError`] and the record-on-catch funnel wrote the **first-ever `failed` row** into the production catalog [`error_type=wire-format`, redacted `error_detail`, browsable via `gflow data list errors`], **$0**; the remaining paid paths [video/chain/batch/movie/worker] are funnel-regression-tested, not force-failed live [would cost credits], and the status-aware `succeeded=false` video-poll fix is unit-locked — recorded, not omitted). Prior: [v0.38.1](LIVE_VERIFICATION_v0.38.1.md) (**#338 agentic-pin recovery proven live ON the pinned account** — run 1 caught the composer-render race the unit suite could not [`ensure_media_incomplete` +115 ms, toggle never reached]; the readiness-wait fix landed and run 2 recovered classic on denon82 after ~2h of pin [`ui_driver.bound mode=classic`, real 768×1376 JPEG, exact prompt adherence]; reload branch unit-locked, live trigger not observed this cycle — recorded, not omitted). Prior: [v0.38.0](LIVE_VERIFICATION_v0.38.0.md) (**#332 mode control + #314 i2i ref dedup proven live e2e** — `image t2i --ui-mode classic` recovered agentic→classic in a real run [`ui_mode.attempt_exit_agent` → full classic chain, 1376×768 JPEG]; two identical `image i2i` runs proved the dedup contract [run 1: picker miss → `image_uploaded`; run 2: `reference_deduped_by_filename`, ZERO uploads]; `video t2v` veo-fast [`MEDIA_GENERATION_STATUS_SUCCESSFUL`, 15.2 MB `ftyp` mp4]; autopilot #333 recorded deferred-with-reason [hermes-ops deployment staged separately]). Prior: [v0.37.0](LIVE_VERIFICATION_v0.37.0.md) (**viewport 1920×1080 + agentic count enforcement + FIPS-safe SAPISIDHASH proven live e2e** — `image t2i` [classic cohort, real 1376×768 JPEG] and `video t2v` veo-fast [`MEDIA_GENERATION_STATUS_SUCCESSFUL`, 11.5 MB `ftyp` mp4] both succeeded end-to-end at the new 1920×1080 viewport with every selector resolving [no drift]; SAPISIDHASH digest verified byte-identical [FIPS-safe `usedforsecurity=False`], auth unchanged). Prior: [v0.36.0](LIVE_VERIFICATION_v0.36.0.md) (**#316 diagnostic tooling live-verified against real Flow traffic** — `GFLOW_CLI_HAR_PATH` captured a real 54-entry HAR [real Flow domains, 34× 200s, and a genuine 401 the tool exists to diagnose]; `GFLOW_CLI_DEBUG_TRACEBACK`'s typed-error scoping confirmed live [console output identical with/without the flag on a `GFlowError`]; unhandled-path behavior covered by 6 new tests (30 total across both files) + SDD task review; #312 reference-entity-smuggling fix covered by its own dedicated e2e test). Prior: [v0.35.0](LIVE_VERIFICATION_v0.35.0.md) (**#305-follow-up multimodal reverse-engineering & storyboard tool proven live e2e** — `gflow tools run storyboard` successfully deconstructed a cyberpunk scene into a cohesive 4-panel sequence; `reverse-engineer` tool extracts frames from video streams/URLs using `claude-video`'s `watch.py` and produces structured prompt components using Gemini multimodal models; dynamic token budgeting and strict Pyright types verified via test suite). Prior: [v0.34.0](LIVE_VERIFICATION_v0.34.0.md) (**#299 `--ui-mode` gate proven live, ZERO credits** — drove `get_ui_driver` directly over 4 real editor loads, never generated: bidirectional switch works [classic→agentic via `_force_agent_mode`, agentic→classic via `_exit_agent_mode`, each DOM-reverified], `agentic`-when-already-agentic is idempotent, and a timed-out toggle → **exit-28 fail-fast before submission**; deprecation behavior-change [`prefer_classic`→exit 28] confirmed). Prior: [v0.33.0](LIVE_VERIFICATION_v0.33.0.md) (**#287-follow-up picker fix proven live on the original repro** — the v0.32.1-failing `i2v <uuid> --project <crowded>` command now exits 0 with a real 3.0 MB `ftyp` mp4, `frame_ref_attached` + `video_saved`, zero uploads; **#241 jitter live-verified on both paths** — flag `--jitter 4-6` → `batch_jitter_sleep seconds=4.98`, and the new 0.5–1.5 s default → `seconds=1.47`, each firing exactly once between two t2i submissions; environment note: the denon82 cohort is now natively agentic and round-2 generations hit the pre-existing #281 `MediaAttributionError`, not a regression). Prior: [v0.32.1](LIVE_VERIFICATION_v0.32.1.md) (**#293 teardown fix live-verified credit-free** — error-path aborts leave ZERO chrome.exe holding the profile [3× leak reproduced pre-fix same day]; force-close fallback + ProfileLockedError translation unit-pinned; #283 wave logic fixes mock-verified to exact call counts). Prior: [v0.32.0](LIVE_VERIFICATION_v0.32.0.md) (**#287 UUID i2v frames proven live e2e** — an in-project asset selected by media UUID in the frame-slot dialog [frame_ref_attached, startImage bound on the wire, ZERO upload events] produced a real 720×1280 interpolation, resolving the #237 negative prior; foreign UUID → exit 9 pre-generation with screenshot; **#288 duration fail-fast proven live** — exit 23 pre-submit saved a 10-credit generation, and the debug screenshot confirmed the duration control is ABSENT from the cohort's settings popover [locale hypothesis refuted]; upload-400 exit-27 repro deferred-with-reason — the original rejected JPEG no longer exists). Prior: [v0.31.0](LIVE_VERIFICATION_v0.31.0.md) (**#281 wrong-media defenses live-verified in BOTH directions, credit-free** — correct attribution downloads with real wire metadata [seed, 768×1376]; the incident-class lazy-render ambiguity reproduced live and hard-stopped with `MediaAttributionError` exit 26 naming every candidate UUID, no file written; **#282 two-UUID-ref i2i proven e2e** — both freshly generated portrait UUIDs picker-selected into one scene with both canonical identities visually transferred). Prior: [v0.30.0](LIVE_VERIFICATION_v0.30.0.md) (**agentic-cohort image path + both fixes live-verified credit-free** — native 768×1376 stills, i2i-chain + canonical-ref identity hold; the character-create `DataIntegrityError` and the `prefer_classic` WARNING were observed live then fixed [recorder idempotent + INFO log]; MCP video-param feature deferred-with-reason on Veo credits, per the stills-only goal). Prior: [v0.29.0](LIVE_VERIFICATION_v0.29.0.md) (**persistent `gflow instructions` CRUD proven live e2e GREEN, credit-free** — 11-command sequence on a fresh project: add incl. `--ref <image-UUID>` attach, list/enable/disable, master toggle both ways, TOML `apply` destructive full-sync with `enabled=false` honored, `rm` with server card-id preserved across mutations; movie brief-sync code-path-verified via the same primitives, deferred-with-reason on credits; MCP `gflow_instructions_*` tools are thin adapters over the live-verified primitives). Prior: [v0.28.0](LIVE_VERIFICATION_v0.28.0.md) (**agent instructions `-i` now steer agentic generation — crayon e2e GREEN**: a style-neutral prompt + an enabled "crayon" card produced an unmistakable crayon drawing through the real transport; root causes were conversational phrasing + the `project_brief.enabled` master switch). Prior: [v0.27.1](LIVE_VERIFICATION_v0.27.1.md) (**v0.27.0 release follow-up fixes and documentation sync**). Prior: [v0.27.0](LIVE_VERIFICATION_v0.27.0.md) (**`[style]` block with named variants + prompt-aware resume — credit-free CLI verification**: real `movie run --dry-run` 3-way ledger proving resolved-style display, `skip (done)` on matching `style_hash`, and `re-run (style changed)` after a style edit; composition is local, wire path untouched, so no Veo credits spent — first credited styled run will confirm visually). Prior: [v0.26.0](LIVE_VERIFICATION_v0.26.0.md) (**image i2i by generated-image UUID proven live e2e GREEN** — the existing asset is *selected in place* by its media UUID, no duplicate upload, producing an i2i output that references it; plus generated-image `display_name` capture, credited @C1ph3r404). Prior: [v0.25.0](LIVE_VERIFICATION_v0.25.0.md) (**#237 remote-UUID i2v proven live e2e GREEN** — a real 8s 720×1280 interpolation from a generated image's UUID, after the picker-search attach was reworked to local upload; #240 home-`.env` matrix live; plus two silent-failure guards root-caused live: video-as-image download rejection and rejected-upload fail-loud). Prior: [v0.24.0](LIVE_VERIFICATION_v0.24.0.md) (--project parity across CLI + MCP — automated coverage; live gen auth-gated). Prior: [v0.23.0](LIVE_VERIFICATION_v0.23.0.md) (MCP generation wiring proven live end-to-end — tool→worker→real Flow REST→structured-error translation; final image-write blocked by an expired session, environmental. #222 macOS fix reporter-verified e2e on Apple Silicon). Prior: [v0.22.0](LIVE_VERIFICATION_v0.22.0.md) (Tools framework — automated/CI coverage complete; credit/key-gated live feature run is a pending owner gate, see the doc) · [v0.21.0](LIVE_VERIFICATION_v0.21.0.md) (MCP server over stdio + HTTP/SSE — credit-free protocol handshake; 4 tools / 2 prompts / 3 resources confirmed on stdout) · [v0.20.1](LIVE_VERIFICATION_v0.20.1.md) · [v0.20.0](LIVE_VERIFICATION_v0.20.0.md) · [v0.19.0](LIVE_VERIFICATION_v0.19.0.md) · [v0.18.0](LIVE_VERIFICATION_v0.18.0.md) · [v0.17.0](LIVE_VERIFICATION_v0.17.0.md) · [v0.16.0](LIVE_VERIFICATION_v0.16.0.md) · [v0.13.0](LIVE_VERIFICATION_v0.13.0.md) · [v0.12.0](LIVE_VERIFICATION_v0.12.0.md) · [v0.11.0](LIVE_VERIFICATION_v0.11.0.md) · [v0.10.0](LIVE_VERIFICATION_v0.10.0.md) · [v0.9.1](LIVE_VERIFICATION_v0.9.1.md) · [v0.9.0](LIVE_VERIFICATION_v0.9.0.md) · [v0.8.1](LIVE_VERIFICATION_v0.8.1.md) · [v0.7.0](LIVE_VERIFICATION_v0.7.0.md)
|
|
138
|
+
**What was actually live-verified for the latest release?** → latest: [LIVE_VERIFICATION_v0.46.1](LIVE_VERIFICATION_v0.46.1.md) (**#404 classic count-setter fix live-verified 2026-07-31 on the reporter's exact environment, ZERO credits** — credit-free DOM recon proved Flow renamed the count-tab labels to uniform `xN` [`x1` replaces `1x`, image AND video rows], that `nth(0)` of the old filtered set landed on the selected `x2` and actively moved the count AWAY from the target, and that a digit-keyed click on `x1` converges instantly and persists without a Save commit; the new classic e2e then passed live [count=1 against a fresh project displaying 2 → exactly 1 image; count=2 early-exit → exactly 2], and the #313 agentic count-enforcement e2e passed 4/4 [counts 1–4 vs deliberately mismatched sticky defaults, magic-byte-verified downloads] after its stale setup was repaired [Flow now loads the editor in classic mode — the setup needed an Agent-pill toggle before the `tune` icon; test-only fix, no product code implicated]; the video output-count cascade carries a recorded waiver [full drive costs Veo credits; its exact selector shape was exercised live in the spike's cleanup step]). Prior: [v0.46.0](LIVE_VERIFICATION_v0.46.0.md) (**#387 provider-agnostic prompt-tools transport live-verified 2026-07-28, ZERO credits** — a four-probe capability spike passed 4/4 against BOTH a non-Google gateway and Google's OpenAI-compat endpoint, including a *semantic* multimodal check [a generated solid-red JPEG round-tripped and the model answered 'Red'], which is what proved the native Gemini `inlineData` path could be deleted outright rather than kept as a fallback; the real CLI then returned `was_expanded: true` on gateway/gateway-no-model/Google-default, emitted the loud one-time notice + no-op for the removed `GFLOW_CLI_GEMINI_API_KEY`, and made NO network call when unconfigured. Live verification caught two defects a fully green 2849-test offline suite missed: Google's compat endpoint has no server-side default model [`400 "model is not specified"`, silently no-oping the DEFAULT configuration], and the first redirect guard did not actually work because `build_opener()` installs its default handlers regardless of arguments, so `Authorization` would still have been replayed cross-host. `/code-review high` is recorded as NOT run — it is user-triggered only). Prior: [v0.45.0](LIVE_VERIFICATION_v0.45.0.md) (**#393 UUID `--ref` binding + #395 character-entity binding live-verified 2026-07-27/28** — a controlled A/B on identical input flipped `--ref` from exit 9 to exit 0 via the catalog-backed upload fallback, with the anti-silence guard [an unbindable ref aborts non-zero and writes no image] pinned by a live e2e; picker DOM + HAR showed Flow indexes a short auto-caption, NOT the prompt, so a prompt-derived search hint was dropped rather than shipped on assumption; a CDP spike against Flow's own character flow then captured the `entityContext` contract that gflow's generations were missing, root-causing #395 to two gflow defects [overlay dismissal Escaping Flow's own composer, and a character-route bounce that sent the prompt to the project composer] — both fixed, both character e2e tests now pass live, including `--format-prompt` [#383], with a read-back confirming the character carries its name and `thumbnail_media_id`). Prior: [v0.44.0](LIVE_VERIFICATION_v0.44.0.md) (**#381 dual-side project management & Playwright Chromium transport live-verified 2026-07-26** — real-editor project creation + rename tRPC server/DOM sync, prompt slugging, `gflow project` subcommand family, HTTP 429 adaptive backoff, and full E2E test suite). Prior: [v0.43.0](LIVE_VERIFICATION_v0.43.0.md) (**private incident diagnostics live-verified 2026-07-23, 1 Veo credit**). Prior: [v0.42.0](LIVE_VERIFICATION_v0.42.0.md) (**#361 production-readiness live-gaps confirmed live 2026-07-21, 1 Veo credit** — a real `veo-lite` t2v through the worker path persisted a real `remote_started` checkpoint [observer→checkpoint→DB chain confirmed], crash-recovery classified the task `indeterminate` without resubmitting, and mid-launch cancellation released the `ProfileLease` credit-free; full evidence in [v0.40.0-production-readiness § "2026-07-21 live follow-up"](LIVE_VERIFICATION_v0.40.0-production-readiness.md#2026-07-21-live-follow-up-0420-cycle); #359 content-safety `400`→`ContentPolicyError` classification is unit-covered, not live-triggered [would require a deliberate policy violation]; #360/#362 are docs-only, verified by the documentation gates). Prior: [v0.41.0](LIVE_VERIFICATION_v0.41.0.md) (**#357 production-readiness hardening — stale-session fail-fast, free image gen, paid veo-lite T2V all proven live**). Prior: [v0.40.0](LIVE_VERIFICATION_v0.40.0.md) (**#344 `@`-mention asset-tagging resolution proven live e2e, ~2 Imagen credits** — `gflow character create` staged a real taggable character [bound reference images, `has_reference_images` guard], the e2e test's documented propagation wait cleared Flow's `projectInitialData` lag, and `gflow image t2i "@Zoro …"` passed with returncode 0, a real generated image, and the correctly de-tagged prompt in the catalog — no code changes needed, `resolve_and_apply` as merged in #344 already works end-to-end; pre-existing unrelated issue #174 [Flow media-library A/B flake] can still intermittently block generation regardless of this feature — recorded, not omitted). Prior: [v0.39.0](LIVE_VERIFICATION_v0.39.0.md) (**#341 failed-generation persistence proven live** — a real `image t2i` on denon82 failed at the wire [`batchGenerateImages` HTTP 400 → `WireFormatError`] and the record-on-catch funnel wrote the **first-ever `failed` row** into the production catalog [`error_type=wire-format`, redacted `error_detail`, browsable via `gflow data list errors`], **$0**; the remaining paid paths [video/chain/batch/movie/worker] are funnel-regression-tested, not force-failed live [would cost credits], and the status-aware `succeeded=false` video-poll fix is unit-locked — recorded, not omitted). Prior: [v0.38.1](LIVE_VERIFICATION_v0.38.1.md) (**#338 agentic-pin recovery proven live ON the pinned account** — run 1 caught the composer-render race the unit suite could not [`ensure_media_incomplete` +115 ms, toggle never reached]; the readiness-wait fix landed and run 2 recovered classic on denon82 after ~2h of pin [`ui_driver.bound mode=classic`, real 768×1376 JPEG, exact prompt adherence]; reload branch unit-locked, live trigger not observed this cycle — recorded, not omitted). Prior: [v0.38.0](LIVE_VERIFICATION_v0.38.0.md) (**#332 mode control + #314 i2i ref dedup proven live e2e** — `image t2i --ui-mode classic` recovered agentic→classic in a real run [`ui_mode.attempt_exit_agent` → full classic chain, 1376×768 JPEG]; two identical `image i2i` runs proved the dedup contract [run 1: picker miss → `image_uploaded`; run 2: `reference_deduped_by_filename`, ZERO uploads]; `video t2v` veo-fast [`MEDIA_GENERATION_STATUS_SUCCESSFUL`, 15.2 MB `ftyp` mp4]; autopilot #333 recorded deferred-with-reason [hermes-ops deployment staged separately]). Prior: [v0.37.0](LIVE_VERIFICATION_v0.37.0.md) (**viewport 1920×1080 + agentic count enforcement + FIPS-safe SAPISIDHASH proven live e2e** — `image t2i` [classic cohort, real 1376×768 JPEG] and `video t2v` veo-fast [`MEDIA_GENERATION_STATUS_SUCCESSFUL`, 11.5 MB `ftyp` mp4] both succeeded end-to-end at the new 1920×1080 viewport with every selector resolving [no drift]; SAPISIDHASH digest verified byte-identical [FIPS-safe `usedforsecurity=False`], auth unchanged). Prior: [v0.36.0](LIVE_VERIFICATION_v0.36.0.md) (**#316 diagnostic tooling live-verified against real Flow traffic** — `GFLOW_CLI_HAR_PATH` captured a real 54-entry HAR [real Flow domains, 34× 200s, and a genuine 401 the tool exists to diagnose]; `GFLOW_CLI_DEBUG_TRACEBACK`'s typed-error scoping confirmed live [console output identical with/without the flag on a `GFlowError`]; unhandled-path behavior covered by 6 new tests (30 total across both files) + SDD task review; #312 reference-entity-smuggling fix covered by its own dedicated e2e test). Prior: [v0.35.0](LIVE_VERIFICATION_v0.35.0.md) (**#305-follow-up multimodal reverse-engineering & storyboard tool proven live e2e** — `gflow tools run storyboard` successfully deconstructed a cyberpunk scene into a cohesive 4-panel sequence; `reverse-engineer` tool extracts frames from video streams/URLs using `claude-video`'s `watch.py` and produces structured prompt components using Gemini multimodal models; dynamic token budgeting and strict Pyright types verified via test suite). Prior: [v0.34.0](LIVE_VERIFICATION_v0.34.0.md) (**#299 `--ui-mode` gate proven live, ZERO credits** — drove `get_ui_driver` directly over 4 real editor loads, never generated: bidirectional switch works [classic→agentic via `_force_agent_mode`, agentic→classic via `_exit_agent_mode`, each DOM-reverified], `agentic`-when-already-agentic is idempotent, and a timed-out toggle → **exit-28 fail-fast before submission**; deprecation behavior-change [`prefer_classic`→exit 28] confirmed). Prior: [v0.33.0](LIVE_VERIFICATION_v0.33.0.md) (**#287-follow-up picker fix proven live on the original repro** — the v0.32.1-failing `i2v <uuid> --project <crowded>` command now exits 0 with a real 3.0 MB `ftyp` mp4, `frame_ref_attached` + `video_saved`, zero uploads; **#241 jitter live-verified on both paths** — flag `--jitter 4-6` → `batch_jitter_sleep seconds=4.98`, and the new 0.5–1.5 s default → `seconds=1.47`, each firing exactly once between two t2i submissions; environment note: the denon82 cohort is now natively agentic and round-2 generations hit the pre-existing #281 `MediaAttributionError`, not a regression). Prior: [v0.32.1](LIVE_VERIFICATION_v0.32.1.md) (**#293 teardown fix live-verified credit-free** — error-path aborts leave ZERO chrome.exe holding the profile [3× leak reproduced pre-fix same day]; force-close fallback + ProfileLockedError translation unit-pinned; #283 wave logic fixes mock-verified to exact call counts). Prior: [v0.32.0](LIVE_VERIFICATION_v0.32.0.md) (**#287 UUID i2v frames proven live e2e** — an in-project asset selected by media UUID in the frame-slot dialog [frame_ref_attached, startImage bound on the wire, ZERO upload events] produced a real 720×1280 interpolation, resolving the #237 negative prior; foreign UUID → exit 9 pre-generation with screenshot; **#288 duration fail-fast proven live** — exit 23 pre-submit saved a 10-credit generation, and the debug screenshot confirmed the duration control is ABSENT from the cohort's settings popover [locale hypothesis refuted]; upload-400 exit-27 repro deferred-with-reason — the original rejected JPEG no longer exists). Prior: [v0.31.0](LIVE_VERIFICATION_v0.31.0.md) (**#281 wrong-media defenses live-verified in BOTH directions, credit-free** — correct attribution downloads with real wire metadata [seed, 768×1376]; the incident-class lazy-render ambiguity reproduced live and hard-stopped with `MediaAttributionError` exit 26 naming every candidate UUID, no file written; **#282 two-UUID-ref i2i proven e2e** — both freshly generated portrait UUIDs picker-selected into one scene with both canonical identities visually transferred). Prior: [v0.30.0](LIVE_VERIFICATION_v0.30.0.md) (**agentic-cohort image path + both fixes live-verified credit-free** — native 768×1376 stills, i2i-chain + canonical-ref identity hold; the character-create `DataIntegrityError` and the `prefer_classic` WARNING were observed live then fixed [recorder idempotent + INFO log]; MCP video-param feature deferred-with-reason on Veo credits, per the stills-only goal). Prior: [v0.29.0](LIVE_VERIFICATION_v0.29.0.md) (**persistent `gflow instructions` CRUD proven live e2e GREEN, credit-free** — 11-command sequence on a fresh project: add incl. `--ref <image-UUID>` attach, list/enable/disable, master toggle both ways, TOML `apply` destructive full-sync with `enabled=false` honored, `rm` with server card-id preserved across mutations; movie brief-sync code-path-verified via the same primitives, deferred-with-reason on credits; MCP `gflow_instructions_*` tools are thin adapters over the live-verified primitives). Prior: [v0.28.0](LIVE_VERIFICATION_v0.28.0.md) (**agent instructions `-i` now steer agentic generation — crayon e2e GREEN**: a style-neutral prompt + an enabled "crayon" card produced an unmistakable crayon drawing through the real transport; root causes were conversational phrasing + the `project_brief.enabled` master switch). Prior: [v0.27.1](LIVE_VERIFICATION_v0.27.1.md) (**v0.27.0 release follow-up fixes and documentation sync**). Prior: [v0.27.0](LIVE_VERIFICATION_v0.27.0.md) (**`[style]` block with named variants + prompt-aware resume — credit-free CLI verification**: real `movie run --dry-run` 3-way ledger proving resolved-style display, `skip (done)` on matching `style_hash`, and `re-run (style changed)` after a style edit; composition is local, wire path untouched, so no Veo credits spent — first credited styled run will confirm visually). Prior: [v0.26.0](LIVE_VERIFICATION_v0.26.0.md) (**image i2i by generated-image UUID proven live e2e GREEN** — the existing asset is *selected in place* by its media UUID, no duplicate upload, producing an i2i output that references it; plus generated-image `display_name` capture, credited @C1ph3r404). Prior: [v0.25.0](LIVE_VERIFICATION_v0.25.0.md) (**#237 remote-UUID i2v proven live e2e GREEN** — a real 8s 720×1280 interpolation from a generated image's UUID, after the picker-search attach was reworked to local upload; #240 home-`.env` matrix live; plus two silent-failure guards root-caused live: video-as-image download rejection and rejected-upload fail-loud). Prior: [v0.24.0](LIVE_VERIFICATION_v0.24.0.md) (--project parity across CLI + MCP — automated coverage; live gen auth-gated). Prior: [v0.23.0](LIVE_VERIFICATION_v0.23.0.md) (MCP generation wiring proven live end-to-end — tool→worker→real Flow REST→structured-error translation; final image-write blocked by an expired session, environmental. #222 macOS fix reporter-verified e2e on Apple Silicon). Prior: [v0.22.0](LIVE_VERIFICATION_v0.22.0.md) (Tools framework — automated/CI coverage complete; credit/key-gated live feature run is a pending owner gate, see the doc) · [v0.21.0](LIVE_VERIFICATION_v0.21.0.md) (MCP server over stdio + HTTP/SSE — credit-free protocol handshake; 4 tools / 2 prompts / 3 resources confirmed on stdout) · [v0.20.1](LIVE_VERIFICATION_v0.20.1.md) · [v0.20.0](LIVE_VERIFICATION_v0.20.0.md) · [v0.19.0](LIVE_VERIFICATION_v0.19.0.md) · [v0.18.0](LIVE_VERIFICATION_v0.18.0.md) · [v0.17.0](LIVE_VERIFICATION_v0.17.0.md) · [v0.16.0](LIVE_VERIFICATION_v0.16.0.md) · [v0.13.0](LIVE_VERIFICATION_v0.13.0.md) · [v0.12.0](LIVE_VERIFICATION_v0.12.0.md) · [v0.11.0](LIVE_VERIFICATION_v0.11.0.md) · [v0.10.0](LIVE_VERIFICATION_v0.10.0.md) · [v0.9.1](LIVE_VERIFICATION_v0.9.1.md) · [v0.9.0](LIVE_VERIFICATION_v0.9.0.md) · [v0.8.1](LIVE_VERIFICATION_v0.8.1.md) · [v0.7.0](LIVE_VERIFICATION_v0.7.0.md)
|
|
139
139
|
**"Where is the reverse-engineered wire protocol for a feature?"** → the `*_RECON.md` design docs: [CHARACTER_RECON](CHARACTER_RECON.md) (Flow character entity protocol), [IMAGE_UPSCALE_RECON](IMAGE_UPSCALE_RECON.md) (`/v1/flow/upsampleImage` wire). Naming convention: one `<FEATURE>_RECON.md` per reverse-engineered surface, kept as the durable spec after the feature ships. Pre-capture research recons: [ASSET_TAGGING_RECON](ASSET_TAGGING_RECON.md) (`@`-mention asset tagging — shipped in v0.40.0, see [LIVE_VERIFICATION_v0.40.0](LIVE_VERIFICATION_v0.40.0.md)).
|
|
140
140
|
**"What was live-verified for the data layer (PR #58)?"** → [LIVE_VERIFICATION_data_layer](LIVE_VERIFICATION_data_layer.md) — 1 Imagen + 1 Veo credit on denon82, 6-layer ledger (file + magic + Pillow + DB rows + CLI round-trip + structlog)
|
|
141
141
|
**"What was live-verified for the video-download feature (#29)?"** → [LIVE_VERIFICATION_video_download](LIVE_VERIFICATION_video_download.md)
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Live Verification — v0.46.1
|
|
2
|
+
|
|
3
|
+
**Date:** 2026-07-31
|
|
4
|
+
**Feature under test:** classic count-setter survives Flow's `1x`→`x1` label rename ([#404](https://github.com/ffroliva/gflow-cli/issues/404), PR [#405](https://github.com/ffroliva/gflow-cli/pull/405))
|
|
5
|
+
**Verifier:** repo owner's Windows 11 workstation, profile `ffroliva` — the exact environment of the original incident bundles (`20260729T151458Z-f9c00656…`, `20260729T151827Z-4f4a6093…`)
|
|
6
|
+
**Credit cost:** zero — image generation costs no Flow credits; the DOM recon was navigation-only.
|
|
7
|
+
|
|
8
|
+
## Why this release needs live verification
|
|
9
|
+
|
|
10
|
+
The defect *was* Flow-side UI drift: only a real composer can prove the renamed `x1`
|
|
11
|
+
tab exists, that a digit-keyed click converges, and that the selection persists.
|
|
12
|
+
The pre-fix unit suite was fully green while every real `-n 1` run died — the fakes
|
|
13
|
+
ignored locator filters, so no offline test could have caught this (they now honor
|
|
14
|
+
them, and the pre-fix failure is reproduced mechanically in
|
|
15
|
+
`tests/api/transports/test_ui_automation.py::TestSetCountRetry`).
|
|
16
|
+
|
|
17
|
+
## 1. Root-cause recon (credit-free, navigation only)
|
|
18
|
+
|
|
19
|
+
`scripts/dev/spike_issue404_count_tabs_recon.py` against project `gflow-cli t2i`:
|
|
20
|
+
|
|
21
|
+
| Probe | Result |
|
|
22
|
+
|---|---|
|
|
23
|
+
| Image count row labels | `['x1','x2','x3','x4']` — `1x` gone (video row identical) |
|
|
24
|
+
| Old filtered set (`^(1x\|x[2-4])$`) | size **3** — count-1 tab dropped |
|
|
25
|
+
| Replicated failing click (`nth(0)`) | landed on **`x2`**, moved the count 1→2 (away from target) |
|
|
26
|
+
| Selected `x1` under old read-back | `None` (regex miss) |
|
|
27
|
+
| Digit-keyed click on `x1` | `aria-selected="true"` immediately |
|
|
28
|
+
| Persistence | selection survives Escape-close + reopen — **no Save commit** |
|
|
29
|
+
|
|
30
|
+
Artifacts on disk: `scripts/dev/_spike_out/spike_issue404_count_tabs_*.json` +
|
|
31
|
+
step screenshots (`404_1`–`404_4_*.png`) + `_diagnostics/count_panel_dom_prompt_404.json`.
|
|
32
|
+
|
|
33
|
+
## 2. Classic surface — the reported invocation (2 passed, 89 s)
|
|
34
|
+
|
|
35
|
+
`tests/e2e/test_classic_count_setter_e2e.py` (`GFLOW_CLI_UI_MODE=classic`, 9:16,
|
|
36
|
+
NARWHAL — mirroring the reporter's run):
|
|
37
|
+
|
|
38
|
+
- **count=1 (the regression):** fresh project displays 2 → the renamed `x1` tab was
|
|
39
|
+
located, clicked, converged; exactly **1** generation result returned.
|
|
40
|
+
- **count=2 (early-exit):** already-matching display short-circuits with no click;
|
|
41
|
+
exactly **2** results.
|
|
42
|
+
- structlog invariant: final `ui_automation.count_setter_completed` has
|
|
43
|
+
`success=True` in both cases; no `error_unhandled`.
|
|
44
|
+
|
|
45
|
+
## 3. Agentic surface (4/4 passed, ~4 min)
|
|
46
|
+
|
|
47
|
+
`tests/e2e/test_agentic_count_enforcement_e2e.py`, counts 1–4, each against a
|
|
48
|
+
**deliberately mismatched** sticky panel default:
|
|
49
|
+
|
|
50
|
+
- All four counts returned exactly the requested number of images; every image
|
|
51
|
+
downloaded with a recognized magic-byte format (PNG/JPEG/WebP) and non-zero size.
|
|
52
|
+
- `ui_driver.bound mode=agentic`; no `enforce_count_failed` events.
|
|
53
|
+
- First attempt failed in the *test's own setup* (Flow now loads the editor in
|
|
54
|
+
classic mode; the raw-Playwright setup assumed the Agent composer) — repaired in
|
|
55
|
+
`beeb833` by toggling via the composer pill before waiting for the `tune` icon.
|
|
56
|
+
No product code was implicated in that failure.
|
|
57
|
+
|
|
58
|
+
## 4. Not verified live this cycle (recorded, not omitted)
|
|
59
|
+
|
|
60
|
+
- **Video output-count cascade** (`_set_output_count` widened to probe `x1` then
|
|
61
|
+
legacy `1x`): a full end-to-end drive would spend Veo credits. DOM-level evidence
|
|
62
|
+
from §1 covers the selector shape (the video row renders `x1..x4`; a
|
|
63
|
+
`[role='tab']:text-is('x2')` click — the cascade's exact selector form — executed
|
|
64
|
+
live during the spike's cleanup). Miss remains non-fatal by design
|
|
65
|
+
(`Flow default (x2) applies`).
|
|
66
|
+
- Image **dimensions** were not re-measured this cycle (format sniff + non-empty
|
|
67
|
+
size only); the original incident's passing run already pinned 768×1376 for this
|
|
68
|
+
aspect/model pair.
|
|
69
|
+
|
|
70
|
+
## 5. Ledger summary
|
|
71
|
+
|
|
72
|
+
| Layer | Evidence |
|
|
73
|
+
|---|---|
|
|
74
|
+
| File count | exact requested count, 6 live generations across counts 1–4 (§2, §3) |
|
|
75
|
+
| Magic bytes | PNG/JPEG/WebP sniff on every downloaded image (§3) |
|
|
76
|
+
| Dimensions | not re-measured (recorded above); format+size verified |
|
|
77
|
+
| structlog invariants | `count_setter_completed success=True`, `ui_driver.bound`, zero `error_unhandled` / `enforce_count_failed` |
|
|
78
|
+
| User-confirmable artifact | spike JSON + 4 step screenshots under `scripts/dev/_spike_out/` |
|
|
@@ -4,9 +4,21 @@
|
|
|
4
4
|
|
|
5
5
|
## Current release
|
|
6
6
|
|
|
7
|
+
**v0.46.1 — alpha.** **Classic count-setter fix (#404).** `gflow image t2i` failed whenever `-n` differed from the count displayed in the composer — including the default `-n 1` — because Flow renamed the count-tab labels from `1x`/`x2`/… to uniform `x1`/`x2`/…: the label filter silently dropped the count-1 tab and the positional pick clicked the wrong tab while reporting per-click success. Count tabs are now selected by the digit in their label across both cohorts, the read-back recognises a selected `x1`, and non-convergence raises the typed `UiSelectorDriftError` (exit 23) naming desired vs displayed instead of an opaque `RuntimeError`. Root-caused and verified live on the reporter's exact invocation, zero credits. See [LIVE_VERIFICATION_v0.46.1.md](LIVE_VERIFICATION_v0.46.1.md).
|
|
8
|
+
|
|
9
|
+
**Develop (unreleased, post-v0.46.1):** *(empty — develop is the staging branch for the next release).*
|
|
10
|
+
|
|
11
|
+
<details><summary>v0.46.0 — prompt tools on any OpenAI-compatible endpoint (#387)</summary>
|
|
12
|
+
|
|
13
|
+
**v0.46.0 — alpha.** **BREAKING — the prompt tools drive any OpenAI-compatible endpoint (#387).** `--tool creative-director` / `reverse-engineer` / `storyboard` now speak OpenAI Chat Completions instead of being hardwired to Google's native Gemini API, so OpenAI, gateways/proxies (OpenRouter, LiteLLM), local runtimes (Ollama, LM Studio), and Google's own compatibility endpoint all work. New config: `GFLOW_CLI_LLM_BASE_URL`, `GFLOW_CLI_LLM_API_KEY` (optional — omitted when unset so keyless local gateways work), `GFLOW_CLI_LLM_MODEL`. The removed `GFLOW_CLI_GEMINI_API_KEY` / `GFLOW_CLI_GEMINI_MODEL` trigger a loud one-time notice, never a silent no-op. The user-supplied endpoint is treated as a trust boundary: redirects declined, `https` (or loopback `http`) enforced, error bodies redacted. `reverse-engineer` degrades to the original input instead of expanding a file path as a prompt. See [LIVE_VERIFICATION_v0.46.0.md](LIVE_VERIFICATION_v0.46.0.md).
|
|
14
|
+
|
|
15
|
+
</details>
|
|
16
|
+
|
|
17
|
+
<details><summary>v0.45.0 — reference + character binding fixes (#393/#395)</summary>
|
|
18
|
+
|
|
7
19
|
**v0.45.0 — alpha.** **Reference + character binding fixes (#393/#395).** `gflow image i2i --ref <UUID>` now attaches the catalog's recorded file when Flow's per-project media picker cannot reach the tile, instead of failing the run — the fail-loud contract (never generate without a requested reference) is unchanged and pinned by a live e2e. `gflow character create` binds portraits to the character again: overlay dismissal was pressing Escape on Flow's own composer (`[role='dialog']`/`[role='alert']` matched the app itself), and the character route could bounce to the project page, sending the prompt to the **project** composer — both produced generations with no `entityContext`, which Flow filed as plain project images. Also: a Flow web-app crash on the character route is now the typed retryable `FlowAppError` (exit 31), character binding failures say what actually happened, and `--format-prompt` (#383) is live-verified. 2810 tests pass. See [LIVE_VERIFICATION_v0.45.0.md](LIVE_VERIFICATION_v0.45.0.md).
|
|
8
20
|
|
|
9
|
-
|
|
21
|
+
</details>
|
|
10
22
|
|
|
11
23
|
<details><summary>v0.44.0 — dual-side project naming & management (#381)</summary>
|
|
12
24
|
|
|
@@ -269,6 +281,13 @@ reporter-verified e2e on macOS).
|
|
|
269
281
|
| Agentic-pin recovery: opt-in reload after a real Agent-toggle click (#338) | ✅ done (v0.38.1) |
|
|
270
282
|
| Failed generations persisted to the local catalog + `gflow data list errors` (#341) | ✅ done (v0.39.0) |
|
|
271
283
|
| Prompt `@`-mention resolution for asset tagging (#344) | ✅ done (v0.40.0) |
|
|
284
|
+
| Production-readiness hardening: queue safety, profile lease, cancellation-safe teardown (#357) | ✅ done (v0.41.0) |
|
|
285
|
+
| Content-safety `ContentPolicyError` classification + Antigravity coding agent (#359/#360/#361) | ✅ done (v0.42.0) |
|
|
286
|
+
| Private incident diagnostics (`GFLOW_CLI_INCIDENT_CAPTURE`) | ✅ done (v0.43.0) |
|
|
287
|
+
| Dual-side project naming & management (`gflow project` family, `--project-name`/`--project-title`) (#381) | ✅ done (v0.44.0) |
|
|
288
|
+
| `--ref` catalog-backed upload fallback + character-entity binding fixes (#393/#395) | ✅ done (v0.45.0) |
|
|
289
|
+
| Prompt tools on any OpenAI-compatible endpoint (`GFLOW_CLI_LLM_*`) (#387) | ✅ done (v0.46.0) |
|
|
290
|
+
| Classic count-setter: digit-keyed tab selection + typed drift error (#404) | ✅ done (v0.46.1) |
|
|
272
291
|
| Manifest-driven video batch runner on `ui_automation` | ❌ removed — never worked end-to-end, shipped as a nonfunctional stub; see v0.41.0 changelog. For multi-clip video, loop `gflow video t2v`/`i2v` from the shell; `gflow image batch` remains supported for images. |
|
|
273
292
|
| Persistence layer (stay-mounted batch sessions across project boundaries) | ⏳ Phase B |
|
|
274
293
|
| Provider abstraction for official Veo 3.1 API | ⏳ planned |
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
r"""Issue #404 recon — classic composer count tabs: why does clicking
|
|
3
|
+
``nth(0) of _count_tabs_locator`` report success but never change the
|
|
4
|
+
displayed count? (0 credits)
|
|
5
|
+
|
|
6
|
+
Replicates ``_set_count``'s exact steps using the transport's own static
|
|
7
|
+
helpers (``_open_gen_settings_panel`` / ``_read_displayed_count`` /
|
|
8
|
+
``_count_tabs_locator`` / ``_dump_count_panel_dom``), then probes the
|
|
9
|
+
candidate fix: clicking the count tab whose TEXT contains the desired digit,
|
|
10
|
+
scoped to the tablist that owns the currently aria-selected count tab.
|
|
11
|
+
|
|
12
|
+
Navigation only — no prompt is submitted, no generate route is hit, 0 credits.
|
|
13
|
+
|
|
14
|
+
Usage (headed, supervised):
|
|
15
|
+
|
|
16
|
+
PYTHONUTF8=1 .venv\Scripts\python.exe scripts\dev\spike_issue404_count_tabs_recon.py \
|
|
17
|
+
--profile ffroliva --project 9d7b750f-b4a8-4c2f-b5b0-a059cbfbae73
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
import argparse
|
|
23
|
+
import asyncio
|
|
24
|
+
import json
|
|
25
|
+
import os
|
|
26
|
+
import sys
|
|
27
|
+
import time
|
|
28
|
+
from pathlib import Path
|
|
29
|
+
from typing import Any
|
|
30
|
+
|
|
31
|
+
_ROOT = Path(__file__).resolve().parents[2]
|
|
32
|
+
_SRC = _ROOT / "src"
|
|
33
|
+
if _SRC.exists() and str(_SRC) not in sys.path:
|
|
34
|
+
sys.path.insert(0, str(_SRC))
|
|
35
|
+
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
|
36
|
+
|
|
37
|
+
from _spike_common import build_client, default_out_path, resolve_profile_dir, step # noqa: E402
|
|
38
|
+
|
|
39
|
+
from gflow_cli.api import routes # noqa: E402
|
|
40
|
+
from gflow_cli.api.transports.ui_automation import ( # noqa: E402
|
|
41
|
+
UiAutomationTransport,
|
|
42
|
+
_count_tabs_locator,
|
|
43
|
+
)
|
|
44
|
+
from gflow_cli.api.transports.ui_automation_video import ( # noqa: E402
|
|
45
|
+
COMPOSER_AGENT_TOGGLE_SELECTOR,
|
|
46
|
+
VideoGenerationMixin,
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
# Per count tab: text, aria-selected, rect, and a fingerprint of the owning
|
|
50
|
+
# tablist (sibling tab texts in DOM order) so duplicate tablists are visible.
|
|
51
|
+
_TABS_TOPOLOGY_JS = """
|
|
52
|
+
() => {
|
|
53
|
+
const isCount = (t) => /^(1x|x[2-4])$/.test((t || '').trim());
|
|
54
|
+
const tablists = [...document.querySelectorAll("[role='tablist']")];
|
|
55
|
+
return {
|
|
56
|
+
tablists: tablists.map((tl, i) => {
|
|
57
|
+
const r = tl.getBoundingClientRect();
|
|
58
|
+
return {
|
|
59
|
+
index: i,
|
|
60
|
+
tabTexts: [...tl.querySelectorAll("[role='tab']")].map(
|
|
61
|
+
(t) => (t.innerText || '').trim().slice(0, 40)),
|
|
62
|
+
rect: { x: r.x, y: r.y, w: r.width, h: r.height },
|
|
63
|
+
visible: r.width > 0 && r.height > 0,
|
|
64
|
+
};
|
|
65
|
+
}),
|
|
66
|
+
countTabs: [...document.querySelectorAll("[role='tab']")]
|
|
67
|
+
.filter((t) => isCount(t.innerText))
|
|
68
|
+
.map((t) => {
|
|
69
|
+
const tl = t.closest("[role='tablist']");
|
|
70
|
+
const r = t.getBoundingClientRect();
|
|
71
|
+
return {
|
|
72
|
+
text: (t.innerText || '').trim(),
|
|
73
|
+
ariaSelected: t.getAttribute('aria-selected'),
|
|
74
|
+
tablistIndex: tl ? tablists.indexOf(tl) : null,
|
|
75
|
+
rect: { x: r.x, y: r.y, w: r.width, h: r.height },
|
|
76
|
+
visible: r.width > 0 && r.height > 0,
|
|
77
|
+
};
|
|
78
|
+
}),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
"""
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
async def _ensure_classic(page: Any, result: dict[str, Any]) -> bool:
|
|
85
|
+
media_present = await VideoGenerationMixin._media_panel_present(page) # noqa: SLF001
|
|
86
|
+
result["mediaPanelPresent_onLoad"] = media_present
|
|
87
|
+
if not media_present:
|
|
88
|
+
pill = page.locator(COMPOSER_AGENT_TOGGLE_SELECTOR).first
|
|
89
|
+
if await pill.count() > 0:
|
|
90
|
+
await pill.click(force=True, timeout=5_000)
|
|
91
|
+
await page.wait_for_timeout(1_500)
|
|
92
|
+
media_present = await VideoGenerationMixin._media_panel_present(page) # noqa: SLF001
|
|
93
|
+
result["classicMode"] = media_present
|
|
94
|
+
return media_present
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
async def _run(*, profile_dir: Path, project_id: str, locale: str, out_path: Path) -> int:
|
|
98
|
+
out_dir = out_path.parent
|
|
99
|
+
out_dir.mkdir(parents=True, exist_ok=True)
|
|
100
|
+
result: dict[str, Any] = {
|
|
101
|
+
"spike": "issue404-count-tabs-recon",
|
|
102
|
+
"capturedAt": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()),
|
|
103
|
+
"project": project_id,
|
|
104
|
+
}
|
|
105
|
+
T = UiAutomationTransport
|
|
106
|
+
|
|
107
|
+
async with build_client(profile_dir, headless=False) as client:
|
|
108
|
+
page = await client._checkout_page() # noqa: SLF001
|
|
109
|
+
try:
|
|
110
|
+
editor_url = routes.project_editor_url(locale, project_id)
|
|
111
|
+
step("1", f"goto {editor_url}", prefix="404")
|
|
112
|
+
await page.goto(editor_url, wait_until="domcontentloaded", timeout=45_000)
|
|
113
|
+
await page.wait_for_timeout(4_000)
|
|
114
|
+
await page.keyboard.press("Escape")
|
|
115
|
+
|
|
116
|
+
if not await _ensure_classic(page, result):
|
|
117
|
+
result["error"] = "could not reach classic mode"
|
|
118
|
+
return 1
|
|
119
|
+
|
|
120
|
+
step("2", "opening generation settings panel (transport helper)", prefix="404")
|
|
121
|
+
panel_open = await T._is_settings_panel_open(page) # noqa: SLF001
|
|
122
|
+
if not panel_open:
|
|
123
|
+
panel_open = await T._open_gen_settings_panel(page) # noqa: SLF001
|
|
124
|
+
result["panelOpened"] = panel_open
|
|
125
|
+
if not panel_open:
|
|
126
|
+
result["error"] = "settings panel did not open"
|
|
127
|
+
return 1
|
|
128
|
+
|
|
129
|
+
# The real t2i path switches to IMAGE mode before configuring
|
|
130
|
+
# settings (#40) — replicate via the ligature-keyed mode tab
|
|
131
|
+
# (locale-invariant, memory: flow-locale-leak-icon-ligatures).
|
|
132
|
+
step("2b", "selecting Image mode tab (ligature-keyed)", prefix="404")
|
|
133
|
+
image_tab = page.locator(
|
|
134
|
+
"[role='tab']:has(i.google-symbols:text-is('image'))"
|
|
135
|
+
).first
|
|
136
|
+
await image_tab.wait_for(state="visible", timeout=5_000)
|
|
137
|
+
await image_tab.click()
|
|
138
|
+
await page.wait_for_timeout(800)
|
|
139
|
+
result["imageModeSelected"] = await image_tab.get_attribute("aria-selected")
|
|
140
|
+
await page.screenshot(path=str(out_dir / "404_1_panel_open.png"))
|
|
141
|
+
|
|
142
|
+
# Full role dump via the transport's own diagnostic (issue #24 shape).
|
|
143
|
+
await T._dump_count_panel_dom(page, out_dir, 404) # noqa: SLF001
|
|
144
|
+
result["topology_before"] = await page.evaluate(_TABS_TOPOLOGY_JS)
|
|
145
|
+
result["displayed_before"] = await T._read_displayed_count(page) # noqa: SLF001
|
|
146
|
+
|
|
147
|
+
step("3", "replicating failing click: nth(0) of _count_tabs_locator", prefix="404")
|
|
148
|
+
tabs = _count_tabs_locator(page)
|
|
149
|
+
result["filtered_set_size"] = await tabs.count()
|
|
150
|
+
target = tabs.nth(0)
|
|
151
|
+
result["nth0_before_click"] = await target.evaluate(
|
|
152
|
+
"""(t) => {
|
|
153
|
+
const tablists = [...document.querySelectorAll("[role='tablist']")];
|
|
154
|
+
return {
|
|
155
|
+
text: (t.innerText || '').trim(),
|
|
156
|
+
ariaSelected: t.getAttribute('aria-selected'),
|
|
157
|
+
tablistIndex: tablists.indexOf(t.closest("[role='tablist']")),
|
|
158
|
+
outerHTML: t.outerHTML.slice(0, 400),
|
|
159
|
+
};
|
|
160
|
+
}"""
|
|
161
|
+
)
|
|
162
|
+
try:
|
|
163
|
+
await target.wait_for(state="visible", timeout=3_000)
|
|
164
|
+
await target.click()
|
|
165
|
+
await page.wait_for_timeout(300)
|
|
166
|
+
result["nth0_click"] = "landed"
|
|
167
|
+
except Exception as e: # noqa: BLE001
|
|
168
|
+
result["nth0_click"] = f"error: {e}"
|
|
169
|
+
result["nth0_after_click_ariaSelected"] = await target.get_attribute("aria-selected")
|
|
170
|
+
result["displayed_after_nth0"] = await T._read_displayed_count(page) # noqa: SLF001
|
|
171
|
+
result["topology_after_nth0"] = await page.evaluate(_TABS_TOPOLOGY_JS)
|
|
172
|
+
await page.screenshot(path=str(out_dir / "404_2_after_nth0.png"))
|
|
173
|
+
|
|
174
|
+
step("4", "candidate fix: text-keyed click scoped to selected tablist", prefix="404")
|
|
175
|
+
fix = await page.evaluate(
|
|
176
|
+
"""() => {
|
|
177
|
+
// Union of old ("1x", "x2"..) and new ("x1", "x2"..) label cohorts.
|
|
178
|
+
const isCount = (t) => /^(1x|x[1-4])$/.test((t || '').trim());
|
|
179
|
+
const selected = [...document.querySelectorAll(
|
|
180
|
+
"[role='tab'][aria-selected='true']")].filter((t) => isCount(t.innerText));
|
|
181
|
+
if (!selected.length) return { found: false, reason: 'no selected count tab' };
|
|
182
|
+
const tl = selected[0].closest("[role='tablist']");
|
|
183
|
+
if (!tl) return { found: false, reason: 'selected tab has no tablist' };
|
|
184
|
+
const target = [...tl.querySelectorAll("[role='tab']")].find(
|
|
185
|
+
(t) => /^(1x|x1)$/.test((t.innerText || '').trim()));
|
|
186
|
+
if (!target) return { found: false, reason: 'no count-1 tab in selected tablist' };
|
|
187
|
+
target.setAttribute('data-spike-404-target', '1');
|
|
188
|
+
return { found: true };
|
|
189
|
+
}"""
|
|
190
|
+
)
|
|
191
|
+
result["fix_target"] = fix
|
|
192
|
+
if fix.get("found"):
|
|
193
|
+
fix_btn = page.locator("[data-spike-404-target='1']").first
|
|
194
|
+
await fix_btn.click(timeout=5_000)
|
|
195
|
+
await page.wait_for_timeout(300)
|
|
196
|
+
result["fix_after_click_ariaSelected"] = await fix_btn.get_attribute(
|
|
197
|
+
"aria-selected"
|
|
198
|
+
)
|
|
199
|
+
result["displayed_after_fix"] = await T._read_displayed_count(page) # noqa: SLF001
|
|
200
|
+
await page.screenshot(path=str(out_dir / "404_3_after_fix.png"))
|
|
201
|
+
|
|
202
|
+
step("5", "persistence: Escape-close, reopen, re-read", prefix="404")
|
|
203
|
+
await page.keyboard.press("Escape")
|
|
204
|
+
await page.wait_for_timeout(400)
|
|
205
|
+
reopened = await T._open_gen_settings_panel(page) # noqa: SLF001
|
|
206
|
+
result["panelReopened"] = reopened
|
|
207
|
+
result["displayed_after_reopen"] = await T._read_displayed_count(page) # noqa: SLF001
|
|
208
|
+
result["topology_after_reopen"] = await page.evaluate(_TABS_TOPOLOGY_JS)
|
|
209
|
+
await page.screenshot(path=str(out_dir / "404_4_reopened.png"))
|
|
210
|
+
|
|
211
|
+
# Cleanup: earlier probe runs flipped the VIDEO count row to x1 on
|
|
212
|
+
# this project — restore Flow's x2 default so the recon leaves no
|
|
213
|
+
# sticky state behind.
|
|
214
|
+
step("6", "cleanup: restore video count row to x2", prefix="404")
|
|
215
|
+
video_tab = page.locator(
|
|
216
|
+
"[role='tab']:has(i.google-symbols:text-is('videocam'))"
|
|
217
|
+
).first
|
|
218
|
+
if await video_tab.count() > 0:
|
|
219
|
+
await video_tab.click()
|
|
220
|
+
await page.wait_for_timeout(800)
|
|
221
|
+
x2_tab = page.locator("[role='tab']:text-is('x2')").first
|
|
222
|
+
if await x2_tab.count() > 0:
|
|
223
|
+
await x2_tab.click()
|
|
224
|
+
await page.wait_for_timeout(300)
|
|
225
|
+
result["videoCountRestored"] = await x2_tab.get_attribute(
|
|
226
|
+
"aria-selected"
|
|
227
|
+
)
|
|
228
|
+
finally:
|
|
229
|
+
client._checkin_page(page) # noqa: SLF001
|
|
230
|
+
out_path.write_text(json.dumps(result, indent=2, ensure_ascii=False), encoding="utf-8")
|
|
231
|
+
|
|
232
|
+
print(f"\n[404] json -> {out_path}", flush=True)
|
|
233
|
+
for key in (
|
|
234
|
+
"displayed_before",
|
|
235
|
+
"filtered_set_size",
|
|
236
|
+
"nth0_before_click",
|
|
237
|
+
"nth0_click",
|
|
238
|
+
"nth0_after_click_ariaSelected",
|
|
239
|
+
"displayed_after_nth0",
|
|
240
|
+
"fix_target",
|
|
241
|
+
"fix_after_click_ariaSelected",
|
|
242
|
+
"displayed_after_fix",
|
|
243
|
+
"displayed_after_reopen",
|
|
244
|
+
):
|
|
245
|
+
print(f"[404] {key} = {json.dumps(result.get(key), ensure_ascii=False)}", flush=True)
|
|
246
|
+
return 0
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
def main(argv: list[str] | None = None) -> int:
|
|
250
|
+
p = argparse.ArgumentParser(
|
|
251
|
+
description="Issue #404: classic composer count-tab recon (0 credits)"
|
|
252
|
+
)
|
|
253
|
+
p.add_argument("--profile", default=os.environ.get("GFLOW_CLI_PROFILE", "ffroliva"))
|
|
254
|
+
p.add_argument(
|
|
255
|
+
"--project",
|
|
256
|
+
default=os.environ.get("GFLOW_CLI_PROJECT"),
|
|
257
|
+
required="GFLOW_CLI_PROJECT" not in os.environ,
|
|
258
|
+
)
|
|
259
|
+
p.add_argument("--locale", default=os.environ.get("GFLOW_CLI_LOCALE", "en"))
|
|
260
|
+
p.add_argument("--out", default=None)
|
|
261
|
+
args = p.parse_args(argv)
|
|
262
|
+
|
|
263
|
+
profile_dir = resolve_profile_dir(args.profile)
|
|
264
|
+
out_path = (
|
|
265
|
+
Path(args.out) if args.out else default_out_path("spike_issue404_count_tabs", ".json")
|
|
266
|
+
)
|
|
267
|
+
step("--", f"profile={args.profile} project={args.project}", prefix="404")
|
|
268
|
+
try:
|
|
269
|
+
return asyncio.run(
|
|
270
|
+
_run(
|
|
271
|
+
profile_dir=profile_dir,
|
|
272
|
+
project_id=args.project,
|
|
273
|
+
locale=args.locale,
|
|
274
|
+
out_path=out_path,
|
|
275
|
+
)
|
|
276
|
+
)
|
|
277
|
+
except KeyboardInterrupt:
|
|
278
|
+
print("[404] aborted", file=sys.stderr)
|
|
279
|
+
return 130
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
if __name__ == "__main__":
|
|
283
|
+
raise SystemExit(main())
|
|
@@ -109,7 +109,8 @@ _FIND_PANEL_ROOT_JS_PRELUDE = """
|
|
|
109
109
|
let node = backBtn.parentElement;
|
|
110
110
|
for (let depth = 0; depth < 8 && node; depth++) {
|
|
111
111
|
const hasCountTablist = [...node.querySelectorAll("[role='tab']")].some((t) =>
|
|
112
|
-
|
|
112
|
+
// Both label cohorts: legacy "1x" and the renamed "x1" (issue #404).
|
|
113
|
+
/^(1x|x[1-4])$/.test((t.textContent || '').trim())
|
|
113
114
|
);
|
|
114
115
|
if (hasCountTablist) {
|
|
115
116
|
if (depth < bestDepth) { panelRoot = node; backBtnEl = backBtn; bestDepth = depth; }
|