gflow-cli 0.48.0__tar.gz → 0.49.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.codex-plugin/plugin.json +1 -1
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/CHANGELOG.md +48 -1
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/KNOWN_ISSUES.md +43 -8
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/PKG-INFO +10 -2
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/README.md +8 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/deploy/PR-TRIAGE-AUTOPILOT-OPS.md +23 -3
- {gflow_cli-0.48.0/website → gflow_cli-0.49.0}/docs/CONFIGURATION.md +1 -1
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/INDEX.md +1 -1
- gflow_cli-0.49.0/docs/LIVE_VERIFICATION_v0.49.0.md +22 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/USAGE.md +27 -14
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/superpowers/specs/2026-06-29-issue-assessment-workflow-design.md +1 -1
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/pyproject.toml +16 -2
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/autopilot/Dockerfile.triage +7 -2
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/autopilot/pr_triage_autopilot.py +44 -15
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/autopilot/run_sandboxed_review.sh +21 -6
- gflow_cli-0.49.0/scripts/dev/spike_omni_flash_i2v_ui_recon.py +320 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/__init__.py +1 -1
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/api/transports/drivers/classic.py +1 -1
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/api/transports/ui_automation_video.py +183 -38
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/api/video.py +24 -15
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/chain.py +10 -6
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/cli_video.py +42 -31
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/errors.py +15 -10
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/mcp/tools.py +4 -4
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/test_video.py +10 -8
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/transports/test_ui_automation_video.py +144 -19
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/autopilot/test_pr_triage_autopilot.py +36 -16
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/cli/test_cli_video.py +75 -19
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/e2e/test_chain_e2e.py +3 -3
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/e2e/test_transports_e2e.py +3 -3
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/test_chain.py +6 -4
- gflow_cli-0.49.0/tests/test_playwright_pin.py +76 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/uv.lock +2 -2
- {gflow_cli-0.48.0 → gflow_cli-0.49.0/website}/docs/CONFIGURATION.md +1 -1
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/website/docs/KNOWN_ISSUES.md +43 -8
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/website/docs/USAGE.md +27 -14
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.agents/plugins/marketplace.json +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.claude/README.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.claude/commands/gflow/active.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.claude/commands/gflow/branch-review.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.claude/commands/gflow/changelog.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.claude/commands/gflow/check.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.claude/commands/gflow/doc-review.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.claude/commands/gflow/issue-assessment.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.claude/commands/gflow/issue-resolve.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.claude/commands/gflow/known-issues.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.claude/commands/gflow/live-verify.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.claude/commands/gflow/llm-council.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.claude/commands/gflow/next.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.claude/commands/gflow/plan.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.claude/commands/gflow/pr-council-review.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.claude/commands/gflow/predict.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.claude/commands/gflow/release.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.claude/commands/gflow/scenario.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.claude/commands/gflow/sonar.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.claude/commands/gflow/status.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.env.template +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.gitattributes +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.github/CODEOWNERS +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.github/copilot-instructions.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.github/dependabot.yml +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.github/workflows/ci.yml +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.github/workflows/external-pr-triage.yml +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.github/workflows/governance-advisory.yml +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.github/workflows/governance-benchmark.yml +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.github/workflows/main-base-guard.yml +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.github/workflows/pages.yml +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.github/workflows/release.yml +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.gitignore +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.gitleaks.toml +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.pre-commit-config.yaml +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/.secrets.baseline +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/AGENTS.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/CLAUDE.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/CONFIGURATION.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/CONTRIBUTING.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/DISCLAIMER.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/LICENSE +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/PLAN.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/RELEASE.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/ROADMAP.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/conftest.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docker-compose.yml +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/AGENT_GUIDE.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/AGENT_UI_E2E.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/AGENT_UI_RECON.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/ASSET_TAGGING_RECON.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/CHARACTER.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/CHARACTER_RECON.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/DATA_LAYER.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/DEMOS.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/E2E_TESTING.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/GITHUB.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/INSTRUCTIONS.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.21.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.22.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.23.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.24.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.25.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.26.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.27.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.27.1.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.28.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.29.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.30.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.31.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.32.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.32.1.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.33.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.34.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.35.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.36.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.37.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.38.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.38.1.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.39.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.40.0-production-readiness.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.40.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.41.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.42.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.43.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.44.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.45.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.46.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.46.1.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.47.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.48.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/MCP.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/MOVIE.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/PROJECT_STATUS.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/PROMPT_EXPANSION.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/REFERENCE_STRATEGIES.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/SECURITY.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/TOOLS.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/USER_GUIDE.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/assets/demo-split-pf.gif +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/assets/example-run.gif +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/assets/examples.webp +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/medium_tutorial.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/schemas/movie-handoff.schema.json +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/sonar-cleanup-tracker.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/superpowers/plans/2026-07-08-pr-triage-autopilot/PLAN.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/superpowers/plans/2026-07-09-camoufox-adoption/PLAN.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/superpowers/plans/2026-07-14-storyboarding-and-visual-curation/PLAN.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/superpowers/plans/2026-07-18-asset-tagging/PLAN.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/superpowers/plans/2026-07-19-live-verify/PLAN.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/superpowers/plans/2026-07-19-production-readiness-browser-lifecycle.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/superpowers/plans/2026-07-19-production-readiness-driver-cdp-verification.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/superpowers/plans/2026-07-19-production-readiness-public-truth.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/superpowers/plans/2026-07-19-production-readiness-queue-safety.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/superpowers/plans/2026-07-26-character-prompt-polishing/PLAN.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/superpowers/plans/2026-07-26-project-name-management/PLAN.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/superpowers/plans/2026-07-26-self-documenting-errors/PLAN.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/superpowers/plans/2026-07-27-overlay-banner-dismissal/PLAN.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/PLAN.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/SCENARIO.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/superpowers/research/2026-06-27-tool-abstraction-evaluation.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/superpowers/specs/2026-07-04-pr-triage-autopilot-design.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/superpowers/specs/2026-07-18-asset-tagging-design.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/superpowers/specs/2026-07-19-live-verify-design.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/superpowers/specs/2026-07-19-production-readiness-hardening-design.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/superpowers/spikes/2026-07-09-camoufox-waf-403.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/superpowers/spikes/2026-07-12-ui-cohort-backend-config.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/superpowers/spikes/2026-07-17-production-readiness-assessment.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/docs/superpowers/spikes/2026-08-01-mcp-2026-07-28-spec-impact.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/eval/pr_triage_eval.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/eval/pr_triage_fixtures.json +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/examples/README.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/examples/batch_from_config.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/examples/multi_prompt_t2i.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/examples/sample_config.json +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/examples/sample_prompts.txt +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/examples/single_image_t2i.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/examples/workflow_chain.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/index.html +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/llms.txt +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/samples/README.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/samples/captured/01_upload_image.json +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/samples/captured/04_archive_workflow.json +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/samples/captured/05_createProject.json +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/samples/captured/06_batchGenerateImages.json +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/samples/captured/12_create_scene.json +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/samples/captured/14_get_scene_workflows.json +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/autopilot/entrypoint.sh +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/autopilot/pr_triage_gate.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/ci/check_doc_links.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/ci/check_materiality.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/ci/check_release_artifacts.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/ci/check_repo_hygiene.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/ci/check_website_docs_pii.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/ci/generate_website_docs.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/debug_editor.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/debug_gen_settings.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/debug_settings.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/_recording_client.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/_spike_common.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/active_plan.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/capture_locale_invariants.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/character_create_spike.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/character_create_spike_v2.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/dump_character_selectors.js +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/incident_bundle_quality.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/make_project.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/materiality_backtest.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/monitor_pr_38.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/patch_character.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/skillopt/README.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/skillopt/harness.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/skillopt/tasks.json +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/sonar-local-scan.sh +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/sonar-pre-push-gate.sh +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/spike_char_editor_dom.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/spike_char_gen_capture.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/spike_character_prompt_format.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/spike_incident_live.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/spike_issue313_agent_mode_controls.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/spike_issue314_picker_filename_search.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/spike_issue404_count_tabs_recon.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/spike_mode_roundtrip.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/spike_mode_switch_agentic_to_classic.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/spike_movie_picker_select.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/spike_movie_voice_list.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/spike_patch_entity.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/dev/spike_patchright.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/diag/README.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/diag/capture_flow_traffic.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/diag/memory_profile.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/diag/recaptcha_mint.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/diag/spike_387_openai_compat.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/e2e/capture_agent_toggle.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/record_demo.ps1 +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/smoke_image.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/smoke_video_editor.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/smoke_worker_style.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/spike_waf_camoufox.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/scripts/verify_chrome_auth_viability.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/skills/README.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/skills/changelog/SKILL.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/skills/check/SKILL.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/skills/doc-review/SKILL.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/skills/gflow-cli/SKILL.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/skills/issue-assessment/SKILL.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/skills/issue-resolve/SKILL.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/skills/known-issues/SKILL.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/skills/live-verify/SKILL.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/skills/llm-council/SKILL.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/skills/plan/SKILL.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/skills/pr-council-review/SKILL.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/skills/predict/SKILL.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/skills/release/SKILL.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/skills/scenario/SKILL.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/skills/sonar/SKILL.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/skills/status/SKILL.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/sonar-project.properties +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/__main__.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/_cli_helpers.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/api/__init__.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/api/_engine.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/api/_retry.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/api/character.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/api/client.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/api/dto.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/api/image.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/api/image_upscale.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/api/recaptcha.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/api/routes.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/api/scene.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/api/transports/__init__.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/api/transports/_common.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/api/transports/base.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/api/transports/drivers/agentic.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/api/transports/drivers/base.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/api/transports/drivers/factory.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/api/transports/mode_control.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/api/transports/ui_automation.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/auth/__init__.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/auth/base.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/auth/cookies.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/auth/factory.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/auth/real_chrome.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/auth/strategies.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/auth/verification.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/browser_manager.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/chain_manifest.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/cli.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/cli_character.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/cli_data.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/cli_image.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/cli_instructions.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/cli_models.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/cli_movie.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/cli_project.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/cli_run.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/cli_scene.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/cli_tools.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/composition.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/config.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/data/__init__.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/data/chain_repo.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/data/migrations/0007_queue.sql +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/data/migrations/0008_add_operation_expanded_prompt.sql +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/data/migrations/0009_queue_claims.sql +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/data/models.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/data/queries.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/data/recorder.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/data/redaction.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/data/repository.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/data/store.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/diagnostics.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/exceptions.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/image_batch.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/json_output.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/mcp/__init__.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/mcp/prompts.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/mcp/resources.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/mcp/server.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/media.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/movie_manifest.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/observability.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/paths.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/profile_lease.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/profile_store.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/redaction.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/services/__init__.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/services/character_create.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/services/mentions.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/storage.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/tools/__init__.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/tools/banned.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/tools/builtin/__init__.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/tools/builtin/creative-director.toml +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/tools/builtin/reverse-engineer.toml +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/tools/builtin/storyboard.toml +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/tools/expander.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/tools/invocation.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/tools/loader.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/tools/registry.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/tools/runtime.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/tools/spec.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/ui/app.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/ui/server.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/worker/codec.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/worker/daemon.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/src/gflow_cli/worker/queue.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tasks/lessons.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/test_assets/sample_batch.json +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/test_assets/sample_batch.tsv +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/test_assets/sample_batch_invalid.tsv +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/__init__.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/__init__.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/fixtures/character_gen_response.json +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/fixtures/patch_entity_response.json +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/test_aisandbox_auth_error.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/test_bearer_redaction.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/test_character.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/test_client.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/test_client_character.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/test_client_delete_characters.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/test_client_errors.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/test_client_generate_character.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/test_client_image.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/test_client_incidents.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/test_client_launch_kwargs.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/test_client_patch_entity.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/test_client_scene.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/test_client_upscale.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/test_concurrency.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/test_dto.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/test_engine.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/test_image.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/test_image_dto.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/test_image_upscale.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/test_post_json_aisandbox_auth.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/test_recaptcha.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/test_retry.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/test_routes.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/test_routes_character.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/test_routes_scene.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/test_sapisidhash_helper.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/test_scene_models.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/test_video_request.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/transports/__init__.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/transports/conftest.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/transports/drivers/test_agentic.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/transports/drivers/test_classic.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/transports/drivers/test_factory.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/transports/drivers/test_ui_mode.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/transports/test_agentic_cohort_detection.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/transports/test_base.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/transports/test_bearer.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/transports/test_common.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/transports/test_factory.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/transports/test_fingerprint.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/transports/test_mode_control.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/transports/test_sapisidhash.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/transports/test_selector_symmetry.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/transports/test_transport_timeout.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/transports/test_ui_automation.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/transports/test_ui_automation_batch.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/api/transports/test_ui_character_editor.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/auth/strategies/test_factory.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/auth/strategies/test_strategies.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/auth/test_cookies.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/auth/test_real_chrome.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/auth/test_verification.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/cli/__init__.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/cli/test_cli_auth_list.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/cli/test_cli_character.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/cli/test_cli_character_create.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/cli/test_cli_data.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/cli/test_cli_data_errors.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/cli/test_cli_data_errors_retention.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/cli/test_cli_image.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/cli/test_cli_image_selector_drift.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/cli/test_cli_image_upscale.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/cli/test_cli_image_uuid_ref_enrichment.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/cli/test_cli_instructions.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/cli/test_cli_models.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/cli/test_cli_movie.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/cli/test_cli_run.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/cli/test_cli_scene.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/cli/test_cli_tools.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/cli/test_cli_video_chain.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/cli/test_error_handling.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/cli/test_failure_funnel.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/cli/test_helpers.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/cli/test_incident_output.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/cli/test_movie_manifest.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/cli/test_movie_manifest_style_variants.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/cli/test_predictable_output.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/cli/test_settings_validation.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/composition/test_character.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/composition/test_compose_prompt.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/composition/test_handoff.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/composition/test_style_variants.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/composition/test_style_variants_e2e.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/conftest.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/data/__init__.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/data/test_chain_repo.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/data/test_failure_recording.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/data/test_find_incomplete_character.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/data/test_models.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/data/test_packaging.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/data/test_recorder.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/data/test_recorder_character.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/data/test_redaction.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/data/test_repository.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/data/test_scene_persistence.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/data/test_settings_and_errors.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/data/test_store_migrations.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/dev/test_recording_client.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/e2e/__init__.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/e2e/conftest.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/e2e/test_agentic_count_enforcement_e2e.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/e2e/test_asset_tagging_e2e.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/e2e/test_cancellation_e2e.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/e2e/test_character_create_e2e.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/e2e/test_classic_count_setter_e2e.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/e2e/test_crash_recovery_e2e.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/e2e/test_daemon_e2e.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/e2e/test_data_layer_e2e.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/e2e/test_entity_provenance_e2e.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/e2e/test_entity_smuggling_e2e.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/e2e/test_i2v_flags_e2e.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/e2e/test_image_batch_e2e.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/e2e/test_image_uuid_ref_e2e.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/e2e/test_incident_quality_e2e.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/e2e/test_json_output_e2e.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/e2e/test_live_agentic_instructions.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/e2e/test_project_naming_e2e.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/e2e/test_scene_compose_live.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/e2e/test_tools_e2e.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/features/__init__.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/features/asset_tagging.feature +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/features/auth.feature +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/features/auth_login.feature +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/features/character_create.feature +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/features/character_read.feature +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/features/conftest.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/features/image.feature +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/features/image_upscale.feature +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/features/incident_diagnostics.feature +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/features/instructions.feature +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/features/locale_picker_include.feature +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/features/test_asset_tagging_steps.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/features/test_auth_login_steps.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/features/test_auth_steps.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/features/test_character_create_steps.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/features/test_character_read_steps.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/features/test_image_steps.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/features/test_image_upscale_steps.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/features/test_incident_diagnostics_steps.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/features/test_instructions_steps.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/features/test_locale_picker_include_steps.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/features/test_step_collision_guard.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/features/test_video_agent_ui_steps.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/features/test_video_chain_steps.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/features/video_agent_ui.feature +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/features/video_chain.feature +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/fixtures/__init__.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/fixtures/seeded_catalog.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/image_batch/__init__.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/image_batch/test_image_manifest.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/image_batch/test_jitter_config.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/image_batch/test_observability_events.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/integration/__init__.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/integration/conftest.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/integration/constants.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/integration/test_expander_gateway.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/integration/test_storage_gcs.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/integration/test_storage_s3.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/mcp/__init__.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/mcp/conftest.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/mcp/test_cli_parity.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/mcp/test_server.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/mcp/test_stdio_transport.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/mcp/test_tools_helpers.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/mcp/test_tools_instructions.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/mcp/test_tools_wired.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/scripts/test_check_materiality.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/scripts/test_check_release_artifacts.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/scripts/test_check_repo_hygiene.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/scripts/test_check_website_docs_pii.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/scripts/test_codex_plugin.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/scripts/test_generate_website_docs.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/scripts/test_incident_bundle_quality.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/scripts/test_materiality_backtest.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/services/__init__.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/services/test_character_create_redaction.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/services/test_character_create_saga.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/services/test_mentions_observability.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/services/test_mentions_parse.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/services/test_mentions_resolve.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/services/test_resolve_and_apply.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/smoke/__init__.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/smoke/test_profile_account_smoke.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/smoke/test_real_flow.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/test_auth.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/test_browser_manager.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/test_chain_manifest.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/test_cli_data.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/test_cli_project.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/test_config.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/test_conftest_isolation.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/test_data_queries.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/test_diagnostics_bundle.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/test_diagnostics_events.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/test_diagnostics_journal.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/test_diagnostics_recorder.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/test_diagnostics_retention.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/test_diagnostics_sanitize.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/test_documentation_gate.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/test_errors.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/test_errors_classification.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/test_json_output.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/test_marker_registry.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/test_media.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/test_observability.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/test_overlay_banner_dismissal.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/test_paths.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/test_profile_lease.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/test_profile_lease_subprocess.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/test_profile_store.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/test_self_documenting_errors.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/test_smoke.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/tools/__init__.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/tools/test_banned.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/tools/test_expander.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/tools/test_invocation.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/tools/test_loader.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/tools/test_registry.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/tools/test_runtime.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/tools/test_spec.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/ui/test_app.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/worker/test_codec.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/worker/test_daemon.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/worker/test_mcp_daemon_race.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/worker/test_queue.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/worker/test_queue_multiprocess.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/tests/worker/test_queue_reconciliation.py +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/website/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/website/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/website/docs/CHARACTER.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/website/docs/DATA_LAYER.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/website/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/website/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/website/docs/E2E_TESTING.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/website/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/website/docs/INSTRUCTIONS.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/website/docs/MCP.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/website/docs/MOVIE.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/website/docs/PROMPT_EXPANSION.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/website/docs/SECURITY.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/website/docs/TOOLS.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/website/docs/USER_GUIDE.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/website/docs/agents.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/website/docs/index.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/website/docs/installation.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/website/docs/onboarding-mockup.html +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/website/docs/onboarding.md +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/website/docs/stylesheets/extra.css +0 -0
- {gflow_cli-0.48.0 → gflow_cli-0.49.0}/website/mkdocs.yml +0 -0
|
@@ -7,6 +7,52 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.49.0] — 2026-08-03
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- **`gflow video i2v` accepts `--model omni-flash` again — start frame only,
|
|
15
|
+
and it unlocks `--duration 10` (#125).** The 2026-05-30 wire capture that
|
|
16
|
+
justified the blanket exclusion (Flow silently dropping frame refs and
|
|
17
|
+
billing the run as text-to-video) no longer reproduces: a 2026-08-03
|
|
18
|
+
route-aborted re-capture shows Flow routing omni + start frame to
|
|
19
|
+
`batchAsyncGenerateVideoStartImage` with the frame bound, and a live x1 10s
|
|
20
|
+
generation confirmed the output starts on the supplied frame. The END frame
|
|
21
|
+
stays gated for omni-flash (`--end-frame` exits 17 pre-spend — Flow lists
|
|
22
|
+
first+last as "coming soon"), and `chain` still rejects omni-flash
|
|
23
|
+
(single-clip proof does not cover N seeded links). New credit-free recon
|
|
24
|
+
spike: `scripts/dev/spike_omni_flash_i2v_ui_recon.py`.
|
|
25
|
+
|
|
26
|
+
### Fixed
|
|
27
|
+
|
|
28
|
+
- **An out-of-range Playwright silently wedged every video generation; the
|
|
29
|
+
dependency is now upper-bounded and the stall fails fast.** `uv tool install
|
|
30
|
+
<path>` ignores `uv.lock` and resolves from the `pyproject.toml` ranges, and
|
|
31
|
+
the `playwright>=1.45.0` range had no upper bound — so a local/tool install
|
|
32
|
+
could pick up a Playwright this project has never tested. Observed: an
|
|
33
|
+
install that resolved **1.62.0** against a project locked to **1.59.0** made
|
|
34
|
+
every `gflow video i2v` run hang **silently** right after the frame upload
|
|
35
|
+
(last log line `ui_automation_video.frame_attached`, browser alive, no error,
|
|
36
|
+
no timeout, indefinitely); reinstalling with the locked version fixed it on
|
|
37
|
+
the first try. Playwright ships the browser driver, so an untested minor is
|
|
38
|
+
an untested product — the constraint is now `>=1.59.0,<1.60.0` (patch
|
|
39
|
+
headroom, no untested minors), pinned by `tests/test_playwright_pin.py`.
|
|
40
|
+
Independently, the prompt-submission stage now runs under a named wall-clock
|
|
41
|
+
watchdog: on expiry the run aborts **pre-submit** with
|
|
42
|
+
`TransportTimeoutError`, a `stage_stalled` event and a debug screenshot taken
|
|
43
|
+
under its own short deadline, and the error names the stage, prints the
|
|
44
|
+
installed Playwright version against the supported range, and gives the
|
|
45
|
+
pinned reinstall command. Nothing is submitted, so no credit is spent — a
|
|
46
|
+
silent multi-minute hang is indistinguishable from slowness in an overnight
|
|
47
|
+
batch, which is what made this expensive to diagnose.
|
|
48
|
+
- **A missing video output-count control now refuses before submit instead of
|
|
49
|
+
silently proceeding on Flow's default of x2 — which double-billed
|
|
50
|
+
`--count 1` runs (#404).** `_set_output_count` raises `UiSelectorDriftError`
|
|
51
|
+
(exit 23, debug screenshot) on a probe miss, matching the duration probe's
|
|
52
|
+
fail-fast contract (#288), and matches count-tab labels affix-agnostically
|
|
53
|
+
per digit (`xN` current / `Nx` legacy) so the next label rename degrades to
|
|
54
|
+
a fallback selector rather than an outage.
|
|
55
|
+
|
|
10
56
|
## [0.48.0] — 2026-08-02
|
|
11
57
|
|
|
12
58
|
### Added
|
|
@@ -2598,7 +2644,8 @@ shell-script template that branches on these codes.
|
|
|
2598
2644
|
|
|
2599
2645
|
First skeleton. Not functional end-to-end yet.
|
|
2600
2646
|
|
|
2601
|
-
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.
|
|
2647
|
+
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.49.0...HEAD
|
|
2648
|
+
[0.49.0]: https://github.com/ffroliva/gflow-cli/compare/v0.48.0...v0.49.0
|
|
2602
2649
|
[0.48.0]: https://github.com/ffroliva/gflow-cli/compare/v0.47.0...v0.48.0
|
|
2603
2650
|
[0.47.0]: https://github.com/ffroliva/gflow-cli/compare/v0.46.1...v0.47.0
|
|
2604
2651
|
[0.46.1]: https://github.com/ffroliva/gflow-cli/compare/v0.46.0...v0.46.1
|
|
@@ -14,6 +14,38 @@ Living list of behaviour that's broken, surprising, or limited by design — alo
|
|
|
14
14
|
|
|
15
15
|
## Open
|
|
16
16
|
|
|
17
|
+
### An out-of-range Playwright silently wedges video generation
|
|
18
|
+
|
|
19
|
+
- **Status:** Mitigated (v0.49.0 — upper-bounded dependency + fail-fast watchdog)
|
|
20
|
+
- **Severity:** High (silent, multi-minute, indistinguishable from slowness) · **Affected:** any install that resolved a Playwright outside the tested range — most often `uv tool install <path>` from a local checkout
|
|
21
|
+
|
|
22
|
+
`uv tool install <path>` **ignores `uv.lock`** and resolves from the
|
|
23
|
+
`pyproject.toml` ranges, so a local/tool install could pick up a Playwright
|
|
24
|
+
newer than anything this project has tested. Playwright ships the browser
|
|
25
|
+
driver, so an untested minor is an untested product. Observed 2026-08-03: an
|
|
26
|
+
install that resolved **1.62.0** against a project locked to **1.59.0** made
|
|
27
|
+
every `gflow video i2v` run hang **silently** immediately after the frame
|
|
28
|
+
upload — last log line `ui_automation_video.frame_attached`, browser alive, no
|
|
29
|
+
error, no timeout, indefinitely. Reinstalling with the locked version fixed it
|
|
30
|
+
on the first try.
|
|
31
|
+
|
|
32
|
+
**Mitigation (two layers):**
|
|
33
|
+
1. **Upper-bounded dependency.** `playwright>=1.59.0,<1.60.0` — an unpinned
|
|
34
|
+
install can no longer reach an untested minor. Raising it is a deliberate
|
|
35
|
+
act requiring a live-verified generation; offline tests and CI's
|
|
36
|
+
`resolve-drift` job (import-only) cannot see a driver-behaviour regression.
|
|
37
|
+
2. **Fail-fast stage watchdog.** The prompt-submission stage runs under a named
|
|
38
|
+
wall-clock deadline. On expiry the run aborts **pre-submit** with
|
|
39
|
+
`TransportTimeoutError` (exit 8), a `stage_stalled` event, and a debug
|
|
40
|
+
screenshot — the error names the stage, prints your installed Playwright
|
|
41
|
+
version against the supported range, and gives the pinned reinstall command.
|
|
42
|
+
Nothing is submitted, so no credit is spent.
|
|
43
|
+
|
|
44
|
+
**Workaround:** install from a local checkout with the lock carried explicitly —
|
|
45
|
+
`uv tool install --force --with playwright==1.59.0 .` — and check what you have
|
|
46
|
+
with `uv tool run --from gflow-cli python -c "import importlib.metadata as m; print(m.version('playwright'))"`.
|
|
47
|
+
Installs from PyPI are unaffected.
|
|
48
|
+
|
|
17
49
|
### One-time Flow banner/modal can cover the composer on first load
|
|
18
50
|
|
|
19
51
|
- **Status:** Open ([#369](https://github.com/ffroliva/gflow-cli/issues/369))
|
|
@@ -697,18 +729,21 @@ follow-up issue once samples are captured.
|
|
|
697
729
|
- **Status:** Mitigated · **Severity:** Medium · **Affects:** `gflow video chain` (v0.12.0)
|
|
698
730
|
|
|
699
731
|
Every chain link after the first is an image-to-video (I2V) generation seeded by
|
|
700
|
-
the previous clip's last frame. The
|
|
732
|
+
the previous clip's last frame. The silent-route defect historically observed on
|
|
701
733
|
`gflow video i2v` ([issue #125](https://github.com/ffroliva/gflow-cli/issues/125))
|
|
702
|
-
applies here:
|
|
703
|
-
|
|
734
|
+
applies here: a model/mode mismatch can make Flow drop the seed frame and route
|
|
735
|
+
the request to the plain text-to-video endpoint
|
|
704
736
|
(`batchAsyncGenerateVideoText`) — burning a credit for a text-only clip that
|
|
705
|
-
breaks continuity, with no error from Flow.
|
|
737
|
+
breaks continuity, with no error from Flow. (Observed live for omni-flash i2v
|
|
738
|
+
on 2026-05-30; omni-flash *single-clip start-frame* i2v was re-verified working
|
|
739
|
+
on the wire 2026-08-03 and re-enabled for `gflow video i2v`.)
|
|
706
740
|
|
|
707
741
|
**Mitigation (two layers):**
|
|
708
|
-
1. **Model pin.** `omni-flash`
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
742
|
+
1. **Model pin.** `omni-flash` is removed from the chain `--model` choices and
|
|
743
|
+
rejected by the orchestrator **before any spend**
|
|
744
|
+
(`ModelModeIncompatibilityError`, exit 17): its single-clip start-frame i2v
|
|
745
|
+
is wire-verified, but N seeded links back-to-back has not been verified at
|
|
746
|
+
chain scale, so chains stay on the Veo 3.1 family.
|
|
712
747
|
2. **Per-link wire-route abort.** For each seeded link the transport inspects the
|
|
713
748
|
captured generate-response URL; if it observes `batchAsyncGenerateVideoText`
|
|
714
749
|
for an i2v link it raises `WireFormatError` (logged
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gflow-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.49.0
|
|
4
4
|
Summary: Unofficial CLI for Google Flow — drive Veo image-to-video generations from the terminal.
|
|
5
5
|
Project-URL: Homepage, https://github.com/ffroliva/gflow-cli
|
|
6
6
|
Project-URL: Issues, https://github.com/ffroliva/gflow-cli/issues
|
|
@@ -43,7 +43,7 @@ Requires-Dist: fastapi>=0.115.0
|
|
|
43
43
|
Requires-Dist: httpx>=0.27.0
|
|
44
44
|
Requires-Dist: mcp<3,>=2.0.0
|
|
45
45
|
Requires-Dist: platformdirs>=4.0.0
|
|
46
|
-
Requires-Dist: playwright
|
|
46
|
+
Requires-Dist: playwright<1.60.0,>=1.59.0
|
|
47
47
|
Requires-Dist: pydantic-settings>=2.5.0
|
|
48
48
|
Requires-Dist: rich>=13.7.0
|
|
49
49
|
Requires-Dist: sse-starlette>=2.0.0
|
|
@@ -124,6 +124,14 @@ Outputs land under `$GFLOW_CLI_OUTPUT_DIR`, or you can route them to S3, MinIO,
|
|
|
124
124
|
|
|
125
125
|
> **Why `--browser chrome`?** Google rejects Playwright's bundled Chromium. The CLI fails fast with a friendly error (`AuthBrowserRejectedError`, exit code 14) if you pick anything else.
|
|
126
126
|
|
|
127
|
+
> **Installing from a local checkout?** `uv tool install <path>` **ignores `uv.lock`** and resolves dependencies from the `pyproject.toml` ranges, so it can hand you a Playwright build this project has never tested. Playwright ships the browser driver, and an untested minor can wedge a generation silently. Carry the locked version explicitly:
|
|
128
|
+
>
|
|
129
|
+
> ```bash
|
|
130
|
+
> uv tool install --force --with playwright==1.59.0 .
|
|
131
|
+
> ```
|
|
132
|
+
>
|
|
133
|
+
> Installing from PyPI (`uv tool install gflow-cli`) is unaffected — the published range is upper-bounded. Check what you actually have with `uv tool run --from gflow-cli python -c "import importlib.metadata as m; print(m.version('playwright'))"`.
|
|
134
|
+
|
|
127
135
|
For the full 10-minute walkthrough with troubleshooting and multi-account setup, see **[USER_GUIDE: Journey 1](docs/USER_GUIDE.md#journey-1--first-time-setup-10-minutes)**.
|
|
128
136
|
|
|
129
137
|
## Examples
|
|
@@ -53,6 +53,14 @@ Outputs land under `$GFLOW_CLI_OUTPUT_DIR`, or you can route them to S3, MinIO,
|
|
|
53
53
|
|
|
54
54
|
> **Why `--browser chrome`?** Google rejects Playwright's bundled Chromium. The CLI fails fast with a friendly error (`AuthBrowserRejectedError`, exit code 14) if you pick anything else.
|
|
55
55
|
|
|
56
|
+
> **Installing from a local checkout?** `uv tool install <path>` **ignores `uv.lock`** and resolves dependencies from the `pyproject.toml` ranges, so it can hand you a Playwright build this project has never tested. Playwright ships the browser driver, and an untested minor can wedge a generation silently. Carry the locked version explicitly:
|
|
57
|
+
>
|
|
58
|
+
> ```bash
|
|
59
|
+
> uv tool install --force --with playwright==1.59.0 .
|
|
60
|
+
> ```
|
|
61
|
+
>
|
|
62
|
+
> Installing from PyPI (`uv tool install gflow-cli`) is unaffected — the published range is upper-bounded. Check what you actually have with `uv tool run --from gflow-cli python -c "import importlib.metadata as m; print(m.version('playwright'))"`.
|
|
63
|
+
|
|
56
64
|
For the full 10-minute walkthrough with troubleshooting and multi-account setup, see **[USER_GUIDE: Journey 1](docs/USER_GUIDE.md#journey-1--first-time-setup-10-minutes)**.
|
|
57
65
|
|
|
58
66
|
## Examples
|
|
@@ -10,7 +10,7 @@ The autopilot orchestrator (`scripts/autopilot/pr_triage_autopilot.py`) runs as
|
|
|
10
10
|
|
|
11
11
|
| Variable | Scope | Purpose |
|
|
12
12
|
|---|---|---|
|
|
13
|
-
| `
|
|
13
|
+
| `CLAUDE_CODE_OAUTH_TOKEN` | Autopilot orchestrator & sandbox | Claude **subscription** token from `claude setup-token`, valid **1 year**. This deployment has no `ANTHROPIC_API_KEY`. Passed into the container as an env var. **Not** `~/.claude/.credentials.json` — `setup-token` does not write that file. |
|
|
14
14
|
| `GH_COMMENT_TOKEN` | Autopilot orchestrator (host) | The comment-only GitHub PAT used to post verdicts and reviews to `ffroliva/gflow-cli` PRs. |
|
|
15
15
|
| `TELEGRAM_BOT_TOKEN` | Autopilot orchestrator (host) | Bot token to dispatch alert messages. |
|
|
16
16
|
| `TELEGRAM_USER_ID` | Autopilot orchestrator (host) | The chat ID to receive triage alert messages. |
|
|
@@ -51,10 +51,30 @@ Ensure `iptables` is installed on the host VPS. If `iptables` permissions are wi
|
|
|
51
51
|
Configure a cron job checking every hour on the hour under the `hermes` system user:
|
|
52
52
|
|
|
53
53
|
```cron
|
|
54
|
-
0 * * * * set -a; . /opt/hermes/.env 2>/dev/null; set +a;
|
|
54
|
+
0 * * * * set -a; . /opt/hermes/.env 2>/dev/null; set +a; cd /opt/gflow-cli && uv run python scripts/autopilot/pr_triage_autopilot.py --repo-dir /opt/gflow-cli --memory-dir /opt/experience-vault/projects/C--development-github-gflow-cli/memory >> /var/log/hermes/pr_triage.log 2>&1
|
|
55
55
|
```
|
|
56
56
|
|
|
57
|
-
Sourcing `/opt/hermes/.env` first (`set -a` exports everything it defines) is what delivers the `RESEND_API_KEY` / `HERMES_NOTIFY_EMAIL_*` vars to the process
|
|
57
|
+
Sourcing `/opt/hermes/.env` first (`set -a` exports everything it defines) is what delivers `GH_COMMENT_TOKEN`, `TELEGRAM_*`, and the `RESEND_API_KEY` / `HERMES_NOTIFY_EMAIL_*` vars to the process. Without it the email channel silently disables itself, and without `GH_COMMENT_TOKEN` the run exits 1.
|
|
58
|
+
|
|
59
|
+
> **`.env` must stay bash-sourceable.** This line sources the file, so any value containing spaces or shell metacharacters has to be quoted in the SOPS store. systemd's `EnvironmentFile` parser is more permissive than bash and will not warn you: an unquoted `HERMES_NOTIFY_EMAIL_FROM=Hermes Ops <noreply@...>` broke exactly this line on 2026-08-02 (`<` is a redirect), silently dropping every variable defined after it. Fixed in hermes-ops by quoting the value.
|
|
60
|
+
|
|
61
|
+
### Claude authentication (subscription token, no API key)
|
|
62
|
+
|
|
63
|
+
The council review runs `claude -p` inside the sandbox, authenticated by `CLAUDE_CODE_OAUTH_TOKEN` — the subscription token minted by `claude setup-token`, **valid 1 year**. It is stored in hermes-ops `secrets/vps-prod.env.sops.yaml`, rendered into `/opt/hermes/.env`, and reaches the process because the cron line sources that file. The orchestrator checks it is set before building the image, so a missing token fails in a second rather than as an opaque 401 minutes into a container run.
|
|
64
|
+
|
|
65
|
+
> **It is not `~/.claude/.credentials.json`.** `setup-token` does not write that file — verified on the ops VPS 2026-08-02, where it still held the expired 2026-07-16 interactive-login token after a successful mint. Reading the file would authenticate with a dead credential. The two are separate mechanisms.
|
|
66
|
+
|
|
67
|
+
**Rotation — the one real operational dependency.** The token is a static bearer value with **no refresh pair**: it cannot self-renew, and nothing in the API surface reports its age. The previous interactive token 401'd silently for 16 days. Rotate before the 1-year mark:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
sudo -u hermes -H claude setup-token # prints the token ONCE
|
|
71
|
+
# store it in hermes-ops secrets/vps-prod.env.sops.yaml as CLAUDE_CODE_OAUTH_TOKEN
|
|
72
|
+
sudo -u hermes -H bash -c 'set -a; . /opt/hermes/.env; set +a; claude -p "say OK"' # verify
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
The daily `ev-ops-health` Telegram digest carries the expiry countdown; treat that warning as the rotation trigger.
|
|
76
|
+
|
|
77
|
+
**Accepted risk (operator, 2026-08-02):** the token grants inference on the whole subscription and is injected into a container that reviews untrusted external PRs. Its scope is `user:inference` only — narrower than the five scopes an interactive login carries — and the §3 egress firewall is the compensating control. Accepted because no API key exists for this account.
|
|
58
78
|
|
|
59
79
|
### Deploy mechanism (warning)
|
|
60
80
|
|
|
@@ -411,7 +411,7 @@ each link in turn, so total wallclock is the sum of all link waits).
|
|
|
411
411
|
|
|
412
412
|
| Flag | Default | Notes |
|
|
413
413
|
|---|---|---|
|
|
414
|
-
| `--model` | `veo-lite` | `veo-lite` / `veo-fast` / `veo-quality` / `veo-lite-lp`. `omni-flash` is rejected —
|
|
414
|
+
| `--model` | `veo-lite` | `veo-lite` / `veo-fast` / `veo-quality` / `veo-lite-lp`. `omni-flash` is rejected — its single-clip start-frame i2v is verified, chain-scale seeding is not (issue #125). |
|
|
415
415
|
| `--max-links N` | unset | Cap link count; exit 11 (`ConfigurationError`) if the manifest has more. A spend guardrail. |
|
|
416
416
|
| `-y` / `--yes` | off | Skip the pending video operation confirmation prompt. |
|
|
417
417
|
| `--dry-run` | off | Print the pending video operation plan and submit nothing. |
|
|
@@ -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.48.0](LIVE_VERIFICATION_v0.48.0.md) (**#411 predictable `-o`/`--output` paths, offline-verified 2026-08-02, ZERO credits** — exact single-target local writes + `_1`/`_2` multi-count **image** suffixes proven by the CLI suite; the pre-tag council audit [RED, then resolved] re-scoped the release to the truthful surface: a dead MCP `output` param was deleted [worker queue never read it — #414], cloud `-o` targets and video multi-count suffixes are follow-ups [#415], and two tautological video-path tests are recorded as weak evidence rather than claimed as proof; storage-layer S3 writes verified against Docker MinIO at the layer level only; 2888-test release tree green; the live-Flow run aborted pre-generation on an expired denon82 session [`AuthExpiredError` 401, correct RFC-7807 contract + remediation hint, $0] — recorded, not omitted; live re-run queued for the next authenticated session). Prior: [v0.47.0](LIVE_VERIFICATION_v0.47.0.md) (**MCP SDK 2.0.0 migration + dual-era protocol + #402 entity provenance recording live-verified 2026-08-01, ZERO credits** — stdio JSON-RPC initialization handshake verified over subprocess transport, `resolve-drift` CI job added to prevent dependency drift, and 121 unit tests in `tests/data` passed). Prior: [v0.46.1](LIVE_VERIFICATION_v0.46.1.md) (**#404 classic count-setter fix live-verified 2026-07-31 on the reporter's exact environment, ZERO credits** — credit-free DOM recon proved Flow renamed the count-tab labels to uniform `xN` [`x1` replaces `1x`, image AND video rows], that `nth(0)` of the old filtered set landed on the selected `x2` and actively moved the count AWAY from the target, and that a digit-keyed click on `x1` converges instantly and persists without a Save commit; the new classic e2e then passed live [count=1 against a fresh project displaying 2 → exactly 1 image; count=2 early-exit → exactly 2], and the #313 agentic count-enforcement e2e passed 4/4 [counts 1–4 vs deliberately mismatched sticky defaults, magic-byte-verified downloads] after its stale setup was repaired [Flow now loads the editor in classic mode — the setup needed an Agent-pill toggle before the `tune` icon; test-only fix, no product code implicated]; the video output-count cascade carries a recorded waiver [full drive costs Veo credits; its exact selector shape was exercised live in the spike's cleanup step]). Prior: [v0.46.0](LIVE_VERIFICATION_v0.46.0.md) (**#387 provider-agnostic prompt-tools transport live-verified 2026-07-28, ZERO credits** — a four-probe capability spike passed 4/4 against BOTH a non-Google gateway and Google's OpenAI-compat endpoint, including a *semantic* multimodal check [a generated solid-red JPEG round-tripped and the model answered 'Red'], which is what proved the native Gemini `inlineData` path could be deleted outright rather than kept as a fallback; the real CLI then returned `was_expanded: true` on gateway/gateway-no-model/Google-default, emitted the loud one-time notice + no-op for the removed `GFLOW_CLI_GEMINI_API_KEY`, and made NO network call when unconfigured. Live verification caught two defects a fully green 2849-test offline suite missed: Google's compat endpoint has no server-side default model [`400 "model is not specified"`, silently no-oping the DEFAULT configuration], and the first redirect guard did not actually work because `build_opener()` installs its default handlers regardless of arguments, so `Authorization` would still have been replayed cross-host. `/code-review high` is recorded as NOT run — it is user-triggered only). Prior: [v0.45.0](LIVE_VERIFICATION_v0.45.0.md) (**#393 UUID `--ref` binding + #395 character-entity binding live-verified 2026-07-27/28** — a controlled A/B on identical input flipped `--ref` from exit 9 to exit 0 via the catalog-backed upload fallback, with the anti-silence guard [an unbindable ref aborts non-zero and writes no image] pinned by a live e2e; picker DOM + HAR showed Flow indexes a short auto-caption, NOT the prompt, so a prompt-derived search hint was dropped rather than shipped on assumption; a CDP spike against Flow's own character flow then captured the `entityContext` contract that gflow's generations were missing, root-causing #395 to two gflow defects [overlay dismissal Escaping Flow's own composer, and a character-route bounce that sent the prompt to the project composer] — both fixed, both character e2e tests now pass live, including `--format-prompt` [#383], with a read-back confirming the character carries its name and `thumbnail_media_id`). Prior: [v0.44.0](LIVE_VERIFICATION_v0.44.0.md) (**#381 dual-side project management & Playwright Chromium transport live-verified 2026-07-26** — real-editor project creation + rename tRPC server/DOM sync, prompt slugging, `gflow project` subcommand family, HTTP 429 adaptive backoff, and full E2E test suite). Prior: [v0.43.0](LIVE_VERIFICATION_v0.43.0.md) (**private incident diagnostics live-verified 2026-07-23, 1 Veo credit**). Prior: [v0.42.0](LIVE_VERIFICATION_v0.42.0.md) (**#361 production-readiness live-gaps confirmed live 2026-07-21, 1 Veo credit** — a real `veo-lite` t2v through the worker path persisted a real `remote_started` checkpoint [observer→checkpoint→DB chain confirmed], crash-recovery classified the task `indeterminate` without resubmitting, and mid-launch cancellation released the `ProfileLease` credit-free; full evidence in [v0.40.0-production-readiness § "2026-07-21 live follow-up"](LIVE_VERIFICATION_v0.40.0-production-readiness.md#2026-07-21-live-follow-up-0420-cycle); #359 content-safety `400`→`ContentPolicyError` classification is unit-covered, not live-triggered [would require a deliberate policy violation]; #360/#362 are docs-only, verified by the documentation gates). Prior: [v0.41.0](LIVE_VERIFICATION_v0.41.0.md) (**#357 production-readiness hardening — stale-session fail-fast, free image gen, paid veo-lite T2V all proven live**). Prior: [v0.40.0](LIVE_VERIFICATION_v0.40.0.md) (**#344 `@`-mention asset-tagging resolution proven live e2e, ~2 Imagen credits** — `gflow character create` staged a real taggable character [bound reference images, `has_reference_images` guard], the e2e test's documented propagation wait cleared Flow's `projectInitialData` lag, and `gflow image t2i "@Zoro …"` passed with returncode 0, a real generated image, and the correctly de-tagged prompt in the catalog — no code changes needed, `resolve_and_apply` as merged in #344 already works end-to-end; pre-existing unrelated issue #174 [Flow media-library A/B flake] can still intermittently block generation regardless of this feature — recorded, not omitted). Prior: [v0.39.0](LIVE_VERIFICATION_v0.39.0.md) (**#341 failed-generation persistence proven live** — a real `image t2i` on denon82 failed at the wire [`batchGenerateImages` HTTP 400 → `WireFormatError`] and the record-on-catch funnel wrote the **first-ever `failed` row** into the production catalog [`error_type=wire-format`, redacted `error_detail`, browsable via `gflow data list errors`], **$0**; the remaining paid paths [video/chain/batch/movie/worker] are funnel-regression-tested, not force-failed live [would cost credits], and the status-aware `succeeded=false` video-poll fix is unit-locked — recorded, not omitted). Prior: [v0.38.1](LIVE_VERIFICATION_v0.38.1.md) (**#338 agentic-pin recovery proven live ON the pinned account** — run 1 caught the composer-render race the unit suite could not [`ensure_media_incomplete` +115 ms, toggle never reached]; the readiness-wait fix landed and run 2 recovered classic on denon82 after ~2h of pin [`ui_driver.bound mode=classic`, real 768×1376 JPEG, exact prompt adherence]; reload branch unit-locked, live trigger not observed this cycle — recorded, not omitted). Prior: [v0.38.0](LIVE_VERIFICATION_v0.38.0.md) (**#332 mode control + #314 i2i ref dedup proven live e2e** — `image t2i --ui-mode classic` recovered agentic→classic in a real run [`ui_mode.attempt_exit_agent` → full classic chain, 1376×768 JPEG]; two identical `image i2i` runs proved the dedup contract [run 1: picker miss → `image_uploaded`; run 2: `reference_deduped_by_filename`, ZERO uploads]; `video t2v` veo-fast [`MEDIA_GENERATION_STATUS_SUCCESSFUL`, 15.2 MB `ftyp` mp4]; autopilot #333 recorded deferred-with-reason [hermes-ops deployment staged separately]). Prior: [v0.37.0](LIVE_VERIFICATION_v0.37.0.md) (**viewport 1920×1080 + agentic count enforcement + FIPS-safe SAPISIDHASH proven live e2e** — `image t2i` [classic cohort, real 1376×768 JPEG] and `video t2v` veo-fast [`MEDIA_GENERATION_STATUS_SUCCESSFUL`, 11.5 MB `ftyp` mp4] both succeeded end-to-end at the new 1920×1080 viewport with every selector resolving [no drift]; SAPISIDHASH digest verified byte-identical [FIPS-safe `usedforsecurity=False`], auth unchanged). Prior: [v0.36.0](LIVE_VERIFICATION_v0.36.0.md) (**#316 diagnostic tooling live-verified against real Flow traffic** — `GFLOW_CLI_HAR_PATH` captured a real 54-entry HAR [real Flow domains, 34× 200s, and a genuine 401 the tool exists to diagnose]; `GFLOW_CLI_DEBUG_TRACEBACK`'s typed-error scoping confirmed live [console output identical with/without the flag on a `GFlowError`]; unhandled-path behavior covered by 6 new tests (30 total across both files) + SDD task review; #312 reference-entity-smuggling fix covered by its own dedicated e2e test). Prior: [v0.35.0](LIVE_VERIFICATION_v0.35.0.md) (**#305-follow-up multimodal reverse-engineering & storyboard tool proven live e2e** — `gflow tools run storyboard` successfully deconstructed a cyberpunk scene into a cohesive 4-panel sequence; `reverse-engineer` tool extracts frames from video streams/URLs using `claude-video`'s `watch.py` and produces structured prompt components using Gemini multimodal models; dynamic token budgeting and strict Pyright types verified via test suite). Prior: [v0.34.0](LIVE_VERIFICATION_v0.34.0.md) (**#299 `--ui-mode` gate proven live, ZERO credits** — drove `get_ui_driver` directly over 4 real editor loads, never generated: bidirectional switch works [classic→agentic via `_force_agent_mode`, agentic→classic via `_exit_agent_mode`, each DOM-reverified], `agentic`-when-already-agentic is idempotent, and a timed-out toggle → **exit-28 fail-fast before submission**; deprecation behavior-change [`prefer_classic`→exit 28] confirmed). Prior: [v0.33.0](LIVE_VERIFICATION_v0.33.0.md) (**#287-follow-up picker fix proven live on the original repro** — the v0.32.1-failing `i2v <uuid> --project <crowded>` command now exits 0 with a real 3.0 MB `ftyp` mp4, `frame_ref_attached` + `video_saved`, zero uploads; **#241 jitter live-verified on both paths** — flag `--jitter 4-6` → `batch_jitter_sleep seconds=4.98`, and the new 0.5–1.5 s default → `seconds=1.47`, each firing exactly once between two t2i submissions; environment note: the denon82 cohort is now natively agentic and round-2 generations hit the pre-existing #281 `MediaAttributionError`, not a regression). Prior: [v0.32.1](LIVE_VERIFICATION_v0.32.1.md) (**#293 teardown fix live-verified credit-free** — error-path aborts leave ZERO chrome.exe holding the profile [3× leak reproduced pre-fix same day]; force-close fallback + ProfileLockedError translation unit-pinned; #283 wave logic fixes mock-verified to exact call counts). Prior: [v0.32.0](LIVE_VERIFICATION_v0.32.0.md) (**#287 UUID i2v frames proven live e2e** — an in-project asset selected by media UUID in the frame-slot dialog [frame_ref_attached, startImage bound on the wire, ZERO upload events] produced a real 720×1280 interpolation, resolving the #237 negative prior; foreign UUID → exit 9 pre-generation with screenshot; **#288 duration fail-fast proven live** — exit 23 pre-submit saved a 10-credit generation, and the debug screenshot confirmed the duration control is ABSENT from the cohort's settings popover [locale hypothesis refuted]; upload-400 exit-27 repro deferred-with-reason — the original rejected JPEG no longer exists). Prior: [v0.31.0](LIVE_VERIFICATION_v0.31.0.md) (**#281 wrong-media defenses live-verified in BOTH directions, credit-free** — correct attribution downloads with real wire metadata [seed, 768×1376]; the incident-class lazy-render ambiguity reproduced live and hard-stopped with `MediaAttributionError` exit 26 naming every candidate UUID, no file written; **#282 two-UUID-ref i2i proven e2e** — both freshly generated portrait UUIDs picker-selected into one scene with both canonical identities visually transferred). Prior: [v0.30.0](LIVE_VERIFICATION_v0.30.0.md) (**agentic-cohort image path + both fixes live-verified credit-free** — native 768×1376 stills, i2i-chain + canonical-ref identity hold; the character-create `DataIntegrityError` and the `prefer_classic` WARNING were observed live then fixed [recorder idempotent + INFO log]; MCP video-param feature deferred-with-reason on Veo credits, per the stills-only goal). Prior: [v0.29.0](LIVE_VERIFICATION_v0.29.0.md) (**persistent `gflow instructions` CRUD proven live e2e GREEN, credit-free** — 11-command sequence on a fresh project: add incl. `--ref <image-UUID>` attach, list/enable/disable, master toggle both ways, TOML `apply` destructive full-sync with `enabled=false` honored, `rm` with server card-id preserved across mutations; movie brief-sync code-path-verified via the same primitives, deferred-with-reason on credits; MCP `gflow_instructions_*` tools are thin adapters over the live-verified primitives). Prior: [v0.28.0](LIVE_VERIFICATION_v0.28.0.md) (**agent instructions `-i` now steer agentic generation — crayon e2e GREEN**: a style-neutral prompt + an enabled "crayon" card produced an unmistakable crayon drawing through the real transport; root causes were conversational phrasing + the `project_brief.enabled` master switch). Prior: [v0.27.1](LIVE_VERIFICATION_v0.27.1.md) (**v0.27.0 release follow-up fixes and documentation sync**). Prior: [v0.27.0](LIVE_VERIFICATION_v0.27.0.md) (**`[style]` block with named variants + prompt-aware resume — credit-free CLI verification**: real `movie run --dry-run` 3-way ledger proving resolved-style display, `skip (done)` on matching `style_hash`, and `re-run (style changed)` after a style edit; composition is local, wire path untouched, so no Veo credits spent — first credited styled run will confirm visually). Prior: [v0.26.0](LIVE_VERIFICATION_v0.26.0.md) (**image i2i by generated-image UUID proven live e2e GREEN** — the existing asset is *selected in place* by its media UUID, no duplicate upload, producing an i2i output that references it; plus generated-image `display_name` capture, credited @C1ph3r404). Prior: [v0.25.0](LIVE_VERIFICATION_v0.25.0.md) (**#237 remote-UUID i2v proven live e2e GREEN** — a real 8s 720×1280 interpolation from a generated image's UUID, after the picker-search attach was reworked to local upload; #240 home-`.env` matrix live; plus two silent-failure guards root-caused live: video-as-image download rejection and rejected-upload fail-loud). Prior: [v0.24.0](LIVE_VERIFICATION_v0.24.0.md) (--project parity across CLI + MCP — automated coverage; live gen auth-gated). Prior: [v0.23.0](LIVE_VERIFICATION_v0.23.0.md) (MCP generation wiring proven live end-to-end — tool→worker→real Flow REST→structured-error translation; final image-write blocked by an expired session, environmental. #222 macOS fix reporter-verified e2e on Apple Silicon). Prior: [v0.22.0](LIVE_VERIFICATION_v0.22.0.md) (Tools framework — automated/CI coverage complete; credit/key-gated live feature run is a pending owner gate, see the doc) · [v0.21.0](LIVE_VERIFICATION_v0.21.0.md) (MCP server over stdio + HTTP/SSE — credit-free protocol handshake; 4 tools / 2 prompts / 3 resources confirmed on stdout) · [v0.20.1](LIVE_VERIFICATION_v0.20.1.md) · [v0.20.0](LIVE_VERIFICATION_v0.20.0.md) · [v0.19.0](LIVE_VERIFICATION_v0.19.0.md) · [v0.18.0](LIVE_VERIFICATION_v0.18.0.md) · [v0.17.0](LIVE_VERIFICATION_v0.17.0.md) · [v0.16.0](LIVE_VERIFICATION_v0.16.0.md) · [v0.13.0](LIVE_VERIFICATION_v0.13.0.md) · [v0.12.0](LIVE_VERIFICATION_v0.12.0.md) · [v0.11.0](LIVE_VERIFICATION_v0.11.0.md) · [v0.10.0](LIVE_VERIFICATION_v0.10.0.md) · [v0.9.1](LIVE_VERIFICATION_v0.9.1.md) · [v0.9.0](LIVE_VERIFICATION_v0.9.0.md) · [v0.8.1](LIVE_VERIFICATION_v0.8.1.md) · [v0.7.0](LIVE_VERIFICATION_v0.7.0.md)
|
|
138
|
+
**What was actually live-verified for the latest release?** → latest: [LIVE_VERIFICATION_v0.49.0](LIVE_VERIFICATION_v0.49.0.md) (**#125 `omni-flash` start-frame I2V video generation, Playwright dependency upper-bound pin `>=1.59.0,<1.60.0`, submission stage watchdog timeout, and #404 count-tab fail-closed logic verified 2026-08-03** — 0-credit wire intercept captured `batchAsyncGenerateVideoStartImage` with `startImage` bound; live costed generation on `omni-flash` I2V produced a 1.2MB valid mp4 video asset on `ffroliva`; full 2902-test release suite green). Prior: [v0.48.0](LIVE_VERIFICATION_v0.48.0.md) (**#411 predictable `-o`/`--output` paths, offline-verified 2026-08-02, ZERO credits** — exact single-target local writes + `_1`/`_2` multi-count **image** suffixes proven by the CLI suite; the pre-tag council audit [RED, then resolved] re-scoped the release to the truthful surface: a dead MCP `output` param was deleted [worker queue never read it — #414], cloud `-o` targets and video multi-count suffixes are follow-ups [#415], and two tautological video-path tests are recorded as weak evidence rather than claimed as proof; storage-layer S3 writes verified against Docker MinIO at the layer level only; 2888-test release tree green; the live-Flow run aborted pre-generation on an expired denon82 session [`AuthExpiredError` 401, correct RFC-7807 contract + remediation hint, $0] — recorded, not omitted; live re-run queued for the next authenticated session). Prior: [v0.47.0](LIVE_VERIFICATION_v0.47.0.md) (**MCP SDK 2.0.0 migration + dual-era protocol + #402 entity provenance recording live-verified 2026-08-01, ZERO credits** — stdio JSON-RPC initialization handshake verified over subprocess transport, `resolve-drift` CI job added to prevent dependency drift, and 121 unit tests in `tests/data` passed). Prior: [v0.46.1](LIVE_VERIFICATION_v0.46.1.md) (**#404 classic count-setter fix live-verified 2026-07-31 on the reporter's exact environment, ZERO credits** — credit-free DOM recon proved Flow renamed the count-tab labels to uniform `xN` [`x1` replaces `1x`, image AND video rows], that `nth(0)` of the old filtered set landed on the selected `x2` and actively moved the count AWAY from the target, and that a digit-keyed click on `x1` converges instantly and persists without a Save commit; the new classic e2e then passed live [count=1 against a fresh project displaying 2 → exactly 1 image; count=2 early-exit → exactly 2], and the #313 agentic count-enforcement e2e passed 4/4 [counts 1–4 vs deliberately mismatched sticky defaults, magic-byte-verified downloads] after its stale setup was repaired [Flow now loads the editor in classic mode — the setup needed an Agent-pill toggle before the `tune` icon; test-only fix, no product code implicated]; the video output-count cascade carries a recorded waiver [full drive costs Veo credits; its exact selector shape was exercised live in the spike's cleanup step]). Prior: [v0.46.0](LIVE_VERIFICATION_v0.46.0.md) (**#387 provider-agnostic prompt-tools transport live-verified 2026-07-28, ZERO credits** — a four-probe capability spike passed 4/4 against BOTH a non-Google gateway and Google's OpenAI-compat endpoint, including a *semantic* multimodal check [a generated solid-red JPEG round-tripped and the model answered 'Red'], which is what proved the native Gemini `inlineData` path could be deleted outright rather than kept as a fallback; the real CLI then returned `was_expanded: true` on gateway/gateway-no-model/Google-default, emitted the loud one-time notice + no-op for the removed `GFLOW_CLI_GEMINI_API_KEY`, and made NO network call when unconfigured. Live verification caught two defects a fully green 2849-test offline suite missed: Google's compat endpoint has no server-side default model [`400 "model is not specified"`, silently no-oping the DEFAULT configuration], and the first redirect guard did not actually work because `build_opener()` installs its default handlers regardless of arguments, so `Authorization` would still have been replayed cross-host. `/code-review high` is recorded as NOT run — it is user-triggered only). Prior: [v0.45.0](LIVE_VERIFICATION_v0.45.0.md) (**#393 UUID `--ref` binding + #395 character-entity binding live-verified 2026-07-27/28** — a controlled A/B on identical input flipped `--ref` from exit 9 to exit 0 via the catalog-backed upload fallback, with the anti-silence guard [an unbindable ref aborts non-zero and writes no image] pinned by a live e2e; picker DOM + HAR showed Flow indexes a short auto-caption, NOT the prompt, so a prompt-derived search hint was dropped rather than shipped on assumption; a CDP spike against Flow's own character flow then captured the `entityContext` contract that gflow's generations were missing, root-causing #395 to two gflow defects [overlay dismissal Escaping Flow's own composer, and a character-route bounce that sent the prompt to the project composer] — both fixed, both character e2e tests now pass live, including `--format-prompt` [#383], with a read-back confirming the character carries its name and `thumbnail_media_id`). Prior: [v0.44.0](LIVE_VERIFICATION_v0.44.0.md) (**#381 dual-side project management & Playwright Chromium transport live-verified 2026-07-26** — real-editor project creation + rename tRPC server/DOM sync, prompt slugging, `gflow project` subcommand family, HTTP 429 adaptive backoff, and full E2E test suite). Prior: [v0.43.0](LIVE_VERIFICATION_v0.43.0.md) (**private incident diagnostics live-verified 2026-07-23, 1 Veo credit**). Prior: [v0.42.0](LIVE_VERIFICATION_v0.42.0.md) (**#361 production-readiness live-gaps confirmed live 2026-07-21, 1 Veo credit** — a real `veo-lite` t2v through the worker path persisted a real `remote_started` checkpoint [observer→checkpoint→DB chain confirmed], crash-recovery classified the task `indeterminate` without resubmitting, and mid-launch cancellation released the `ProfileLease` credit-free; full evidence in [v0.40.0-production-readiness § "2026-07-21 live follow-up"](LIVE_VERIFICATION_v0.40.0-production-readiness.md#2026-07-21-live-follow-up-0420-cycle); #359 content-safety `400`→`ContentPolicyError` classification is unit-covered, not live-triggered [would require a deliberate policy violation]; #360/#362 are docs-only, verified by the documentation gates). Prior: [v0.41.0](LIVE_VERIFICATION_v0.41.0.md) (**#357 production-readiness hardening — stale-session fail-fast, free image gen, paid veo-lite T2V all proven live**). Prior: [v0.40.0](LIVE_VERIFICATION_v0.40.0.md) (**#344 `@`-mention asset-tagging resolution proven live e2e, ~2 Imagen credits** — `gflow character create` staged a real taggable character [bound reference images, `has_reference_images` guard], the e2e test's documented propagation wait cleared Flow's `projectInitialData` lag, and `gflow image t2i "@Zoro …"` passed with returncode 0, a real generated image, and the correctly de-tagged prompt in the catalog — no code changes needed, `resolve_and_apply` as merged in #344 already works end-to-end; pre-existing unrelated issue #174 [Flow media-library A/B flake] can still intermittently block generation regardless of this feature — recorded, not omitted). Prior: [v0.39.0](LIVE_VERIFICATION_v0.39.0.md) (**#341 failed-generation persistence proven live** — a real `image t2i` on denon82 failed at the wire [`batchGenerateImages` HTTP 400 → `WireFormatError`] and the record-on-catch funnel wrote the **first-ever `failed` row** into the production catalog [`error_type=wire-format`, redacted `error_detail`, browsable via `gflow data list errors`], **$0**; the remaining paid paths [video/chain/batch/movie/worker] are funnel-regression-tested, not force-failed live [would cost credits], and the status-aware `succeeded=false` video-poll fix is unit-locked — recorded, not omitted). Prior: [v0.38.1](LIVE_VERIFICATION_v0.38.1.md) (**#338 agentic-pin recovery proven live ON the pinned account** — run 1 caught the composer-render race the unit suite could not [`ensure_media_incomplete` +115 ms, toggle never reached]; the readiness-wait fix landed and run 2 recovered classic on denon82 after ~2h of pin [`ui_driver.bound mode=classic`, real 768×1376 JPEG, exact prompt adherence]; reload branch unit-locked, live trigger not observed this cycle — recorded, not omitted). Prior: [v0.38.0](LIVE_VERIFICATION_v0.38.0.md) (**#332 mode control + #314 i2i ref dedup proven live e2e** — `image t2i --ui-mode classic` recovered agentic→classic in a real run [`ui_mode.attempt_exit_agent` → full classic chain, 1376×768 JPEG]; two identical `image i2i` runs proved the dedup contract [run 1: picker miss → `image_uploaded`; run 2: `reference_deduped_by_filename`, ZERO uploads]; `video t2v` veo-fast [`MEDIA_GENERATION_STATUS_SUCCESSFUL`, 15.2 MB `ftyp` mp4]; autopilot #333 recorded deferred-with-reason [hermes-ops deployment staged separately]). Prior: [v0.37.0](LIVE_VERIFICATION_v0.37.0.md) (**viewport 1920×1080 + agentic count enforcement + FIPS-safe SAPISIDHASH proven live e2e** — `image t2i` [classic cohort, real 1376×768 JPEG] and `video t2v` veo-fast [`MEDIA_GENERATION_STATUS_SUCCESSFUL`, 11.5 MB `ftyp` mp4] both succeeded end-to-end at the new 1920×1080 viewport with every selector resolving [no drift]; SAPISIDHASH digest verified byte-identical [FIPS-safe `usedforsecurity=False`], auth unchanged). Prior: [v0.36.0](LIVE_VERIFICATION_v0.36.0.md) (**#316 diagnostic tooling live-verified against real Flow traffic** — `GFLOW_CLI_HAR_PATH` captured a real 54-entry HAR [real Flow domains, 34× 200s, and a genuine 401 the tool exists to diagnose]; `GFLOW_CLI_DEBUG_TRACEBACK`'s typed-error scoping confirmed live [console output identical with/without the flag on a `GFlowError`]; unhandled-path behavior covered by 6 new tests (30 total across both files) + SDD task review; #312 reference-entity-smuggling fix covered by its own dedicated e2e test). Prior: [v0.35.0](LIVE_VERIFICATION_v0.35.0.md) (**#305-follow-up multimodal reverse-engineering & storyboard tool proven live e2e** — `gflow tools run storyboard` successfully deconstructed a cyberpunk scene into a cohesive 4-panel sequence; `reverse-engineer` tool extracts frames from video streams/URLs using `claude-video`'s `watch.py` and produces structured prompt components using Gemini multimodal models; dynamic token budgeting and strict Pyright types verified via test suite). Prior: [v0.34.0](LIVE_VERIFICATION_v0.34.0.md) (**#299 `--ui-mode` gate proven live, ZERO credits** — drove `get_ui_driver` directly over 4 real editor loads, never generated: bidirectional switch works [classic→agentic via `_force_agent_mode`, agentic→classic via `_exit_agent_mode`, each DOM-reverified], `agentic`-when-already-agentic is idempotent, and a timed-out toggle → **exit-28 fail-fast before submission**; deprecation behavior-change [`prefer_classic`→exit 28] confirmed). Prior: [v0.33.0](LIVE_VERIFICATION_v0.33.0.md) (**#287-follow-up picker fix proven live on the original repro** — the v0.32.1-failing `i2v <uuid> --project <crowded>` command now exits 0 with a real 3.0 MB `ftyp` mp4, `frame_ref_attached` + `video_saved`, zero uploads; **#241 jitter live-verified on both paths** — flag `--jitter 4-6` → `batch_jitter_sleep seconds=4.98`, and the new 0.5–1.5 s default → `seconds=1.47`, each firing exactly once between two t2i submissions; environment note: the denon82 cohort is now natively agentic and round-2 generations hit the pre-existing #281 `MediaAttributionError`, not a regression). Prior: [v0.32.1](LIVE_VERIFICATION_v0.32.1.md) (**#293 teardown fix live-verified credit-free** — error-path aborts leave ZERO chrome.exe holding the profile [3× leak reproduced pre-fix same day]; force-close fallback + ProfileLockedError translation unit-pinned; #283 wave logic fixes mock-verified to exact call counts). Prior: [v0.32.0](LIVE_VERIFICATION_v0.32.0.md) (**#287 UUID i2v frames proven live e2e** — an in-project asset selected by media UUID in the frame-slot dialog [frame_ref_attached, startImage bound on the wire, ZERO upload events] produced a real 720×1280 interpolation, resolving the #237 negative prior; foreign UUID → exit 9 pre-generation with screenshot; **#288 duration fail-fast proven live** — exit 23 pre-submit saved a 10-credit generation, and the debug screenshot confirmed the duration control is ABSENT from the cohort's settings popover [locale hypothesis refuted]; upload-400 exit-27 repro deferred-with-reason — the original rejected JPEG no longer exists). Prior: [v0.31.0](LIVE_VERIFICATION_v0.31.0.md) (**#281 wrong-media defenses live-verified in BOTH directions, credit-free** — correct attribution downloads with real wire metadata [seed, 768×1376]; the incident-class lazy-render ambiguity reproduced live and hard-stopped with `MediaAttributionError` exit 26 naming every candidate UUID, no file written; **#282 two-UUID-ref i2i proven e2e** — both freshly generated portrait UUIDs picker-selected into one scene with both canonical identities visually transferred). Prior: [v0.30.0](LIVE_VERIFICATION_v0.30.0.md) (**agentic-cohort image path + both fixes live-verified credit-free** — native 768×1376 stills, i2i-chain + canonical-ref identity hold; the character-create `DataIntegrityError` and the `prefer_classic` WARNING were observed live then fixed [recorder idempotent + INFO log]; MCP video-param feature deferred-with-reason on Veo credits, per the stills-only goal). Prior: [v0.29.0](LIVE_VERIFICATION_v0.29.0.md) (**persistent `gflow instructions` CRUD proven live e2e GREEN, credit-free** — 11-command sequence on a fresh project: add incl. `--ref <image-UUID>` attach, list/enable/disable, master toggle both ways, TOML `apply` destructive full-sync with `enabled=false` honored, `rm` with server card-id preserved across mutations; movie brief-sync code-path-verified via the same primitives, deferred-with-reason on credits; MCP `gflow_instructions_*` tools are thin adapters over the live-verified primitives). Prior: [v0.28.0](LIVE_VERIFICATION_v0.28.0.md) (**agent instructions `-i` now steer agentic generation — crayon e2e GREEN**: a style-neutral prompt + an enabled "crayon" card produced an unmistakable crayon drawing through the real transport; root causes were conversational phrasing + the `project_brief.enabled` master switch). Prior: [v0.27.1](LIVE_VERIFICATION_v0.27.1.md) (**v0.27.0 release follow-up fixes and documentation sync**). Prior: [v0.27.0](LIVE_VERIFICATION_v0.27.0.md) (**`[style]` block with named variants + prompt-aware resume — credit-free CLI verification**: real `movie run --dry-run` 3-way ledger proving resolved-style display, `skip (done)` on matching `style_hash`, and `re-run (style changed)` after a style edit; composition is local, wire path untouched, so no Veo credits spent — first credited styled run will confirm visually). Prior: [v0.26.0](LIVE_VERIFICATION_v0.26.0.md) (**image i2i by generated-image UUID proven live e2e GREEN** — the existing asset is *selected in place* by its media UUID, no duplicate upload, producing an i2i output that references it; plus generated-image `display_name` capture, credited @C1ph3r404). Prior: [v0.25.0](LIVE_VERIFICATION_v0.25.0.md) (**#237 remote-UUID i2v proven live e2e GREEN** — a real 8s 720×1280 interpolation from a generated image's UUID, after the picker-search attach was reworked to local upload; #240 home-`.env` matrix live; plus two silent-failure guards root-caused live: video-as-image download rejection and rejected-upload fail-loud). Prior: [v0.24.0](LIVE_VERIFICATION_v0.24.0.md) (--project parity across CLI + MCP — automated coverage; live gen auth-gated). Prior: [v0.23.0](LIVE_VERIFICATION_v0.23.0.md) (MCP generation wiring proven live end-to-end — tool→worker→real Flow REST→structured-error translation; final image-write blocked by an expired session, environmental. #222 macOS fix reporter-verified e2e on Apple Silicon). Prior: [v0.22.0](LIVE_VERIFICATION_v0.22.0.md) (Tools framework — automated/CI coverage complete; credit/key-gated live feature run is a pending owner gate, see the doc) · [v0.21.0](LIVE_VERIFICATION_v0.21.0.md) (MCP server over stdio + HTTP/SSE — credit-free protocol handshake; 4 tools / 2 prompts / 3 resources confirmed on stdout) · [v0.20.1](LIVE_VERIFICATION_v0.20.1.md) · [v0.20.0](LIVE_VERIFICATION_v0.20.0.md) · [v0.19.0](LIVE_VERIFICATION_v0.19.0.md) · [v0.18.0](LIVE_VERIFICATION_v0.18.0.md) · [v0.17.0](LIVE_VERIFICATION_v0.17.0.md) · [v0.16.0](LIVE_VERIFICATION_v0.16.0.md) · [v0.13.0](LIVE_VERIFICATION_v0.13.0.md) · [v0.12.0](LIVE_VERIFICATION_v0.12.0.md) · [v0.11.0](LIVE_VERIFICATION_v0.11.0.md) · [v0.10.0](LIVE_VERIFICATION_v0.10.0.md) · [v0.9.1](LIVE_VERIFICATION_v0.9.1.md) · [v0.9.0](LIVE_VERIFICATION_v0.9.0.md) · [v0.8.1](LIVE_VERIFICATION_v0.8.1.md) · [v0.7.0](LIVE_VERIFICATION_v0.7.0.md)
|
|
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,22 @@
|
|
|
1
|
+
# Live Verification — v0.49.0
|
|
2
|
+
|
|
3
|
+
- **Scope**: Re-enable `omni-flash` start-frame I2V video generation (#125), Playwright dependency upper-bound pin (`playwright>=1.59.0,<1.60.0`), submission stage watchdog timeout (`TransportTimeoutError`), and count-tab fail-closed selector logic (#404) via PR #424 (merged 2026-08-03).
|
|
4
|
+
- **Date**: 2026-08-03
|
|
5
|
+
- **Credits spent**: 1 video credit (live Omni Flash I2V generation on profile `ffroliva`).
|
|
6
|
+
|
|
7
|
+
## Pre-tag gates
|
|
8
|
+
|
|
9
|
+
- `/gflow:check`: hygiene + doc-links + PII + mirror-drift ✅, ruff check/format ✅, pyright 0 errors ✅, full suite 2902 passed / 5 skipped ✅.
|
|
10
|
+
- `/gflow:doc-review`: mechanical pass ✅.
|
|
11
|
+
- SonarCloud / GitHub Actions: 13/13 CI workflow checks passed on PR #424.
|
|
12
|
+
|
|
13
|
+
## Evidence ledger (what is actually proven, and by what)
|
|
14
|
+
|
|
15
|
+
| Layer | Evidence | Status |
|
|
16
|
+
|---|---|---|
|
|
17
|
+
| **0-Credit Wire Intercept** | `capture_i2v_intercept_submit.py --model omni-flash --start-only`: intercepted submit XHR pre-network, captured `https://aisandbox-pa.googleapis.com/v1/video:batchAsyncGenerateVideoStartImage` with `startImage: "5ea393ee"`, `endImage: null`, `refs: 0` | ✅ 0-credit wire |
|
|
18
|
+
| **Live E2E Costed Run** | `gflow video i2v --initial-frame tmp/test.jpg "cinematic slow motion pan" --model omni-flash --profile ffroliva --out-dir tmp/out_live`: submitted successfully, status `MEDIA_GENERATION_STATUS_SUCCESSFUL`, saved `tmp/out_live/bc742f56-536b-4cc7-a456-1b6b7f9fd7f2.mp4` (1,219,129 bytes) | ✅ live costed |
|
|
19
|
+
| **Playwright Pin Safeguard** | `pyproject.toml` constrained to `playwright>=1.59.0,<1.60.0`; tested in `tests/test_playwright_pin.py::test_playwright_pinned_range_upper_bounded` | ✅ offline |
|
|
20
|
+
| **Submission Stage Watchdog** | `_run_stage` watchdog aborts pre-submit on Playwright CDP stall, emits `stage_stalled`, captures screenshot, names installed Playwright version; tested in `tests/api/transports/test_ui_automation_video.py` | ✅ offline |
|
|
21
|
+
| **Count Tab Fail-Closed** | `_set_output_count` raises `UiSelectorDriftError` on probe miss, matches digit affixes (`xN`/`Nx`); tested in `tests/api/transports/test_ui_automation_video.py` | ✅ offline |
|
|
22
|
+
| **Release tree healthy** | Full suite 2902 passed / 5 skipped; green full-suite CI on merged PR #424 | ✅ |
|
|
@@ -489,15 +489,27 @@ All prompts in a batch share one Flow project. The editor is opened once and sta
|
|
|
489
489
|
> current UI default), `--duration [4|6|8|10]` (10 requires `--model omni-flash`),
|
|
490
490
|
> `--count INTEGER` (1–4; >1 multiplies credit cost), `--aspect [9:16|16:9]`,
|
|
491
491
|
> `--profile NAME`, `--out-dir DIR` (default `tmp/`).
|
|
492
|
+
> `--count` is enforced **fail-closed**: if Flow's count control cannot be
|
|
493
|
+
> located (selector drift), the run refuses with exit 23 *before* submitting
|
|
494
|
+
> instead of proceeding on Flow's sticky default (typically x2) and silently
|
|
495
|
+
> changing what the run bills.
|
|
492
496
|
> `t2v` and `i2v` (not `r2v`) additionally take `-o, --output PATH` (explicit file destination).
|
|
493
497
|
> The mp4 lands at `<output_file>` or `<out-dir>/<media_id>.mp4`.
|
|
494
498
|
>
|
|
495
|
-
> **`i2v`
|
|
496
|
-
>
|
|
497
|
-
>
|
|
498
|
-
>
|
|
499
|
-
>
|
|
500
|
-
>
|
|
499
|
+
> **`i2v` model rules (issue #125, re-verified 2026-08-03):** every model —
|
|
500
|
+
> `omni-flash` included — supports **start-frame** i2v; the **default is
|
|
501
|
+
> `veo-lite`** (not Flow's UI default). `--model omni-flash` unlocks
|
|
502
|
+
> `--duration 10` for i2v. The **end frame is narrower**: `--end-frame`
|
|
503
|
+
> (first+last interpolation) requires a Veo 3.1 model — Flow's official
|
|
504
|
+
> support matrix lists first+last as "coming soon" for Omni Flash, and gflow
|
|
505
|
+
> rejects that combination up front (exit 17).
|
|
506
|
+
> History: omni-flash was excluded from i2v entirely after a 2026-05-30 wire
|
|
507
|
+
> capture showed Flow silently dropping the frames and billing the run as
|
|
508
|
+
> text-to-video. A 2026-08-03 route-aborted re-capture
|
|
509
|
+
> (`scripts/dev/capture_i2v_intercept_submit.py --model omni-flash
|
|
510
|
+
> --start-only`) proved Flow now routes omni + start frame to
|
|
511
|
+
> `batchAsyncGenerateVideoStartImage` with the frame bound, and a live x1
|
|
512
|
+
> 10s generation confirmed the output interpolates from the start frame.
|
|
501
513
|
|
|
502
514
|
## `gflow video t2v`
|
|
503
515
|
|
|
@@ -685,12 +697,13 @@ Options:
|
|
|
685
697
|
--json Emit a machine-readable JSON result.
|
|
686
698
|
```
|
|
687
699
|
|
|
688
|
-
> **`omni-flash` is rejected
|
|
689
|
-
>
|
|
690
|
-
>
|
|
691
|
-
>
|
|
692
|
-
> than reporting a fake success) if a generation
|
|
693
|
-
> text-only endpoint — see
|
|
700
|
+
> **`omni-flash` is rejected for chains.** Its single-clip start-frame i2v is
|
|
701
|
+
> wire-verified (2026-08-03, issue #125), but a chain renders N seeded links
|
|
702
|
+
> back-to-back and that has not been verified at chain scale — so `chain` stays
|
|
703
|
+
> on the Veo 3.1 family pending a chain-scale verification. The chain also
|
|
704
|
+
> aborts a link loudly (rather than reporting a fake success) if a generation
|
|
705
|
+
> is observed routing to the text-only endpoint — see
|
|
706
|
+
> [KNOWN_ISSUES](../KNOWN_ISSUES.md).
|
|
694
707
|
|
|
695
708
|
### JSONL manifest format
|
|
696
709
|
|
|
@@ -1305,7 +1318,7 @@ shell scripts can branch on the failure mode without parsing stderr.
|
|
|
1305
1318
|
| `6` | `NetworkError` | Network failure persisted across 3 attempts | Check connectivity |
|
|
1306
1319
|
| `7` | `WireFormatError` | Unexpected response shape — Flow API changed | File a bug (do NOT include captured tokens or signed URLs) |
|
|
1307
1320
|
| `8` | `AuthMissingError` | Required auth credential is absent from profile | `gflow auth login --profile <name>` |
|
|
1308
|
-
| `9` | `TransportTimeoutError` | Browser/API operation exceeded its timeout (incl. an i2v frame UUID not found in the media picker, #287) | Retry; raise the relevant timeout —
|
|
1321
|
+
| `9` | `TransportTimeoutError` | Browser/API operation exceeded its timeout (incl. an i2v frame UUID not found in the media picker, #287; or a wedged submission stage — the error names the stage and your Playwright version) | Retry; raise the relevant timeout — for a frame-UUID miss verify the UUID belongs to the `--project` passed; for a `stage_stalled` abort check your Playwright is in range (see [KNOWN_ISSUES](../KNOWN_ISSUES.md)) |
|
|
1309
1322
|
| `10` | `WafRejectionError` | Flow security layer rejected the request | Change prompt/request and retry |
|
|
1310
1323
|
| `11` | `ConfigurationError` | Local configuration or browser mode is invalid — includes `ProfileLockedError` (same-profile lease contention: another `gflow`/daemon/MCP call already owns this profile) | Fix the option/env var shown in the error, or wait / use a different `--profile` for lease contention |
|
|
1311
1324
|
| `12` | `AuthLoginTimeoutError` | Browser sign-in was not completed in time | Re-run login or raise `GFLOW_CLI_AUTH_LOGIN_TIMEOUT` |
|
|
@@ -1313,7 +1326,7 @@ shell scripts can branch on the failure mode without parsing stderr.
|
|
|
1313
1326
|
| `14` | `AuthBrowserRejectedError` | Google rejected the login browser | `gflow auth login --browser chrome` |
|
|
1314
1327
|
| `15` | `BrowserSessionClosedError` | The automation browser window was closed mid-operation | Re-run; keep the browser window open until the command finishes |
|
|
1315
1328
|
| `16` | `DataStoreError` | Local database cannot be opened, a migration failed, or the DB schema is newer than the installed gflow-cli | See below |
|
|
1316
|
-
| `17` | `ModelModeIncompatibilityError` | The chosen video model can't do the requested mode (e.g. `--model omni-flash` with
|
|
1329
|
+
| `17` | `ModelModeIncompatibilityError` | The chosen video model can't do the requested mode (e.g. `--model omni-flash` with `--end-frame`, or `omni-flash` for `chain` — issue #125) | omni-flash does start-frame `i2v` only: drop `--end-frame`, or use a Veo 3.1 model (`veo-lite` / `veo-fast` / `veo-quality` / `veo-lite-lp`) for first+last and for `chain` |
|
|
1317
1330
|
| `18` | `VideoModelSelectionError` | gflow could not select the requested video model in Flow's editor for an `i2v` run (model-picker option not found) | Usually transient — retry; if it persists, Flow's model-picker UI changed (report referencing #125) |
|
|
1318
1331
|
| `19` | `SceneConcatError` | Server-side scene render/concat failed (`gflow scene --output`) | Retry; the recorded compose survives, so re-render is safe |
|
|
1319
1332
|
| `20` | `FrameExtractionError` | Could not extract the last frame for a video chain link | Check the source video downloaded intact; retry the link |
|
|
@@ -126,7 +126,7 @@ macOS, v0.22.0: `image t2i` launches a logged-out browser → 401 on `createProj
|
|
|
126
126
|
|
|
127
127
|
Confirmed facts about the target runtime (`C:\development\github\hermes-ops`, deployed):
|
|
128
128
|
|
|
129
|
-
- **VPS:**
|
|
129
|
+
- **VPS:** the Compiled Growth ops host, headless Hetzner Linux (address and SSH user are in the private hermes-ops repo, not here — this repo is public). hermes-agent v0.16.0 as a systemd unit (`HERMES_HOME=/opt/hermes`); repo at `/opt/hermes-ops` (git-pull deploy: `git fetch && git reset --hard origin/main`).
|
|
130
130
|
- **GitHub creds:** `GH_TOKEN` already provisioned in SOPS (`secrets/vps-prod.env.sops.yaml`), fine-grained PAT scoped to **gflow-cli `pull_requests:write + contents:write`**. Decrypted by `hermes.service` `ExecStartPre` to `/opt/hermes/.env` (600, owner `hermes`); `gh` reads it automatically.
|
|
131
131
|
- **Knowledge (T1):** git-versioned markdown in `hermes-ops/knowledge/`; update = branch → human review → merge → VPS pulls.
|
|
132
132
|
- **Triggers:** `hermes cron create "<expr>" "<prompt>" --skills … --deliver telegram` (v1); `hermes webhook subscribe --events … --skills … --deliver …` (v2, deferred).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "gflow-cli"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.49.0"
|
|
4
4
|
description = "Unofficial CLI for Google Flow — drive Veo image-to-video generations from the terminal."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = { file = "LICENSE" }
|
|
@@ -21,7 +21,21 @@ classifiers = [
|
|
|
21
21
|
dependencies = [
|
|
22
22
|
"click>=8.1.0",
|
|
23
23
|
"httpx>=0.27.0",
|
|
24
|
-
|
|
24
|
+
# Upper bound is mandatory, not cosmetic. playwright is not an ordinary
|
|
25
|
+
# library here: it ships the browser driver, and 100% of gflow's product
|
|
26
|
+
# surface is automation through it, so an untested playwright minor is an
|
|
27
|
+
# untested product. Observed 2026-08-03: an install that resolved 1.62.0
|
|
28
|
+
# (uv.lock pins 1.59.0, and `uv tool install <path>` ignores the lockfile)
|
|
29
|
+
# made every `video i2v` run hang SILENTLY right after the frame upload —
|
|
30
|
+
# browser alive, no error, no timeout; downgrading to 1.59.0 fixed it
|
|
31
|
+
# instantly. The floor is the version actually exercised by CI and the
|
|
32
|
+
# lockfile: >=1.45.0 was aspirational, nothing has ever been tested there.
|
|
33
|
+
# The range keeps 1.59.x patch headroom (so a CVE fix does not require a
|
|
34
|
+
# gflow release) while excluding untested minors; the patchright extra
|
|
35
|
+
# below pins exactly for the same reason. Raise this deliberately, after
|
|
36
|
+
# live-verifying a generation on the new minor — offline tests cannot see
|
|
37
|
+
# a driver-behaviour regression (`resolve-drift` in CI only smoke-imports).
|
|
38
|
+
"playwright>=1.59.0,<1.60.0",
|
|
25
39
|
"rich>=13.7.0",
|
|
26
40
|
"pydantic-settings>=2.5.0",
|
|
27
41
|
"platformdirs>=4.0.0",
|
|
@@ -21,8 +21,13 @@ RUN curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | d
|
|
|
21
21
|
# Install Claude Code CLI globally
|
|
22
22
|
RUN npm install -g @anthropic-ai/claude-code
|
|
23
23
|
|
|
24
|
-
# Create non-root user and set permissions
|
|
25
|
-
|
|
24
|
+
# Create non-root user and set permissions.
|
|
25
|
+
#
|
|
26
|
+
# uid 1001, not 1000: node:20-slim already ships a `node` user at uid 1000, so
|
|
27
|
+
# `useradd -m -u 1000 nonroot` fails with exit 4 (UID already in use) and the
|
|
28
|
+
# image never builds. Found 2026-08-02 on the first real build attempt — which
|
|
29
|
+
# is itself the evidence that this sandbox had never been run.
|
|
30
|
+
RUN useradd -m -u 1001 nonroot
|
|
26
31
|
|
|
27
32
|
# Copy and setup the entrypoint script
|
|
28
33
|
COPY entrypoint.sh /usr/local/bin/entrypoint.sh
|
|
@@ -34,6 +34,40 @@ LOCK_FILE_PATH = "/tmp/pr_triage_autopilot.lock"
|
|
|
34
34
|
SUPPORTED_ENGINES = ("council-claude",)
|
|
35
35
|
DEFAULT_ENGINE = SUPPORTED_ENGINES[0]
|
|
36
36
|
|
|
37
|
+
# Claude auth is the SUBSCRIPTION token minted by `claude setup-token`, read
|
|
38
|
+
# from CLAUDE_CODE_OAUTH_TOKEN. This deployment has no ANTHROPIC_API_KEY
|
|
39
|
+
# (operator decision, 2026-08-02).
|
|
40
|
+
#
|
|
41
|
+
# NOT ~/.claude/.credentials.json: `setup-token` does not write that file.
|
|
42
|
+
# Verified on the ops VPS 2026-08-02 -- after a successful mint it still held the
|
|
43
|
+
# expired 2026-07-16 interactive-login token. Reading the file would silently
|
|
44
|
+
# authenticate with a dead credential.
|
|
45
|
+
#
|
|
46
|
+
# The token is a static 1-year bearer value with no refresh pair, so there is
|
|
47
|
+
# nothing to validate locally beyond presence: no expiry is encoded in it. That
|
|
48
|
+
# makes the rotation reminder (hermes-ops ev-ops-health digest) the only thing
|
|
49
|
+
# standing between a lapse and a silent outage -- the 2026-07-16 token 401'd for
|
|
50
|
+
# 16 days with nothing reporting it.
|
|
51
|
+
CLAUDE_TOKEN_ENV = "CLAUDE_CODE_OAUTH_TOKEN"
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def check_claude_auth() -> str | None:
|
|
55
|
+
"""Return an error string when Claude auth is unusable, else None.
|
|
56
|
+
|
|
57
|
+
Checked on the HOST before building the image and starting a container: a
|
|
58
|
+
missing token otherwise surfaces as an opaque 401 several minutes into a
|
|
59
|
+
sandboxed run.
|
|
60
|
+
"""
|
|
61
|
+
if not os.environ.get(CLAUDE_TOKEN_ENV):
|
|
62
|
+
return (
|
|
63
|
+
f"{CLAUDE_TOKEN_ENV} is not set. Mint one with "
|
|
64
|
+
"`sudo -u hermes -H claude setup-token` (valid 1 year) and store it in "
|
|
65
|
+
"hermes-ops secrets/vps-prod.env.sops.yaml. The cron line sources "
|
|
66
|
+
"/opt/hermes/.env, which is where it must appear."
|
|
67
|
+
)
|
|
68
|
+
return None
|
|
69
|
+
|
|
70
|
+
|
|
37
71
|
# Verdict allowlist: container stdout is untrusted, so anything outside this
|
|
38
72
|
# set is treated as unparseable (None) rather than interpolated downstream.
|
|
39
73
|
VALID_VERDICTS = ("GREEN", "YELLOW", "RED")
|
|
@@ -219,9 +253,7 @@ def restore_repo_branch(repo_dir: Path) -> None:
|
|
|
219
253
|
subprocess.run(["git", "checkout", "develop"], cwd=repo_dir, capture_output=True, check=True)
|
|
220
254
|
|
|
221
255
|
|
|
222
|
-
def run_docker_sandbox(
|
|
223
|
-
pr_num: int, repo_dir: Path, memory_dir: Path, anthropic_key: str, gh_token: str
|
|
224
|
-
) -> str:
|
|
256
|
+
def run_docker_sandbox(pr_num: int, repo_dir: Path, memory_dir: Path, gh_token: str) -> str:
|
|
225
257
|
"""Invoke the run_sandboxed_review.sh wrapper script and capture its stdout."""
|
|
226
258
|
script_path = repo_dir / "scripts" / "autopilot" / "run_sandboxed_review.sh"
|
|
227
259
|
|
|
@@ -236,8 +268,6 @@ def run_docker_sandbox(
|
|
|
236
268
|
str(memory_dir),
|
|
237
269
|
"--token",
|
|
238
270
|
gh_token,
|
|
239
|
-
"--key",
|
|
240
|
-
anthropic_key,
|
|
241
271
|
]
|
|
242
272
|
|
|
243
273
|
logger.info("Running sandboxed Docker review", pr=pr_num)
|
|
@@ -282,12 +312,11 @@ def run_review(
|
|
|
282
312
|
pr_num: int,
|
|
283
313
|
repo_dir: Path,
|
|
284
314
|
memory_dir: Path,
|
|
285
|
-
anthropic_key: str,
|
|
286
315
|
gh_token: str,
|
|
287
316
|
) -> str:
|
|
288
317
|
"""Run the configured review engine and return its stdout."""
|
|
289
318
|
if engine == "council-claude":
|
|
290
|
-
return run_docker_sandbox(pr_num, repo_dir, memory_dir,
|
|
319
|
+
return run_docker_sandbox(pr_num, repo_dir, memory_dir, gh_token)
|
|
291
320
|
raise NotImplementedError(f"engine {engine!r} is reserved but not implemented")
|
|
292
321
|
|
|
293
322
|
|
|
@@ -296,7 +325,6 @@ def run_triage_cycle(
|
|
|
296
325
|
repo_dir: Path,
|
|
297
326
|
memory_dir: Path,
|
|
298
327
|
ledger_path: Path,
|
|
299
|
-
anthropic_key: str,
|
|
300
328
|
gh_token: str,
|
|
301
329
|
engine: str = DEFAULT_ENGINE,
|
|
302
330
|
) -> None:
|
|
@@ -439,7 +467,7 @@ def run_triage_cycle(
|
|
|
439
467
|
continue
|
|
440
468
|
|
|
441
469
|
# Run Stage 1 Pre-eval & Full sandboxed review
|
|
442
|
-
output = run_review(engine, pr_num, repo_dir, memory_dir,
|
|
470
|
+
output = run_review(engine, pr_num, repo_dir, memory_dir, gh_token)
|
|
443
471
|
|
|
444
472
|
# Parse verdict & MUST-FIX count
|
|
445
473
|
parsed_verdict, must_fixes = parse_summary_verdict(output)
|
|
@@ -539,11 +567,14 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
539
567
|
args = ap.parse_args(argv)
|
|
540
568
|
|
|
541
569
|
# Validate required credentials
|
|
542
|
-
anthropic_key = os.environ.get("ANTHROPIC_API_KEY")
|
|
543
570
|
gh_token = os.environ.get("GH_COMMENT_TOKEN") or os.environ.get("GITHUB_TOKEN")
|
|
571
|
+
if not gh_token:
|
|
572
|
+
logger.error("Missing credentials. Requires GH_COMMENT_TOKEN.")
|
|
573
|
+
return 1
|
|
544
574
|
|
|
545
|
-
|
|
546
|
-
|
|
575
|
+
auth_error = check_claude_auth()
|
|
576
|
+
if auth_error:
|
|
577
|
+
logger.error("Claude authentication unusable", reason=auth_error)
|
|
547
578
|
return 1
|
|
548
579
|
|
|
549
580
|
engine = resolve_engine()
|
|
@@ -561,9 +592,7 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
561
592
|
return 0
|
|
562
593
|
|
|
563
594
|
logger.info("PR-Triage Autopilot iteration started", repo=args.repo, engine=engine)
|
|
564
|
-
run_triage_cycle(
|
|
565
|
-
args.repo, repo_dir, memory_dir, ledger_path, anthropic_key, gh_token, engine=engine
|
|
566
|
-
)
|
|
595
|
+
run_triage_cycle(args.repo, repo_dir, memory_dir, ledger_path, gh_token, engine=engine)
|
|
567
596
|
logger.info("PR-Triage Autopilot iteration completed")
|
|
568
597
|
return 0
|
|
569
598
|
|