gflow-cli 0.69.0__tar.gz → 0.70.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.70.0/.claude/commands/gflow/spike.md +10 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.codex-plugin/plugin.json +1 -1
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.gitignore +9 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/AGENTS.md +116 -6
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/CHANGELOG.md +164 -1
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/CONTRIBUTING.md +38 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/KNOWN_ISSUES.md +17 -4
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/PKG-INFO +1 -1
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/CONFIGURATION.md +2 -2
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/INDEX.md +2 -2
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.69.0.md +61 -26
- gflow_cli-0.70.0/docs/LIVE_VERIFICATION_v0.70.0.md +143 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/MCP.md +14 -2
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/PROJECT_STATUS.md +42 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/USAGE.md +22 -4
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/migrated-host-driver-wire-lessons.md +42 -1
- gflow_cli-0.70.0/docs/superpowers/plans/2026-09-06-spike-tooling-reorg/PLAN.md +246 -0
- gflow_cli-0.70.0/docs/superpowers/spikes/2026-09-05-migrated-r2v-attach-surface.md +464 -0
- gflow_cli-0.70.0/docs/superpowers/spikes/2026-09-06-labs-vs-migrated-session-credential.md +305 -0
- gflow_cli-0.70.0/docs/superpowers/spikes/2026-09-06-migrated-character-surface-and-recaptcha.md +98 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/pyproject.toml +1 -1
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/autopilot/pr_triage_autopilot.py +48 -16
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/autopilot/run_sandboxed_review.sh +17 -1
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/ci/check_release_artifacts.py +64 -0
- gflow_cli-0.70.0/scripts/dev/capture_migrated_attach_rpcs.py +235 -0
- gflow_cli-0.70.0/scripts/dev/capture_migrated_mention_gestures.py +168 -0
- gflow_cli-0.70.0/scripts/dev/capture_migrated_r2v_production_submit.py +293 -0
- gflow_cli-0.70.0/scripts/dev/capture_migrated_r2v_submit_payload.py +293 -0
- gflow_cli-0.70.0/scripts/dev/capture_migrated_r2v_surface.py +251 -0
- gflow_cli-0.70.0/scripts/dev/capture_migrated_upload_flow.py +293 -0
- gflow_cli-0.70.0/scripts/dev/har-spike/README.md +126 -0
- gflow_cli-0.70.0/scripts/dev/har-spike/capture-agent-ui.ps1 +165 -0
- gflow_cli-0.70.0/scripts/dev/har-spike/capture-media-scrape.ps1 +215 -0
- gflow_cli-0.70.0/scripts/dev/har-spike/extract_har_summary.py +169 -0
- gflow_cli-0.70.0/scripts/dev/har-spike/launch-flow-chrome.ps1 +104 -0
- gflow_cli-0.70.0/scripts/dev/har-spike/probe-agent-mode.ps1 +103 -0
- gflow_cli-0.70.0/scripts/dev/har-spike/probe_agent_mode.py +120 -0
- gflow_cli-0.70.0/scripts/dev/har-spike/run-cdp-smoke.ps1 +147 -0
- gflow_cli-0.70.0/scripts/dev/har-spike/start-background-capture.ps1 +218 -0
- gflow_cli-0.70.0/scripts/dev/har-spike/start-har-capture.ps1 +153 -0
- gflow_cli-0.70.0/scripts/dev/har-spike/stop-background-capture.ps1 +116 -0
- gflow_cli-0.70.0/scripts/dev/har-spike/stop-har-capture.ps1 +181 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/incident_bundle_quality.py +10 -1
- gflow_cli-0.70.0/scripts/dev/spike_cdp_har_without_node.py +230 -0
- gflow_cli-0.70.0/scripts/dev/spike_migrated_body_reference_chip.py +148 -0
- gflow_cli-0.70.0/scripts/dev/spike_migrated_character_body_controls.py +150 -0
- gflow_cli-0.70.0/scripts/dev/spike_migrated_character_editor_anchor.py +183 -0
- gflow_cli-0.70.0/scripts/dev/spike_migrated_character_ogiz0b_schema.py +158 -0
- gflow_cli-0.70.0/scripts/dev/spike_migrated_character_submit_wire.py +167 -0
- gflow_cli-0.70.0/scripts/dev/spike_migrated_character_surface.py +193 -0
- gflow_cli-0.70.0/scripts/dev/spike_migrated_image_capability.py +192 -0
- gflow_cli-0.70.0/scripts/dev/spike_migrated_recaptcha_mint.py +145 -0
- gflow_cli-0.70.0/scripts/dev/spike_migrated_vs_labs_provenance.py +195 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_video_tab_dom.py +1 -1
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/skills/gflow-cli/SKILL.md +1 -1
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/skills/issue-assessment/SKILL.md +24 -0
- gflow_cli-0.70.0/skills/spike/SKILL.md +114 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/skills/video-production/SKILL.md +22 -2
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/skills/video-production/consistency.md +13 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/__init__.py +1 -1
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/api/client.py +247 -17
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/api/transports/migrated_composer.py +285 -19
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/api/transports/ui_automation.py +273 -75
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/auth/real_chrome.py +17 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/cli_image.py +2 -2
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/cli_video.py +3 -3
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/data/recorder.py +15 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/mcp/tools.py +193 -6
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/services/character_create.py +55 -0
- gflow_cli-0.70.0/tests/api/test_character_readback_fallback.py +254 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_client_image.py +40 -0
- gflow_cli-0.70.0/tests/api/test_client_migrated_mint.py +303 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/transports/drivers/test_ui_mode.py +56 -0
- gflow_cli-0.70.0/tests/api/transports/test_character_model_picker.py +221 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/transports/test_migrated_composer.py +147 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/transports/test_migrated_dispatch.py +6 -1
- gflow_cli-0.70.0/tests/api/transports/test_migrated_r2v.py +300 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/transports/test_ui_character_editor.py +52 -120
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/auth/strategies/test_strategies.py +73 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/autopilot/test_pr_triage_autopilot.py +86 -2
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/cli/test_cli_video.py +35 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/data/test_find_incomplete_character.py +26 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/conftest.py +37 -1
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/test_character_create_e2e.py +82 -0
- gflow_cli-0.70.0/tests/e2e/test_character_mcp_parity_e2e.py +105 -0
- gflow_cli-0.70.0/tests/e2e/test_credits_mcp_e2e.py +104 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/test_migrated_host_e2e.py +110 -1
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/test_sidebar_recovery_e2e.py +3 -0
- gflow_cli-0.70.0/tests/mcp/test_character_tools.py +158 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/mcp/test_cli_parity.py +125 -5
- gflow_cli-0.70.0/tests/mcp/test_reference_entity_round_trip.py +120 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/mcp/test_tools_helpers.py +16 -2
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/mcp/test_tools_wired.py +33 -3
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/scripts/test_check_release_artifacts.py +76 -0
- gflow_cli-0.70.0/tests/scripts/test_extract_har_summary.py +166 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/scripts/test_incident_bundle_quality.py +57 -1
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/services/test_character_create_saga.py +93 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/uv.lock +1 -1
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/website/docs/CONFIGURATION.md +2 -2
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/website/docs/KNOWN_ISSUES.md +17 -4
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/website/docs/MCP.md +14 -2
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/website/docs/USAGE.md +22 -4
- gflow_cli-0.69.0/tests/api/test_client_migrated_mint.py +0 -62
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.agents/plugins/marketplace.json +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.claude/README.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.claude/commands/gflow/active.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.claude/commands/gflow/branch-review.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.claude/commands/gflow/changelog.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.claude/commands/gflow/check.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.claude/commands/gflow/doc-review.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.claude/commands/gflow/issue-assessment.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.claude/commands/gflow/issue-resolve.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.claude/commands/gflow/known-issues.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.claude/commands/gflow/live-verify.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.claude/commands/gflow/llm-council.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.claude/commands/gflow/next.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.claude/commands/gflow/plan.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.claude/commands/gflow/pr-council-review.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.claude/commands/gflow/predict.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.claude/commands/gflow/release.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.claude/commands/gflow/scenario.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.claude/commands/gflow/sonar.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.claude/commands/gflow/status.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.env.template +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.gitattributes +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.github/CODEOWNERS +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.github/FUNDING.yml +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.github/copilot-instructions.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.github/dependabot.yml +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.github/workflows/ci.yml +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.github/workflows/deps-watch.yml +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.github/workflows/external-pr-triage.yml +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.github/workflows/governance-advisory.yml +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.github/workflows/governance-benchmark.yml +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.github/workflows/labels.yml +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.github/workflows/main-base-guard.yml +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.github/workflows/pages.yml +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.github/workflows/release.yml +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.github/workflows/scorecard.yml +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.github/workflows/selector-probe.yml +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.github/workflows/star-history-watch.yml +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.gitleaks.toml +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.pre-commit-config.yaml +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/.secrets.baseline +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/CLAUDE.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/CONFIGURATION.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/DISCLAIMER.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/LICENSE +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/PLAN.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/README.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/RELEASE.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/ROADMAP.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/conftest.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/deploy/PR-TRIAGE-AUTOPILOT-OPS.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/deploy/logrotate-pr-triage +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docker-compose.yml +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/ACCOUNT_SAFETY.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/AGENT_GUIDE.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/AGENT_UI_E2E.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/AGENT_UI_RECON.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/ASSET_TAGGING_RECON.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/CHARACTER.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/CHARACTER_RECON.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/DATA_LAYER.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/DEMOS.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/E2E_TESTING.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/GITHUB.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/INSTRUCTIONS.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_playwright_1.61.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_reference_entity_guard.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.21.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.22.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.23.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.24.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.25.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.26.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.27.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.27.1.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.28.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.29.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.30.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.31.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.32.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.32.1.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.33.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.34.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.35.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.36.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.37.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.38.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.38.1.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.39.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.40.0-production-readiness.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.40.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.41.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.42.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.43.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.44.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.45.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.46.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.46.1.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.47.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.48.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.49.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.50.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.51.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.52.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.54.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.55.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.56.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.57.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.57.1.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.58.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.59.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.60.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.61.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.62.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.62.1.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.63.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.64.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.65.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.66.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.66.1.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.66.2.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.66.3.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.67.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.68.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/MEDIA_LIBRARY.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/MOVIE.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/PROMPT_EXPANSION.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/REFERENCE_STRATEGIES.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/SECURITY.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/TOOLS.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/USER_GUIDE.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/assets/demo-split-pf.gif +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/assets/example-run.gif +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/assets/examples.webp +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/medium_tutorial.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/schemas/movie-handoff.schema.json +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/sonar-cleanup-tracker.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/README.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/agents-md-vs-llms-txt.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/background-e2e-pytest-pattern.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/bdd-stubs-mirror-runtime-signatures.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/credit-free-route-abort-verification.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/data-layer-overview.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/data-layer-test-pollution-trap.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/doc-examples-are-untested-fixtures.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/draft-pr-merge-trap.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/e2e-evidence-is-a-contributor-deliverable.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/exit-code-16-data-store.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/flow-capabilities-are-cohort-dependent.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/flow-credits-videos-only.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/flow-locale-leak-icon-ligatures.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/flow-recon-must-run-on-denon82-ffroliva-migrated.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/force-color-breaks-cli-tests.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/full-test-suite-ooms.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/git-add-all-sweeps-scratch-files.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/image-video-mode-switch-symmetry.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/mcp-is-first-class-across-skill-chain.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/memory-is-working-dir-keyed.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/on-started-callback-recorder-safety.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/playwright-click-no-downstream-event-signature.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/pr-council-review-stale-tree-reads.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/pr-hygiene-revert-and-multi-commit.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/pr-must-verify-on-affected-surface.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/prose-conflicts-hide-in-disjoint-files.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/pypi-readme-staleness-fix.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/pypi-rejected-filename-reusable.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/readme-hybrid-router-pattern.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/real-browser-auth-mandatory.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/release-back-merge-gap-recovery.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/release-signing.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/release-spec-plan-memory-consolidation.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/rest-transports-drop-ui-fields.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/ruff-format-scope-is-src-tests.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/sonarcloud-hotspot-review-workflow.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/sonarcloud-new-code-gotchas.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/sonarcloud-pr-issues-scope-s7497.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/sonarcloud-setup.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/stale-test-discovery.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/structlog-cache-logger-off-for-tests.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/ui-selector-drift-error-exit-23.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/verification-ledger-5-layer.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/video-model-capability-matrix.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/wheel-build-sanity-gate.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/windows-dev-quirks.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/memory/windows-running-launcher-blocks-uv-upgrade.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-07-08-pr-triage-autopilot/PLAN.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-07-09-camoufox-adoption/PLAN.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-07-14-storyboarding-and-visual-curation/PLAN.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-07-18-asset-tagging/PLAN.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-07-19-live-verify/PLAN.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-07-19-production-readiness-browser-lifecycle.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-07-19-production-readiness-driver-cdp-verification.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-07-19-production-readiness-public-truth.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-07-19-production-readiness-queue-safety.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-07-26-character-prompt-polishing/PLAN.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-07-26-project-name-management/PLAN.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-07-26-self-documenting-errors/PLAN.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-07-27-overlay-banner-dismissal/PLAN.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/PLAN.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/SCENARIO.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-04-mcp-tasks/PLAN.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-04-output-hardening/PLAN.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-05-issue-317-intra-batch-references/PLAN.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-05-issue-317-intra-batch-references/SCENARIO.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-05-issue-402-entity-provenance/PLAN.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-05-issue-402-entity-provenance/SCENARIO.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-05-issue-451-duration-tab-drift/PLAN.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-05-issue-451-duration-tab-drift/SCENARIO.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-06-driver-delay-jittering/PLAN.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-06-driver-delay-jittering/SCENARIO.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-06-overlay-changelog-watermark/PLAN.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-06-overlay-changelog-watermark/SCENARIO.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-06-ui-mode-policy/PLAN.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-06-ui-mode-policy/SCENARIO.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-14-video-ui-mode-policy/PLAN.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-14-video-ui-mode-policy/SCENARIO.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-21-selector-registry.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-25-workflow-hardening-gaps.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-09-01-video-extend/PLAN.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/research/2026-06-27-tool-abstraction-evaluation.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/specs/2026-06-29-issue-assessment-workflow-design.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/specs/2026-07-04-pr-triage-autopilot-design.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/specs/2026-07-18-asset-tagging-design.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/specs/2026-07-19-live-verify-design.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/specs/2026-07-19-production-readiness-hardening-design.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/specs/2026-08-21-selector-registry-design.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/specs/2026-08-26-model-attribution-provenance.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/specs/2026-08-26-model-cost-quota-catalog.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/specs/2026-08-27-changelog-modal-precondition-design.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/spikes/2026-07-09-camoufox-waf-403.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/spikes/2026-07-12-ui-cohort-backend-config.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/spikes/2026-07-17-production-readiness-assessment.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/spikes/2026-08-01-mcp-2026-07-28-spec-impact.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/spikes/2026-08-14-video-model-capability-matrix.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/spikes/2026-08-15-picker-tile-alt-text.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/spikes/2026-08-31-veo-extend-route-recon.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/spikes/2026-09-04-migrated-host-handoff-mechanism.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/spikes/2026-09-05-migrated-frames-attach.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/spikes/2026-09-05-migrated-host-wire-protocol.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/docs/superpowers/spikes/2026-09-05-migrated-model-menu-lower-priority.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/eval/pr_triage_eval.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/eval/pr_triage_fixtures.json +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/examples/README.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/examples/batch_from_config.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/examples/multi_prompt_t2i.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/examples/sample_config.json +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/examples/sample_prompts.txt +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/examples/single_image_t2i.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/examples/workflow_chain.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/index.html +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/llms.txt +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/samples/README.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/samples/captured/01_upload_image.json +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/samples/captured/04_archive_workflow.json +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/samples/captured/05_createProject.json +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/samples/captured/06_batchGenerateImages.json +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/samples/captured/12_create_scene.json +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/samples/captured/14_get_scene_workflows.json +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/autopilot/Dockerfile.triage +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/autopilot/entrypoint.sh +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/autopilot/package-lock.json +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/autopilot/package.json +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/autopilot/pr_triage_gate.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/canary/register_task.ps1 +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/canary/run_canary.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/ci/check_council_memory.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/ci/check_doc_links.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/ci/check_materiality.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/ci/check_repo_hygiene.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/ci/check_test_count.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/ci/check_website_docs_pii.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/ci/generate_website_docs.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/debug_editor.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/debug_gen_settings.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/debug_settings.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/_recording_client.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/_spike_common.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/active_plan.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/capture_frames_mode_trigger_ligature.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/capture_locale_invariants.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/capture_lower_priority_model_cost.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/capture_migrated_model_menu.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/capture_project_listing.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/capture_r2v_ingredient_lifecycle.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/capture_sidebar_state_dom.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/capture_video_model_capability_matrix.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/character_create_spike.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/character_create_spike_v2.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/dump_character_selectors.js +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/live_verify_mcp_tasks.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/live_verify_policy_400_v060.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/live_verify_video_model_select.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/make_project.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/materiality_backtest.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/measure_html_lang_settle.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/measure_locale_probe.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/measure_migrated_host_flip.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/patch_character.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/skillopt/README.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/skillopt/harness.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/skillopt/tasks.json +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/sonar-local-scan.sh +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/sonar-pre-push-gate.sh +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_changelog_capture.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_char_editor_dom.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_char_gen_capture.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_character_prompt_format.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_extend_model_recon.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_extend_ourstack_verify.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_extend_route_capture.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_extend_submit_capture.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_extend_ui_recon.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_incident_live.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_issue313_agent_mode_controls.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_issue314_picker_filename_search.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_issue404_count_tabs_recon.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_locale_poison.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_migrated_duration_by_model.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_migrated_editor_dom_inventory.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_migrated_frames_attach.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_migrated_host_trigger.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_migrated_submit_capture.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_migration_flag_bootstrap.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_mode_roundtrip.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_mode_switch_agentic_to_classic.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_model_inventory.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_movie_picker_select.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_movie_voice_list.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_omni_flash_i2v_ui_recon.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_patch_entity.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_patchright.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/spike_trpc_origin_referer_401.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/verify_lang_settle_fix.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/verify_language_agnostic.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/verify_locale_navigation_race.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/dev/verify_model_attribution.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/diag/README.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/diag/capture_flow_traffic.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/diag/diag_aisandbox_bearer.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/diag/memory_profile.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/diag/recaptcha_mint.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/diag/spike_387_openai_compat.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/e2e/capture_agent_toggle.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/probe/run_probe.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/probe/spike_auth_matrix.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/record_demo.ps1 +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/smoke_image.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/smoke_video_editor.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/smoke_worker_style.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/spike_waf_camoufox.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/scripts/verify_chrome_auth_viability.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/skills/README.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/skills/changelog/SKILL.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/skills/check/SKILL.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/skills/doc-review/SKILL.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/skills/issue-resolve/SKILL.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/skills/known-issues/SKILL.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/skills/live-verify/SKILL.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/skills/llm-council/SKILL.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/skills/plan/SKILL.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/skills/pr-council-review/SKILL.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/skills/predict/SKILL.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/skills/release/SKILL.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/skills/scenario/SKILL.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/skills/sonar/SKILL.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/skills/status/SKILL.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/skills/video-production/clip_qa.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/skills/video-production/composition.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/skills/video-production/failure-modes.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/skills/video-production/tasks.json +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/sonar-project.properties +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/__main__.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/_cli_helpers.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/api/__init__.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/api/_engine.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/api/_retry.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/api/character.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/api/credits.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/api/dto.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/api/extend_chain.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/api/image.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/api/image_upscale.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/api/recaptcha.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/api/routes.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/api/scene.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/api/transports/__init__.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/api/transports/_common.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/api/transports/base.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/api/transports/batchexecute.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/api/transports/drivers/agentic.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/api/transports/drivers/base.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/api/transports/drivers/classic.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/api/transports/drivers/factory.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/api/transports/mode_control.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/api/transports/ui_automation_video.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/api/video.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/api/video_extend.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/auth/__init__.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/auth/base.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/auth/cookies.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/auth/factory.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/auth/strategies.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/auth/verification.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/browser_manager.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/chain.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/chain_manifest.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/cli.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/cli_character.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/cli_credits.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/cli_data.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/cli_doctor.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/cli_instructions.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/cli_models.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/cli_movie.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/cli_project.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/cli_run.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/cli_scene.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/cli_tools.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/cli_update.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/composition.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/config.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/data/__init__.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/data/chain_repo.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/data/migrations/0007_queue.sql +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/data/migrations/0008_add_operation_expanded_prompt.sql +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/data/migrations/0009_queue_claims.sql +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/data/models.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/data/queries.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/data/redaction.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/data/repository.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/data/store.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/diagnostics.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/errors.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/exceptions.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/file_integrity.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/flow_selectors/__init__.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/flow_selectors/grading.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/flow_selectors/model.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/flow_selectors/registry.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/image_batch.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/json_output.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/mcp/__init__.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/mcp/prompts.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/mcp/resources.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/mcp/server.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/mcp/setup.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/mcp/tasks_extension.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/media.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/movie_manifest.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/observability.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/paths.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/profile_lease.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/profile_store.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/redaction.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/services/__init__.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/services/catalog_sync.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/services/credits.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/services/doctor.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/services/mentions.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/storage.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/tools/__init__.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/tools/banned.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/tools/builtin/__init__.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/tools/builtin/creative-director.toml +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/tools/builtin/reverse-engineer.toml +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/tools/builtin/storyboard.toml +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/tools/expander.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/tools/invocation.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/tools/loader.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/tools/registry.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/tools/runtime.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/tools/spec.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/ui/app.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/ui/server.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/update_check.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/winsec.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/worker/codec.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/worker/daemon.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/src/gflow_cli/worker/queue.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tasks/lessons.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/test_assets/sample_batch.json +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/test_assets/sample_batch.tsv +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/test_assets/sample_batch_invalid.tsv +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/__init__.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/__init__.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/fixtures/character_gen_response.json +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/fixtures/patch_entity_response.json +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/fixtures/project_initial_data_extend_models.json +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_aisandbox_auth_error.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_bearer_redaction.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_character.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_client.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_client_character.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_client_delete_characters.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_client_errors.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_client_extend.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_client_generate_character.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_client_incidents.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_client_launch_kwargs.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_client_locale_cache.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_client_patch_entity.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_client_scene.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_client_upscale.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_concurrency.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_credits.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_credits_http.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_dto.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_engine.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_extend_chain.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_image.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_image_dto.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_image_upscale.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_post_json_aisandbox_auth.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_recaptcha.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_retry.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_routes.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_routes_character.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_routes_locale.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_routes_scene.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_sapisidhash_helper.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_scene_models.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_video.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_video_extend.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_video_request.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/test_video_status_poll.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/transports/__init__.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/transports/conftest.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/transports/drivers/test_agentic.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/transports/drivers/test_classic.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/transports/drivers/test_factory.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/transports/test_agentic_cohort_detection.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/transports/test_base.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/transports/test_batchexecute.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/transports/test_bearer.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/transports/test_common.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/transports/test_factory.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/transports/test_fingerprint.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/transports/test_locale_navigation.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/transports/test_migrated_host_gate.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/transports/test_migrated_route.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/transports/test_mode_control.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/transports/test_model_selection_loud.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/transports/test_navigation_settled.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/transports/test_overlay_precondition.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/transports/test_policy_400.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/transports/test_sapisidhash.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/transports/test_selector_symmetry.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/transports/test_transport_timeout.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/transports/test_ui_automation.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/transports/test_ui_automation_batch.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/transports/test_ui_automation_video.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/api/transports/test_video_model_selection_loud.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/auth/strategies/test_factory.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/auth/test_cookies.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/auth/test_real_chrome.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/auth/test_verification.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/auth/test_windows_acl.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/cli/__init__.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/cli/test_auth_status.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/cli/test_cli_auth_list.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/cli/test_cli_character.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/cli/test_cli_character_create.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/cli/test_cli_credits.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/cli/test_cli_data.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/cli/test_cli_data_errors.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/cli/test_cli_data_errors_retention.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/cli/test_cli_data_sync.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/cli/test_cli_doctor.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/cli/test_cli_image.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/cli/test_cli_image_selector_drift.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/cli/test_cli_image_upscale.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/cli/test_cli_image_uuid_ref_enrichment.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/cli/test_cli_instructions.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/cli/test_cli_models.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/cli/test_cli_movie.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/cli/test_cli_run.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/cli/test_cli_scene.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/cli/test_cli_tools.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/cli/test_cli_video_chain.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/cli/test_cli_video_extend.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/cli/test_error_handling.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/cli/test_failure_funnel.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/cli/test_helpers.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/cli/test_incident_output.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/cli/test_movie_manifest.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/cli/test_movie_manifest_style_variants.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/cli/test_predictable_output.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/cli/test_run_with_handlers_interrupt.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/cli/test_settings_validation.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/composition/test_character.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/composition/test_compose_prompt.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/composition/test_handoff.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/composition/test_style_variants.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/composition/test_style_variants_e2e.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/conftest.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/data/__init__.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/data/test_chain_repo.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/data/test_failure_recording.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/data/test_models.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/data/test_null_columns_stay_null.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/data/test_packaging.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/data/test_recorder.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/data/test_recorder_character.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/data/test_redaction.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/data/test_repository.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/data/test_scene_persistence.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/data/test_settings_and_errors.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/data/test_store.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/data/test_store_migrations.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/dev/test_recording_client.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/__init__.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/test_agentic_count_enforcement_e2e.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/test_asset_tagging_e2e.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/test_cancellation_e2e.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/test_chain_e2e.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/test_classic_count_setter_e2e.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/test_crash_recovery_e2e.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/test_credits_e2e.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/test_daemon_e2e.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/test_data_layer_e2e.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/test_data_sync_names_e2e.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/test_entity_provenance_e2e.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/test_entity_smuggling_e2e.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/test_i2v_flags_e2e.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/test_image_batch_e2e.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/test_image_uuid_ref_e2e.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/test_incident_quality_e2e.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/test_json_output_e2e.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/test_live_agentic_instructions.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/test_migrated_i2v_e2e.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/test_project_naming_e2e.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/test_refresh_on_miss_e2e.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/test_scene_compose_live.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/test_tools_e2e.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/test_transports_e2e.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/test_video_r2v_uuid_name_e2e.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/__init__.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/asset_tagging.feature +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/auth.feature +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/auth_login.feature +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/character_create.feature +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/character_read.feature +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/conftest.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/credits.feature +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/duration_tab_drift.feature +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/entity_provenance.feature +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/image.feature +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/image_batch_references.feature +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/image_upscale.feature +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/incident_diagnostics.feature +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/instructions.feature +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/latched_locale_recovery.feature +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/locale_picker_include.feature +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/mcp_tasks.feature +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/media_picker_tiers.feature +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/migrated_driver.feature +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/migrated_host_gate.feature +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/migrated_i2v.feature +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/output_hardening.feature +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/test_asset_tagging_steps.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/test_auth_login_steps.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/test_auth_steps.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/test_character_create_steps.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/test_character_read_steps.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/test_credits_steps.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/test_image_steps.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/test_image_upscale_steps.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/test_incident_diagnostics_steps.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/test_instructions_steps.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/test_locale_picker_include_steps.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/test_mcp_tasks_steps.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/test_media_picker_tiers_steps.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/test_migrated_driver_steps.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/test_migrated_host_gate_steps.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/test_migrated_i2v_steps.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/test_output_hardening_steps.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/test_step_collision_guard.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/test_video_agent_ui_steps.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/test_video_chain_steps.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/video_agent_ui.feature +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/features/video_chain.feature +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/fixtures/__init__.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/fixtures/changelog_modal_page.html +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/fixtures/doctor_env.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/fixtures/flow_model_inventory.json +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/fixtures/flow_project_listing_media.json +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/fixtures/listing_payload.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/fixtures/seeded_catalog.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/flow_selectors/__init__.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/flow_selectors/test_grading.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/flow_selectors/test_model.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/flow_selectors/test_model_governance.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/flow_selectors/test_registry.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/flow_selectors/test_report.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/image_batch/__init__.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/image_batch/test_image_manifest.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/image_batch/test_jitter_config.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/image_batch/test_observability_events.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/integration/__init__.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/integration/conftest.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/integration/constants.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/integration/test_expander_gateway.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/integration/test_storage_gcs.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/integration/test_storage_s3.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/mcp/__init__.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/mcp/conftest.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/mcp/test_auth_status_tool.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/mcp/test_credits_tool.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/mcp/test_error_funnel.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/mcp/test_http_transport.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/mcp/test_known_issues_resource.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/mcp/test_migrated_i2v_parity.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/mcp/test_no_spend.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/mcp/test_rate_limit_envelope.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/mcp/test_resources.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/mcp/test_server.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/mcp/test_setup.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/mcp/test_stdio_transport.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/mcp/test_tasks_extension.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/mcp/test_tools_instructions.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/scripts/test_canary_classify.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/scripts/test_canary_reexec.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/scripts/test_capture_video_model_capability_matrix.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/scripts/test_check_council_memory.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/scripts/test_check_materiality.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/scripts/test_check_repo_hygiene.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/scripts/test_check_test_count.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/scripts/test_check_website_docs_pii.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/scripts/test_codex_plugin.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/scripts/test_generate_website_docs.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/scripts/test_materiality_backtest.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/scripts/test_skillopt_scoring.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/scripts/test_workflow_hardening.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/services/__init__.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/services/test_catalog_sync.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/services/test_character_create_redaction.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/services/test_credits.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/services/test_doctor.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/services/test_media_attribution.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/services/test_mentions_observability.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/services/test_mentions_parse.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/services/test_mentions_resolve.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/services/test_resolve_and_apply.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/smoke/__init__.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/smoke/test_profile_account_smoke.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/smoke/test_real_flow.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_auth.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_browser_manager.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_chain.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_chain_manifest.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_cli_data.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_cli_project.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_cli_update.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_config.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_conftest_isolation.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_data_queries.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_diagnostics_bundle.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_diagnostics_events.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_diagnostics_journal.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_diagnostics_recorder.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_diagnostics_retention.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_diagnostics_sanitize.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_documentation_gate.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_duration_tab_drift.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_entity_provenance.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_errors.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_errors_classification.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_image_batch_references.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_incident_generation_requests.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_json_output.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_marker_registry.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_media.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_observability.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_overlay_banner_dismissal.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_paths.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_playwright_pin.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_profile_lease.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_profile_lease_subprocess.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_profile_store.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_profile_store_locale.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_project_list_urls.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_self_documenting_errors.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_smoke.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/test_update_check.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/tools/__init__.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/tools/test_banned.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/tools/test_expander.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/tools/test_invocation.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/tools/test_loader.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/tools/test_registry.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/tools/test_runtime.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/tools/test_spec.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/ui/test_app.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/worker/test_codec.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/worker/test_daemon.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/worker/test_mcp_daemon_race.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/worker/test_queue.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/worker/test_queue_multiprocess.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/tests/worker/test_queue_reconciliation.py +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/website/docs/ACCOUNT_SAFETY.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/website/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/website/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/website/docs/CHARACTER.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/website/docs/DATA_LAYER.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/website/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/website/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/website/docs/E2E_TESTING.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/website/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/website/docs/INSTRUCTIONS.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/website/docs/MEDIA_LIBRARY.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/website/docs/MOVIE.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/website/docs/PROMPT_EXPANSION.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/website/docs/SECURITY.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/website/docs/TOOLS.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/website/docs/USER_GUIDE.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/website/docs/agents.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/website/docs/index.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/website/docs/installation.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/website/docs/onboarding-mockup.html +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/website/docs/onboarding.md +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/website/docs/stylesheets/extra.css +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/website/mkdocs.yml +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/website/requirements.in +0 -0
- {gflow_cli-0.69.0 → gflow_cli-0.70.0}/website/requirements.txt +0 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Gather evidence from the live Flow surface (DOM, network, HAR) before claiming a feature is broken, missing, or impossible.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# `/gflow:spike` — measure the blackbox
|
|
6
|
+
|
|
7
|
+
**Read `skills/spike/SKILL.md` and follow the protocol**, passing `$ARGUMENTS` as the
|
|
8
|
+
question to answer.
|
|
9
|
+
|
|
10
|
+
> Do **not** call `Skill(skill="spike")` — read the file directly.
|
|
@@ -107,3 +107,12 @@ website/site/
|
|
|
107
107
|
|
|
108
108
|
# Local git hooks dir (core.hooksPath target) — machine-local tooling, never shipped
|
|
109
109
|
.githooks/
|
|
110
|
+
|
|
111
|
+
# HAR/DOM spike harness (scripts/dev/har-spike/) — the vendored scripts ARE
|
|
112
|
+
# tracked; everything they generate is not. Captures carry auth cookies, Bearer
|
|
113
|
+
# tokens and prompts, and the npm/agent-browser caches are 34 MB of noise.
|
|
114
|
+
# (No .gitkeep negation here: git never descends into an ignored directory, so a
|
|
115
|
+
# negation for a file inside one is inert. The capture scripts create the dir.)
|
|
116
|
+
scripts/dev/har-spike/artifacts/
|
|
117
|
+
scripts/dev/har-spike/.agent-browser/
|
|
118
|
+
scripts/dev/har-spike/.npm-cache/
|
|
@@ -14,6 +14,7 @@ that did not run.
|
|
|
14
14
|
|
|
15
15
|
| If you are about to… | Load first | Non-negotiable because |
|
|
16
16
|
|---|---|---|
|
|
17
|
+
| Claim a Flow surface is broken, missing, or impossible | `/gflow:spike <question>` | A selector that misses is evidence about the SELECTOR; "labs-only, ever" came from one 20 s timeout and cost a day |
|
|
17
18
|
| Touch a GitHub issue | `/gflow:issue-assessment <N>` | Read-only triage precedes any fix; classification changes what "fixing" means |
|
|
18
19
|
| Propose a transport, auth, selector, or schema change | `/gflow:predict <proposal>` | Five adversarial personas return GO / CAUTION / STOP before code exists |
|
|
19
20
|
| Start a feature | `/gflow:scenario` → `/gflow:plan` | Edge cases before tasks; tasks before code |
|
|
@@ -96,7 +97,7 @@ the five other mirror axes), which no command here can check and no CI gate can
|
|
|
96
97
|
- TDD is non-negotiable. Coverage floor: 80% overall.
|
|
97
98
|
- Documentation is a first-class deliverable. Every behavior, workflow, config, or operator-facing change must update the relevant docs or state why no docs changed in the PR/checklist. `scripts/ci/check_doc_links.py` is a merge gate.
|
|
98
99
|
- **A PR is not done until its SonarCloud gate is green (zero new issues).** The nine gates above are local/pre-commit; SonarCloud is server-side and runs in CI (`sonar.qualitygate.wait=true` → a red gate turns the `SonarCloud analysis` check red). Before calling a PR merge-ready, verify it with `/gflow:sonar <N>` (it is skipped on fork PRs — maintainer-checked there).
|
|
99
|
-
- **E2E is the decisive layer, and it is required for every behavior change that touches a Flow surface.** Run the `tests/e2e/` test that covers the change, or write one — offline-green proves only that *our* code does what we think, never that Flow still behaves as captured. `/gflow:live-verify` does **not** satisfy this: it drives CLI commands by hand into a gitignored note and never runs `pytest -m e2e`. The two are complementary — an e2e test is a re-runnable regression, a live-verify ledger is a narrative record.
|
|
100
|
+
- **E2E is the decisive layer, and it is required for every behavior change that touches a Flow surface.** Run the `tests/e2e/` test that covers the change, or write one — offline-green proves only that *our* code does what we think, never that Flow still behaves as captured. `/gflow:live-verify` does **not** satisfy this: it drives CLI commands by hand into a gitignored note and never runs `pytest -m e2e`. The two are complementary — an e2e test is a re-runnable regression, a live-verify ledger is a narrative record. A change touching no Flow surface at all (docs, help text, exit-code plumbing) is out of scope — say so explicitly rather than leaving it blank. Anything else follows the **Iron Law** above: run it, or name the external blocker that stops you. "A maintainer will run it" is a handoff, not a verification, and is only available once the blocker is named.
|
|
100
101
|
- E2E tests require `GFLOW_CLI_E2E_PROFILE` and `-m e2e` (excluded from the default `addopts`, so they never run by accident). Cost sub-markers: `e2e_auth` (zero credits, browser only), `e2e_image` (zero credits, daily cap), `e2e_scene`, `e2e_data`, `e2e_batch`, `e2e_character` (opt in with `GFLOW_CLI_E2E_RUN_CHARACTER=1`), `e2e_video` (spends Veo credits — opt in with `GFLOW_CLI_E2E_RUN_VIDEO=1`). Redact account identifiers and any token or cookie value before pasting output into a PR.
|
|
101
102
|
- Live tests (`@pytest.mark.live`) opt in via `GFLOW_LIVE=1`.
|
|
102
103
|
|
|
@@ -109,10 +110,11 @@ the five other mirror axes), which no command here can check and no CI gate can
|
|
|
109
110
|
- **YAGNI / least-code**: prefer the smallest change that works. No speculative abstractions (interface/factory with one implementation), no config or flags nobody sets, no dead constants/helpers, no reinventing the stdlib. Review carries this as its own lens — the **D14 over-engineering** dimension of [`pr-council-review`](skills/pr-council-review/SKILL.md) (baseline, always runs). Its rubric is portable; the `ponytail` plugin (see CONTRIBUTING) is an optional accelerant, not a dependency.
|
|
110
111
|
- **MCP & CLI Schema Symmetry**: Any updates or additions to user-facing CLI command parameters (e.g., `gflow image t2i`, `gflow video`) must be mirrored in the corresponding MCP tool definitions. Never add option/argument fields to Click commands without updating the MCP server implementation. This symmetry is enforced programmatically in CI via `tests/mcp/test_cli_parity.py` (every CLI leaf command needs a mapped MCP tool or an explicit, reasoned exemption) plus the schema checks in `tests/mcp/test_server.py`.
|
|
111
112
|
|
|
112
|
-
**That
|
|
113
|
-
|
|
114
|
-
restriction the CLI no longer has
|
|
115
|
-
|
|
113
|
+
**That gate now covers leaves *and their options*** (`test_every_cli_leaf_has_an_mcp_decision`,
|
|
114
|
+
`test_every_cli_option_reaches_its_mcp_tool`). It still cannot see a queued-payload key that
|
|
115
|
+
goes unread, a tool docstring asserting a restriction the CLI no longer has, or a twin that
|
|
116
|
+
was never *run*. So MCP stays a responsibility of **every phase**, not a post-hoc checklist
|
|
117
|
+
item. Each skill owns its slice:
|
|
116
118
|
|
|
117
119
|
| Phase | Skill | Its MCP duty |
|
|
118
120
|
|---|---|---|
|
|
@@ -142,10 +144,86 @@ the five other mirror axes), which no command here can check and no CI gate can
|
|
|
142
144
|
|
|
143
145
|
These rules exist because docs alone don't bind under momentum: a "check open PRs first" rule was already written and still got skipped, and a PR was merged without seeing an entangled open one. Follow them on every task.
|
|
144
146
|
|
|
147
|
+
### The Iron Law — done means verified by a run
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
IF YOU TOUCHED A COMMAND, A FEATURE, OR A FLOW SURFACE,
|
|
151
|
+
YOU RUN ITS E2E TEST. NO RUN = NOT DONE.
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Not "tests pass". Not "the gates are green". Not "it's a thin wrapper over code that
|
|
155
|
+
is already covered". **A run, against the real thing, that you watched.** Offline green
|
|
156
|
+
proves our code does what we think it does; it cannot prove Flow still behaves as
|
|
157
|
+
captured, and it cannot prove the surface an agent or a user actually calls is wired to
|
|
158
|
+
the code under test. Everything not exercised is unknown, and unknown ships as a bug.
|
|
159
|
+
|
|
160
|
+
If no e2e test covers the change, **write one** — that is part of the change, not
|
|
161
|
+
follow-up work.
|
|
162
|
+
|
|
163
|
+
**The only permitted exception is a named external blocker** you cannot remove: an
|
|
164
|
+
exhausted API quota, hardware you do not have, an account you do not control, a cohort
|
|
165
|
+
Google has not put you in. Write the blocker down. Then these are **not** blockers, and
|
|
166
|
+
naming one is a rule violation, not a caveat:
|
|
167
|
+
|
|
168
|
+
- "I didn't get to it" · "it's covered by unit tests" · "it's a thin adapter"
|
|
169
|
+
- "the CLI path is verified and it shares the service"
|
|
170
|
+
- "recorded, not omitted"
|
|
171
|
+
|
|
172
|
+
That last one is the dangerous one, because it is a **good** convention being misused.
|
|
173
|
+
Recording an unverified item beats silently dropping it — but it is a record of a
|
|
174
|
+
blocker, never a substitute for a run. **Listing something as unverified that you could
|
|
175
|
+
have verified is the same failure as omitting it, plus a false paper trail.**
|
|
176
|
+
|
|
177
|
+
> **This law is written from the failure it prevents.** v0.69.0 shipped with two items
|
|
178
|
+
> under "Not verified": the MCP twin of the credits path, and 5 of 19 skill-benchmark
|
|
179
|
+
> tasks. Asked why we were going blind, both were verified **within the hour**. The MCP
|
|
180
|
+
> twin was a $0 read-only test — 3 assertions, 58 seconds, and it is now
|
|
181
|
+
> `tests/e2e/test_credits_mcp_e2e.py`. The 5 tasks ran on a model whose quota was still
|
|
182
|
+
> open, against a control run to separate model weakness from skill weakness, and
|
|
183
|
+
> exposed **four real defects** that the words "recorded, not omitted" had made invisible.
|
|
184
|
+
> Neither was ever blocked. Both were labelled instead of run.
|
|
185
|
+
|
|
186
|
+
### The second law — MCP parity is not a chore, it is the contract
|
|
187
|
+
|
|
188
|
+
```
|
|
189
|
+
EVERY USER-FACING CLI CAPABILITY HAS AN MCP TWIN,
|
|
190
|
+
OR A RECORDED REASON IT DOES NOT.
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
The CLI and the MCP server are two doors onto one product. A capability behind only one
|
|
194
|
+
of them is not "mostly shipped" — for whoever is standing at the other door it does not
|
|
195
|
+
exist, and nothing tells them so. Agents cannot read a `--help` they were never given;
|
|
196
|
+
they discover a missing option by getting the wrong result.
|
|
197
|
+
|
|
198
|
+
Parity is **not** satisfied by a command existing. It has to hold at every level the two
|
|
199
|
+
surfaces can drift apart: the leaf, **its options**, the queued-payload keys the worker
|
|
200
|
+
reads back, and the tool docstring's claims about what the CLI does. The canonical list
|
|
201
|
+
is the **six mirror axes**, written out once in
|
|
202
|
+
[`skills/check/SKILL.md`](skills/check/SKILL.md) step 1b and cited from everywhere else —
|
|
203
|
+
never copied, because a duplicated checklist drifts, which is the failure it exists to
|
|
204
|
+
catch.
|
|
205
|
+
|
|
206
|
+
**A twin is a separate surface, so the Iron Law applies to it separately.** Verifying the
|
|
207
|
+
CLI path does not verify the MCP path. They share a service, and the service was never
|
|
208
|
+
the risk — the adapter is. Run both.
|
|
209
|
+
|
|
210
|
+
Where a capability is deliberately CLI-only — an interactive login, a destructive local
|
|
211
|
+
operation, a long-running billed job with no way to take consent — that is a legitimate
|
|
212
|
+
answer. **Record it with its reason** in `tests/mcp/test_cli_parity.py`, and revisit the
|
|
213
|
+
reason when whatever justified it changes.
|
|
214
|
+
|
|
215
|
+
> **Written from a live gap.** `--reference-entity` exists on four leaf commands and no
|
|
216
|
+
> MCP tool exposes the concept at all, while the whole `gflow character` group sits
|
|
217
|
+
> exempt as "not yet ported". The product's entire **identity axis** — create a
|
|
218
|
+
> character, attach a character — is therefore unreachable over MCP, and the parity gate
|
|
219
|
+
> reported full compliance throughout, because it only ever checked that leaves were
|
|
220
|
+
> *mapped*. Found by an option-level sweep, filed as #689, and the gate now checks
|
|
221
|
+
> options too.
|
|
222
|
+
|
|
145
223
|
- **Check what's already in flight before coding a fix, opening a PR, or merging.** Run `gh pr list` and `git ls-remote` first — another open PR may already touch the same issue or files. Reconcile against it; don't re-derive "the only thing left" from a stale handoff. (A `PreToolUse` hook also surfaces same-issue open PRs at `gh pr create`/`merge` time, but treat that as a backstop, not a substitute for looking.)
|
|
146
224
|
- **Truth is the CLI and running the code — not IDE/LSP "reminder" diagnostics.** Editor / `pyright`-in-worktree warnings go stale for an entire session and throw false positives (especially across multiple worktrees). Confirm with `ruff` / `pyright` / `pytest` from the terminal — or trust the worktree's own venv — never an IDE squiggle.
|
|
147
225
|
- **Verify third-party runtime behavior empirically before wiring it in.** Don't assume how an external library, API, or browser actually behaves — exercise it once and observe, then build on the observed contract.
|
|
148
|
-
- **
|
|
226
|
+
- **A claim you have not run is not a finding — it is a guess with formatting.** Confidence labels are not evidence: do not grade an unrun claim as "likely", "probably correct" or "low risk" and move on. Where a genuine external blocker stops the run (see the Iron Law), keep the issue open, reference it with `Refs #N` (not `Closes #N`), ship diagnostics rather than a blind fix, and hand it to whoever can reproduce it — naming what would settle it.
|
|
149
227
|
- **This project reverse-engineers a blackbox.** gflow-cli doesn't own Google Flow — it drives real Flow through inspected HAR/DOM/browser-log behavior. Offline checks (types, lint, unit/BDD tests) verify *our* code does what we think it does; they cannot verify Flow still behaves the way we captured it. Every feature that touches a generation path is **live-verified**, not just offline-tested, before it's called done — see `/gflow:live-verify`.
|
|
150
228
|
|
|
151
229
|
## Standard Workflow Sequence
|
|
@@ -154,6 +232,7 @@ All AI agents and harnesses working on `gflow-cli` follow this standard 10-phase
|
|
|
154
232
|
|
|
155
233
|
| Phase | Skill / Command | Purpose | Output Artifact |
|
|
156
234
|
|---|---|---|---|
|
|
235
|
+
| 0. Spike | `/gflow:spike <question>` | Evidence from the live surface (DOM / network / HAR) whenever a claim of absence is in play | `scripts/dev/spike_*.py` + `docs/superpowers/spikes/<date>-<slug>.md` |
|
|
157
236
|
| 1. Triage | `/gflow:issue-assessment <N>` | Read-only issue analysis & root cause hypothesis | `issue_assessment_<N>.md` |
|
|
158
237
|
| 2. Pre-Implementation | `/gflow:predict <proposal>` | Adversarial audit (D14 YAGNI, security, risks) | GO / CAUTION / STOP verdict |
|
|
159
238
|
| 3. BDD Scaffolding | `/gflow:scenario <feature>` | Edge-case explorer & BDD Gherkin spec | `Scenario:` blocks & test scaffold |
|
|
@@ -189,6 +268,7 @@ The `skills/` directory ships installable agent skill docs in plain Markdown wit
|
|
|
189
268
|
| Skill | Path | When to load |
|
|
190
269
|
|---|---|---|
|
|
191
270
|
| `gflow-cli` | [`skills/gflow-cli/SKILL.md`](skills/gflow-cli/SKILL.md) | User wants to run any `gflow` command — auth, T2V, I2V, T2I, I2I, batch |
|
|
271
|
+
| `spike` | [`skills/spike/SKILL.md`](skills/spike/SKILL.md) | Before asserting any absence on a live Flow surface — the first layer of investigation |
|
|
192
272
|
| `predict` | [`skills/predict/SKILL.md`](skills/predict/SKILL.md) | Pre-implementation adversarial analysis before any high-stakes change |
|
|
193
273
|
| `scenario` | [`skills/scenario/SKILL.md`](skills/scenario/SKILL.md) | Edge-case explorer after a predict GO/CAUTION |
|
|
194
274
|
| `plan` | [`skills/plan/SKILL.md`](skills/plan/SKILL.md) | Create a structured task-by-task implementation plan for a feature |
|
|
@@ -231,6 +311,35 @@ extension does not currently load plugins, so IDE-only users should include the
|
|
|
231
311
|
|
|
232
312
|
The SkillOpt harness at `scripts/dev/skillopt/` measures how accurately each skill guides an agent. It drives any OpenAI-compatible endpoint — OpenAI, a gateway (OpenRouter, LiteLLM, freellmapi), a local model, or Google's compat endpoint — through the project's own `GFLOW_CLI_LLM_*` settings, the same ones the prompt tools use; there is no separate provider configuration. See [`scripts/dev/skillopt/README.md`](scripts/dev/skillopt/README.md).
|
|
233
313
|
|
|
314
|
+
## Spiking a blackbox surface — the two modes
|
|
315
|
+
|
|
316
|
+
This project reverse-engineers Google Flow, so "go and look at the real thing" is a
|
|
317
|
+
first-class development activity, not a last resort. Two harnesses exist. **Use one of
|
|
318
|
+
them before writing a capture script from scratch.**
|
|
319
|
+
|
|
320
|
+
| Mode | Where | Driver | Who clicks | Use when |
|
|
321
|
+
|---|---|---|---|---|
|
|
322
|
+
| **In-process** | `scripts/dev/spike_*.py` | Playwright, via gflow's own transport | the script | you can already drive the surface, or you want to see exactly what gflow sees |
|
|
323
|
+
| **HAR + DOM** | [`scripts/dev/har-spike/`](scripts/dev/har-spike/README.md) | CDP-attached **real Chrome** through a pinned `agent-browser` | **a human, by hand** | the driver cannot reach the surface yet, or a capture is ambiguous and you need ground truth |
|
|
324
|
+
|
|
325
|
+
Start in-process; escalate to the HAR harness when the driver cannot get far enough to
|
|
326
|
+
observe anything. A hand-driven HAR is the tiebreaker. **The protocol is
|
|
327
|
+
[`skills/spike/SKILL.md`](skills/spike/SKILL.md) — load it before asserting any absence.**
|
|
328
|
+
|
|
329
|
+
Both write to **gitignored** output — `scripts/dev/_spike_out/` and
|
|
330
|
+
`scripts/dev/har-spike/artifacts/`. Captures carry Bearer tokens, cookies and prompts:
|
|
331
|
+
`*.har` is gitignored repo-wide, and a capture must never be committed or pasted into an
|
|
332
|
+
issue unredacted. Use `scripts/dev/har-spike/extract_har_summary.py` for the redacted
|
|
333
|
+
summary that IS shareable. Findings belong in `docs/superpowers/spikes/`; the evidence
|
|
334
|
+
that produced them stays local.
|
|
335
|
+
|
|
336
|
+
> **The harness is vendored in for discoverability, and that is the whole point.** It
|
|
337
|
+
> lived in a sibling directory outside git until 2026-09-06. Being outside the repo, no
|
|
338
|
+
> agent could find it, nothing pinned its `agent-browser` version, and its one test ran
|
|
339
|
+
> nowhere. A session that day wrote three capture scripts from scratch and only learned
|
|
340
|
+
> the harness existed because the user said so — after concluding, wrongly, that a
|
|
341
|
+
> working Flow feature was impossible. Keep it in-tree, keep its data disposable.
|
|
342
|
+
|
|
234
343
|
## Where to look next
|
|
235
344
|
|
|
236
345
|
- **Architecture & target shape** → [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)
|
|
@@ -240,6 +349,7 @@ The SkillOpt harness at `scripts/dev/skillopt/` measures how accurately each ski
|
|
|
240
349
|
- **Known issues** (read before touching auth / reCAPTCHA) → [KNOWN_ISSUES.md](KNOWN_ISSUES.md)
|
|
241
350
|
- **Current task** → `/gflow:status` · **Create a feature plan** → `/gflow:plan <feature>` · **Full roadmap** → [PLAN.md](PLAN.md)
|
|
242
351
|
- **Release protocol** → [RELEASE.md](RELEASE.md)
|
|
352
|
+
- **Spiking a live Flow surface** (HAR + DOM capture) → [scripts/dev/har-spike/README.md](scripts/dev/har-spike/README.md)
|
|
243
353
|
|
|
244
354
|
## Claude Code-specific notes
|
|
245
355
|
|
|
@@ -7,6 +7,168 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.70.0] — 2026-09-06
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- **`-o <existing directory>` no longer costs you a clip.** `--output` on `video t2v` / `i2v` /
|
|
15
|
+
`r2v` and on `image t2i` / `i2i` accepted a path that was already a directory. Nothing checked
|
|
16
|
+
it until `_relocate_video_output` called `Path.replace()` onto the target, long after Flow had
|
|
17
|
+
rendered and billed the clip: `PermissionError: [WinError 5]`, surfaced as a bare
|
|
18
|
+
"Unexpected error" (exit 1), with the paid mp4 orphaned under a bare UUID name in the working
|
|
19
|
+
directory. Found by dogfooding an r2v run on 2026-09-06 — two clips billed, neither saveable.
|
|
20
|
+
All five option declarations now carry `dir_okay=False`, which Click enforces while parsing, so
|
|
21
|
+
the run aborts in under a second at zero cost. (A sixth declaration already had it; the rest had
|
|
22
|
+
drifted from it.)
|
|
23
|
+
|
|
24
|
+
- **`gflow character create` works on the migrated `flow.google.com` host.** It had never been
|
|
25
|
+
broken there — gflow was not driving it. The readiness gate waited for
|
|
26
|
+
`div[role="textbox"][data-slate-editor="true"]`, a React/**Slate** anchor; the migrated
|
|
27
|
+
frontend is Angular and renders the same editor with **ProseMirror**, so the gate timed out
|
|
28
|
+
after 20 s and the surface was read as absent. v0.69.0 then hardened that misreading into a
|
|
29
|
+
`raise_if_migrated` guard that aborted with exit 36 *before* probing the DOM, turning "our
|
|
30
|
+
selector missed" into a confident, non-retryable "this host will never do it". The gate now
|
|
31
|
+
accepts both anchors, the guard is gone, and the picker/result paths follow:
|
|
32
|
+
|
|
33
|
+
- body mode is anchored on the migrated editor's `<flow-slot-chip-button>` component
|
|
34
|
+
boundary (there is no `add_2` control there at all), its settle signal is the face
|
|
35
|
+
reference mounting from `flow-content.google/image/…`, and the prompt-box counter now
|
|
36
|
+
counts through the readiness anchor instead of Slate only — it reported 0 boxes on an
|
|
37
|
+
editor whose box was mounted and visible. `--body-prompt`, `--voice` and `--personality`
|
|
38
|
+
all complete on the migrated host as a result.
|
|
39
|
+
- each slot takes **its own** `primaryMediaId`, read from the project listing. The entity
|
|
40
|
+
exposes only a thumbnail id, and handing that to every slot made the body slot claim the
|
|
41
|
+
face's media — which `commit_workflow` then PATCHed onto the body workflow, corrupting it.
|
|
42
|
+
Reading Flow's own value makes that commit a no-op.
|
|
43
|
+
- the portrait is read back off the **entity** when the labs `batchGenerateImages` wire stays
|
|
44
|
+
silent. The migrated host generates over its own `batchexecute` (rpcid `ogiZ0b`), so the
|
|
45
|
+
listener timed out on work that had already succeeded — the entity carried a workflow id and
|
|
46
|
+
a thumbnail media id the moment the timeout fired. The ids now come off the entity itself,
|
|
47
|
+
which proves the character binding by construction rather than trusting a self-reported
|
|
48
|
+
`parentEntityId`, and the image is downloaded so `--output` and `image_paths` behave the
|
|
49
|
+
same on both hosts.
|
|
50
|
+
|
|
51
|
+
Verified live on a moved account: `display_name` patched, workflow id and thumbnail bound,
|
|
52
|
+
file on disk, and `--model nano2` / `--model nanopro` each selecting the tier asked for.
|
|
53
|
+
Recon: `scripts/dev/spike_migrated_character_*.py`.
|
|
54
|
+
|
|
55
|
+
- **`character create --model` is now deterministic: it applies the tier you asked for, or it
|
|
56
|
+
fails.** The character model picker was best-effort — every failure path logged a warning and
|
|
57
|
+
let the generation run on whatever tier the editor happened to show, so `--model nano2` could
|
|
58
|
+
quietly return a Nano Banana Pro image with nothing in the output saying so. Three separate
|
|
59
|
+
faults did exactly that: it skipped the click entirely when `nano2` was requested (assuming
|
|
60
|
+
Nano Banana 2 was the editor default, which is true on labs and false on `flow.google.com`);
|
|
61
|
+
its option selector `:has-text('…')` was unanchored, so `.first` resolved to `<html>`; and its
|
|
62
|
+
menu-item lookup was unscoped, so `[role='menuitem']` mixed the open menu's entries with
|
|
63
|
+
hidden ones from the editor's other menus and `nth(i)` clicked a node that could not be
|
|
64
|
+
clicked. The menu also offers **three** tiers, not the documented two, and `Nano Banana 2` is
|
|
65
|
+
a prefix of `Nano Banana 2 Lite`.
|
|
66
|
+
|
|
67
|
+
Now: entries are read from the *visible* menu, matched in Python with an explicit exclusion,
|
|
68
|
+
an ambiguous or absent match refuses rather than guessing, and the selection is **verified by
|
|
69
|
+
re-reading the chip** rather than trusting the click. Anything else raises — `ConfigurationError`
|
|
70
|
+
for a tier the menu does not offer, `UiSelectorDriftError` for a picker that cannot be driven.
|
|
71
|
+
Aborting here is free: the picker runs before the prompt is submitted, so a refusal costs no
|
|
72
|
+
quota and no credits, while proceeding produces a paid artifact from the wrong model. Verified
|
|
73
|
+
live: four consecutive runs alternating `--model nano2` / `--model nanopro`, correct tier every
|
|
74
|
+
time.
|
|
75
|
+
|
|
76
|
+
- **A failed `character create` no longer strands an "Untitled Character" in the project.** The
|
|
77
|
+
saga persists before it spends, and deliberately keeps its STARTED row so a retry can resume —
|
|
78
|
+
but that row is keyed on `(project_id, name)`, so a retry under any other name missed it and
|
|
79
|
+
minted a second entity, leaving the first orphaned with `refs=0` forever. A failure with no
|
|
80
|
+
slot committed now rolls the free entity back and marks the row FAILED. It asks the **backend**
|
|
81
|
+
first: an empty local `workflow_ids` means only that this process failed to read a result, and
|
|
82
|
+
on the migrated host a portrait generated fine while the client timed out — deleting on the
|
|
83
|
+
local signal alone would have destroyed finished work.
|
|
84
|
+
|
|
85
|
+
- **PR-triage autopilot: stop re-alerting a deferred PR on every push.** The `DEFERRED_SIZE` and
|
|
86
|
+
`NEEDS-HUMAN` gate branches deduped on `(pr, head_sha, status)`, so every push to an oversized
|
|
87
|
+
PR looked new to the ledger and re-sent a byte-identical "needs a manual review" mail on the
|
|
88
|
+
next hourly cycle. PR #683 produced three on 2026-09-06 (2130 / 2500 / 3066 lines) — same
|
|
89
|
+
verdict, same required action. Now dedupes on the PR's latest ledger status via a new
|
|
90
|
+
`latest_status()` helper: one alert per gate trip, and a PR that trips, gets fixed and reviewed,
|
|
91
|
+
then regresses still alerts again. Ops tooling under `scripts/autopilot/`, not a Flow surface,
|
|
92
|
+
so no e2e applies. ([#697](https://github.com/ffroliva/gflow-cli/issues/697))
|
|
93
|
+
|
|
94
|
+
- **A reCAPTCHA mint that fails after the migrated-host handoff now reports exit 36, not exit 1**
|
|
95
|
+
([#692](https://github.com/ffroliva/gflow-cli/issues/692)). The `raise_if_migrated` guard added
|
|
96
|
+
in #678 is a point-in-time read of `page.url`, and Flow's handoff to `flow.google.com` is a
|
|
97
|
+
**client-side** navigation that can land after it. The bootstrap's own `await_url_settled` does
|
|
98
|
+
not close that window either — it is skipped entirely for a profile latched at
|
|
99
|
+
`NOT_REDIRECTED`. The guard is now re-run on the mint's failure path, which costs nothing when
|
|
100
|
+
the mint succeeds and classifies correctly whenever the hop lands, rather than depending on it
|
|
101
|
+
landing before one particular line. A genuine labs-side reCAPTCHA failure still surfaces as
|
|
102
|
+
`RecaptchaError`.
|
|
103
|
+
|
|
104
|
+
**The re-check now polls for a bounded 1.5 s rather than reading once.** A single instantaneous
|
|
105
|
+
read still lost the race: Playwright updates `page.url` on `framenavigated`, so a mint that dies
|
|
106
|
+
*while* the navigation is committing reads the old host on an account that is in fact migrated,
|
|
107
|
+
and the run exited 1. Polling turns "who won this instant" into "did the hop land at all". It is
|
|
108
|
+
the error path, so a successful mint never waits.
|
|
109
|
+
|
|
110
|
+
The re-check catches **any** mint failure, not just `RecaptchaError`. `TokenMinter.mint` guards
|
|
111
|
+
only its second `page.evaluate`: `site_key()` → `discover_site_key` runs an unguarded one, and
|
|
112
|
+
the minter is rebuilt per call so that unguarded call runs every time. A hop mid-mint destroys
|
|
113
|
+
the execution context, so the likeliest shape of this failure is a **raw Playwright error** —
|
|
114
|
+
which a `RecaptchaError`-only net would miss entirely. Nothing is swallowed: the original
|
|
115
|
+
exception propagates untouched unless the page turns out to be migrated.
|
|
116
|
+
|
|
117
|
+
**Scope, stated honestly:** the reporter's failure could **not** be reproduced locally. On a
|
|
118
|
+
migrated, `NOT_REDIRECTED`-latched profile the hop wins the race and v0.69.0 already returns
|
|
119
|
+
exit 36 — verified live, before and after this change. So this hardens a race that is real in
|
|
120
|
+
the code but unobserved here; it is not a confirmed fix for #692, which stays open.
|
|
121
|
+
|
|
122
|
+
### Added
|
|
123
|
+
|
|
124
|
+
- **`gflow video r2v` from local `--ref` files runs on the migrated `flow.google.com`
|
|
125
|
+
host** (#639). Each file is uploaded through the same editor toolbar path i2v already
|
|
126
|
+
uses, so the app's own `maseQ` reply names the media id, and is then attached as an `@`
|
|
127
|
+
**mention** in the prompt — references are not a chip slot on this host.
|
|
128
|
+
|
|
129
|
+
Three measured details shape it. The Ingredients submit is rpcid **`MZZa6b`** (t2v
|
|
130
|
+
`YhhmEf`, i2v `eb1hJf`) — watching only the others is why this looked for several rounds
|
|
131
|
+
of recon like r2v never submitted at all. A mention is committed by **Enter**; a typed
|
|
132
|
+
query alone leaves the picker open and inserts nothing. And mentions need real key
|
|
133
|
+
events where prompt text needs `insert_text` (a newline must not submit), so the two
|
|
134
|
+
cannot share a path.
|
|
135
|
+
|
|
136
|
+
The submit body is asserted to carry every uploaded id, and a run whose references have
|
|
137
|
+
not all attached is refused **before** submit (exit 32) — the failure mode being a
|
|
138
|
+
full-price clip with none of the user's references on it. A reference the picker misses
|
|
139
|
+
is retried, since its search index does not always hold a fresh upload on the first
|
|
140
|
+
query. References by `@Name` and character entities (`--reference-entity`) stay on labs,
|
|
141
|
+
for the same reason a frame by UUID does: the picker exposes no media id to anchor on.
|
|
142
|
+
Live-verified end to end with two local refs and `--model veo-lite-lp`, and confirmed
|
|
143
|
+
semantically by the account owner: the presenter in the output is the person from the
|
|
144
|
+
first reference and the product is the one from the second, so both references are
|
|
145
|
+
genuinely bound rather than merely accepted.
|
|
146
|
+
|
|
147
|
+
**`--duration` is refused on this path (exit 11), and an r2v run pins 8s for itself.**
|
|
148
|
+
Flow offers reference-to-video only at its base 8s tier on this host. At 4s or 6s it does
|
|
149
|
+
not refuse: it flattens the reference mentions into plain prompt text and submits
|
|
150
|
+
`veo_3_1_t2v_lite_4s_low_priority` — a full-price text-to-video clip carrying the file
|
|
151
|
+
*names* and none of the images. The editor remembers the last duration, so a run passing
|
|
152
|
+
none was inheriting a degrading one. Measured at zero credits across three route-blocked
|
|
153
|
+
runs varying only the duration (`scripts/dev/capture_migrated_r2v_production_submit.py`).
|
|
154
|
+
Note the media slot carries the reference ids even in the degraded submits, so the model
|
|
155
|
+
key — not the ids — is what distinguishes a bound run from an accepted one.
|
|
156
|
+
|
|
157
|
+
**Correction to the first cut of this feature**, kept here because the claim was public:
|
|
158
|
+
the submit-body assertion above was written and unit-tested but **never registered** on
|
|
159
|
+
the r2v path — `page.on("request", …)` was gated on the i2v `expect_media_id`, which is
|
|
160
|
+
always `None` for r2v. The live run and its e2e evidence therefore prove the references
|
|
161
|
+
bound; they do not prove a lost one would have been caught. Fixed, along with the model
|
|
162
|
+
key regex the diagnostic reads (it matched only mode-infixed keys, and a *mode-less* key
|
|
163
|
+
is precisely what an r2v body carries when the picker inserted nothing), and covered by a
|
|
164
|
+
round-trip test that drives `submit_and_observe` and asserts the check actually fired
|
|
165
|
+
rather than calling it directly.
|
|
166
|
+
|
|
167
|
+
- **`recaptcha_mint_failed_off_migrated_host`** — when a mint fails and the page still reads as
|
|
168
|
+
`labs.google`, the page URL is now logged. That is the one observation which distinguishes the
|
|
169
|
+
race above from a genuine labs-side reCAPTCHA break, and it makes the next incident bundle
|
|
170
|
+
self-sufficient instead of costing a round trip to the reporter.
|
|
171
|
+
|
|
10
172
|
## [0.69.0] — 2026-09-06
|
|
11
173
|
|
|
12
174
|
### Added
|
|
@@ -4066,7 +4228,8 @@ shell-script template that branches on these codes.
|
|
|
4066
4228
|
|
|
4067
4229
|
First skeleton. Not functional end-to-end yet.
|
|
4068
4230
|
|
|
4069
|
-
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.
|
|
4231
|
+
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.70.0...HEAD
|
|
4232
|
+
[0.70.0]: https://github.com/ffroliva/gflow-cli/compare/v0.69.0...v0.70.0
|
|
4070
4233
|
[0.69.0]: https://github.com/ffroliva/gflow-cli/compare/v0.68.0...v0.69.0
|
|
4071
4234
|
[0.68.0]: https://github.com/ffroliva/gflow-cli/compare/v0.67.0...v0.68.0
|
|
4072
4235
|
[0.67.0]: https://github.com/ffroliva/gflow-cli/compare/v0.66.3...v0.67.0
|
|
@@ -51,6 +51,44 @@ Four rules the pipeline enforces that catch first-time contributors most often:
|
|
|
51
51
|
The PR template's *Lifecycle* checklist mirrors this table. Tick what applies, strike what
|
|
52
52
|
does not, and say why — a reviewer can then start from your evidence instead of re-deriving it.
|
|
53
53
|
|
|
54
|
+
### Reporting that something is broken? Spike it first
|
|
55
|
+
|
|
56
|
+
An e2e test proves a **fix**. A spike proves a **diagnosis** — and it is what turns "this
|
|
57
|
+
does not work for me" into something a maintainer can act on without owning your account.
|
|
58
|
+
|
|
59
|
+
gflow drives a product we do not control, so the single most useful thing in a bug report is
|
|
60
|
+
what Flow actually rendered or called on your machine. Two harnesses exist, and both are `$0`
|
|
61
|
+
(navigation and DOM reads spend no credits and no quota):
|
|
62
|
+
|
|
63
|
+
| | where | who drives | use when |
|
|
64
|
+
|---|---|---|---|
|
|
65
|
+
| **In-process probe** | `scripts/dev/spike_*.py` | the script, through gflow's own transport | you can reach the surface and want to see what gflow sees |
|
|
66
|
+
| **HAR + DOM capture** | [`scripts/dev/har-spike/`](scripts/dev/har-spike/README.md) | **you**, by hand, in real Chrome over CDP | gflow cannot get far enough to observe anything |
|
|
67
|
+
|
|
68
|
+
The protocol is [`skills/spike/SKILL.md`](skills/spike/SKILL.md) (`/gflow:spike` in Claude
|
|
69
|
+
Code). The rule it exists to enforce:
|
|
70
|
+
|
|
71
|
+
> **A selector that does not match is evidence about the selector. It is never evidence
|
|
72
|
+
> about the feature.**
|
|
73
|
+
|
|
74
|
+
A timeout, an exception or an exit code tells us an anchor missed — not that the thing is
|
|
75
|
+
gone. Saying "X is not supported on this host" without a DOM or network observation behind it
|
|
76
|
+
is how a *working* feature gets documented as impossible, which has happened here and cost a
|
|
77
|
+
day to undo.
|
|
78
|
+
|
|
79
|
+
**Redact before you attach.** Raw captures carry cookies, Bearer tokens and prompts, and
|
|
80
|
+
`*.har` is gitignored repo-wide for that reason. Run
|
|
81
|
+
`python scripts/dev/har-spike/extract_har_summary.py <capture>.har --host <host>` and attach
|
|
82
|
+
the **summary** — it is redacted by design and is what a maintainer needs anyway. Never paste
|
|
83
|
+
a raw HAR or an unredacted incident bundle into an issue.
|
|
84
|
+
|
|
85
|
+
> **Windows-only today.** The CDP harness is nine PowerShell scripts; a portable Python twin
|
|
86
|
+
> is being ported one script at a time (`probe_agent_mode.py` is the pattern). On macOS or
|
|
87
|
+
> Linux, use the in-process probes, or attach an **incident bundle** — gflow writes one
|
|
88
|
+
> automatically on operational failures under `<GFLOW_CLI_HOME>/incidents/`; see
|
|
89
|
+
> [DEBUGGING § Automatic incident bundles](docs/DEBUGGING.md#automatic-incident-bundles) for
|
|
90
|
+
> the layout. Redact account ids and any cookie or token value first.
|
|
91
|
+
|
|
54
92
|
## Development setup
|
|
55
93
|
|
|
56
94
|
```bash
|
|
@@ -14,9 +14,9 @@ Living list of behaviour that's broken, surprising, or limited by design — alo
|
|
|
14
14
|
|
|
15
15
|
## Open
|
|
16
16
|
|
|
17
|
-
### Flow is migrating to `flow.google.com`; gflow drives the migrated frontend for t2v
|
|
17
|
+
### Flow is migrating to `flow.google.com`; gflow drives the migrated frontend for t2v, i2v from a local start frame, and r2v from local reference files (rest of the matrix pending)
|
|
18
18
|
|
|
19
|
-
- **Status:** Open (partially resolved) · **Severity:** High for everything except text-to-video and local-file
|
|
19
|
+
- **Status:** Open (partially resolved) · **Severity:** High for everything except text-to-video, local-file image-to-video and local-file reference-to-video · **Affected:** on accounts the rollout has reached, `gflow video t2v`, `gflow video i2v --initial-frame <local file>` and `gflow video r2v --ref <local file>` now run on the migrated host (with `--project`); an end frame, a frame by UUID or `@Name`, references by `@Name` or `--reference-entity`, `image`, characters, scenes, extend, instructions and tools are not ported yet and still exit 36
|
|
20
20
|
- **Tracked:** [#639](https://github.com/ffroliva/gflow-cli/issues/639) · Reported 2026-09-02 against 0.59.0, 0.62.1, 0.63.0 and 0.65.0
|
|
21
21
|
- **Confirmed live 2026-09-03 on a second, independent account** (`ffroliva`) — see [LIVE_VERIFICATION_v0.66.0](docs/LIVE_VERIFICATION_v0.66.0.md). A read-only probe of the migrated origin measured `i_total: 0`, reproducing the reporter's central measurement.
|
|
22
22
|
- **Image commands on a moved account** ([#673](https://github.com/ffroliva/gflow-cli/issues/673), fixed in the unreleased line, post-v0.68.0): through v0.68.0 `image t2i` / `i2i` (and `upscale`, `extend`) died with exit 1 `RecaptchaError` within seconds, before any submit, instead of the exit 36 above, because the labs client minted the reCAPTCHA token on the `flow.google.com` project grid before any migration guard ran. The guard now runs at the mint. If you still see a `RecaptchaError` on a moved account right after `auth login`, that is the labs logged-out landing page from the [#644](https://github.com/ffroliva/gflow-cli/issues/644) cookie harvest, not this.
|
|
@@ -54,9 +54,22 @@ the clip). Two real clips were generated this way on 2026-09-05 — spike
|
|
|
54
54
|
(`GFLOW_CLI_FLOW_HOST=auto`): flow.google.com is the **default** host for that
|
|
55
55
|
command on every account — moved or not; `flow.google.com` forces it for
|
|
56
56
|
everything, and `labs.google` switches the migrated composer off. Limits today: `--project` is required (project creation from the
|
|
57
|
-
migrated editor is not ported), and only `t2v
|
|
57
|
+
migrated editor is not ported), and only `t2v`, `i2v` from a local `--initial-frame` (no end frame,
|
|
58
58
|
no UUID/`@Name` frame — the migrated Frames picker exposes no media id in its DOM, so a frame is
|
|
59
|
-
found by file name after gflow uploads it through the editor)
|
|
59
|
+
found by file name after gflow uploads it through the editor), and `r2v` from local `--ref` files
|
|
60
|
+
(see the next paragraph) — everything else still exits 36.
|
|
61
|
+
|
|
62
|
+
**`r2v` from local `--ref` files also runs there (2026-09-06).** Each file is uploaded
|
|
63
|
+
through the same editor toolbar path i2v uses — so the app's own `maseQ` reply names the
|
|
64
|
+
media id — and then attached as an `@` **mention** in the prompt rather than a chip slot.
|
|
65
|
+
Two details are load-bearing: the Ingredients submit is rpcid **`MZZa6b`** (t2v is
|
|
66
|
+
`YhhmEf`, i2v `eb1hJf`), and a mention is committed by **Enter** — a typed query alone
|
|
67
|
+
leaves the picker open and inserts nothing. The submit body is asserted to carry every
|
|
68
|
+
uploaded id, and a run whose references have not all attached is refused **before**
|
|
69
|
+
submit, because the failure mode is a full-price clip with none of them on it.
|
|
70
|
+
References by `@Name` and character entities stay on labs, for the same reason a frame by
|
|
71
|
+
UUID does: the picker exposes no media id to anchor on. Capture:
|
|
72
|
+
[2026-09-05-migrated-r2v-attach-surface](docs/superpowers/spikes/2026-09-05-migrated-r2v-attach-surface.md).
|
|
60
73
|
|
|
61
74
|
**Models on the migrated host.** Its picker is driven for every tier the account's
|
|
62
75
|
menu actually renders, `veo-lite-lp` included — matched by the `[Lower Priority]`
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: gflow-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.70.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
|
|
@@ -361,11 +361,11 @@ GFLOW_CLI_HISTORY_PROMPTS=redacted gflow image t2i "confidential brief"
|
|
|
361
361
|
|
|
362
362
|
**What:** Which Flow frontend gflow drives. Google is moving accounts from `labs.google/fx/tools/flow` onto `flow.google.com` one at a time ([#639](https://github.com/ffroliva/gflow-cli/issues/639)); the two are the same product on different widget toolkits and different wire protocols, so each has its own driver.
|
|
363
363
|
**Values:**
|
|
364
|
-
- `auto` (default) — **`flow.google.com` is the default host for every request it can serve today** (`video t2v`,
|
|
364
|
+
- `auto` (default) — **`flow.google.com` is the default host for every request it can serve today** (`video t2v`, `video i2v` from a local `--initial-frame` with no end frame, and `video r2v` from local `--ref` files — all with `--project`), on moved and unmoved accounts alike — the new host serves both. A request the new host cannot serve yet keeps the labs driver on an unmoved account; a moved account has no labs to fall back to: other modes exit 36, a missing `--project` or a labs-only model exit 11.
|
|
365
365
|
- `flow.google.com` — force the migrated composer for everything, including what it cannot serve yet (those requests then exit 36/11 instead of falling back).
|
|
366
366
|
- `labs.google` — never use the migrated composer; a moved account fails with exit 36 (kill switch).
|
|
367
367
|
**Default:** `auto`
|
|
368
|
-
**Scope today:** the migrated composer covers `gflow video t2v
|
|
368
|
+
**Scope today:** the migrated composer covers `gflow video t2v`, `gflow video i2v --initial-frame <local file>` and `gflow video r2v --ref <local file>`, each with `--project <id>` (settings via the option groups, model picker, local files uploaded through the editor's own Upload entry — bound in the Frames picker by file name for i2v, attached as `@` mentions in the prompt for r2v — submit, status observed on the page's own `batchexecute` replies, download from the signed CDN URL). An end frame, a frame given by UUID or `@Name`, references given by `@Name` or `--reference-entity`, image, characters, scenes, extend, instructions and tools are not ported yet and exit 36 on a moved account. MCP inherits the setting from the server/daemon environment, not per call.
|
|
369
369
|
|
|
370
370
|
### `GFLOW_CLI_PREFER_CLASSIC` *(deprecated — use `GFLOW_CLI_UI_MODE=classic`)*
|
|
371
371
|
|
|
@@ -149,7 +149,7 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
|
|
|
149
149
|
**"How do I upgrade gflow-cli?"** → [USAGE § `gflow update`](USAGE.md#gflow-update) (`gflow update` runs the installer that put it here — uv tool / pipx / pip; `--check` only reports; source installs are refused with exit 11)
|
|
150
150
|
**"How do I run the MCP server so an agent can't spend credits?"** → [CONFIGURATION § GFLOW_MCP_NO_SPEND](CONFIGURATION.md#gflow_mcp_no_spend) + [MCP § Option A2](MCP.md#option-a2-read-only-server) (`gflow mcp run --no-spend` / `GFLOW_MCP_NO_SPEND=1`; v0.57.0 — both generate tools go unregistered, not merely refused)
|
|
151
151
|
**"Which Flow UI arm does a run require, and why did it exit 2 or 28?"** → [CONFIGURATION § GFLOW_CLI_UI_MODE](CONFIGURATION.md#gflow_cli_ui_mode) (`auto` ≡ `classic` for **both** images and video — video since v0.57.0/#299, images since #595; unreachable classic aborts pre-submit with exit 28, $0; explicit `agentic` on video exits 2)
|
|
152
|
-
**"Which Flow frontend does a run drive — labs.google or the migrated flow.google.com — and why did it exit 36 or 11?"** → [CONFIGURATION § GFLOW_CLI_FLOW_HOST](CONFIGURATION.md#gflow_cli_flow_host) (`auto` = flow.google.com for every request it can serve — `t2v`,
|
|
152
|
+
**"Which Flow frontend does a run drive — labs.google or the migrated flow.google.com — and why did it exit 36 or 11?"** → [CONFIGURATION § GFLOW_CLI_FLOW_HOST](CONFIGURATION.md#gflow_cli_flow_host) (`auto` = flow.google.com for every request it can serve — `t2v`, `i2v` from a local `--initial-frame`, and `r2v` from local `--ref` files, with `--project`, on moved and unmoved accounts; `flow.google.com` forces it; `labs.google` is the kill switch. On a moved account an end frame, a UUID/`@Name` frame, references by `@Name`/`--reference-entity` and everything except `t2v`/`i2v`/`r2v` exit 36, non-retryable, and a missing `--project` exits 11) · recon: [character surface + reCAPTCHA mint](superpowers/spikes/2026-09-06-migrated-character-surface-and-recaptcha.md), [migrated-host wire protocol](superpowers/spikes/2026-09-05-migrated-host-wire-protocol.md), [handoff mechanism](superpowers/spikes/2026-09-04-migrated-host-handoff-mechanism.md), [frames attach (i2v)](superpowers/spikes/2026-09-05-migrated-frames-attach.md) · evidence: [LIVE_VERIFICATION_v0.67.0](LIVE_VERIFICATION_v0.67.0.md) (t2v), [LIVE_VERIFICATION_v0.69.0](LIVE_VERIFICATION_v0.69.0.md) (i2v from a local start frame, v0.69.0), [LIVE_VERIFICATION_v0.70.0](LIVE_VERIFICATION_v0.70.0.md) (r2v on the migrated host; character create verified there in #703)
|
|
153
153
|
**"Will this get my Google account flagged or banned? What protects me?"** → [ACCOUNT_SAFETY.md](ACCOUNT_SAFETY.md) — the operational answer in one place: rate limit vs WAF block vs ban (they are different), what the tool does to stay unremarkable (headed real Chrome, ±25% interaction jitter, 0.5–1.5 s submission pacing, one project per run, isolated profiles, refuse-don't-retry), what it deliberately does **not** do (no proxies, no fingerprint spoofing, no headless unlock), the knobs, the [#241](https://github.com/ffroliva/gflow-cli/issues/241) field data on what actually triggers a 403, and what we cannot promise. Legal statement: [DISCLAIMER](../DISCLAIMER.md)
|
|
154
154
|
|
|
155
155
|
**"I got a 403 / `PUBLIC_ERROR_UNUSUAL_ACTIVITY` — what now?"** → [ACCOUNT_SAFETY § When Google does push back](ACCOUNT_SAFETY.md#when-google-does-push-back) (stop, cool down 30–60 min, use real Chrome meanwhile, switch profile, widen jitter); cadence evidence in [DEBUGGING § WAF cadence](DEBUGGING.md#waf-cadence); full entry in [KNOWN_ISSUES](../KNOWN_ISSUES.md)
|
|
@@ -158,7 +158,7 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
|
|
|
158
158
|
**"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)
|
|
159
159
|
**"Flow's UI broke a selector — how do I diagnose it?"** → [DEBUGGING § Inspecting Flow's live UI](DEBUGGING.md#inspecting-flows-live-ui)
|
|
160
160
|
**"What does each `ui_automation.*` log event mean?"** → [DEBUGGING § Listener & HTTP-layer debugging](DEBUGGING.md#listener--http-layer-debugging)
|
|
161
|
-
**What was actually live-verified for the latest release?** → latest: [LIVE_VERIFICATION_v0.68.0](LIVE_VERIFICATION_v0.68.0.md) (`gflow update` self-upgrading a real `uv tool` and a real `pipx` install from their own running `gflow.exe` to the PyPI release, Windows 11, zero credits — see its own row below) · previous: [LIVE_VERIFICATION_v0.67.0](LIVE_VERIFICATION_v0.67.0.md) (the migrated `flow.google.com` driver — see its own row below) · previous: [LIVE_VERIFICATION_v0.64.0](LIVE_VERIFICATION_v0.64.0.md) (**#626 `--model omni-flash --end-frame` — first+last interpolation on Omni 1.1 Flash, verified 2026-09-02.** The guard this release removes was evidence-gated, so it was retired on evidence: a route-aborted submit capture on **two distinct Google accounts** (`ffroliva`, `denon82`) fired `video:batchAsyncGenerateVideoStartAndEndImage` with `startImage` AND `endImage` non-null at **zero credits**, ruling out a single-account artifact. The decisive layer is semantic, not structural: the paid 4s generation's **last frame IS the supplied end image** and its first frame is the start image — two visibly different subjects — which is the only check that distinguishes "Flow bound the end frame" from "Flow accepted and ignored it", and which layers 1–4 would pass either way. Render: 4.01s / 720×1280 / h264+aac / 2.4 MB, `MEDIA_GENERATION_STATUS_SUCCESSFUL`. The static capability table is **deleted**, not corrected — it went stale silently once and would again; a post-submit route check (`_assert_i2v_route`) now fails a run whose end frame Flow dropped back to the `StartImage` route, catching a rollback on any account without anyone re-reading a support page. One item is recorded as NOT verified rather than omitted: `--duration 10` + end frame is **submit-verified only** (`duration_set seconds=10` on the correct route with both images bound), because the status poll returned HTTP 401 mid-run and a retry 401'd at `project.create` before submitting — [#561](https://github.com/ffroliva/gflow-cli/issues/561), pre-existing, so verification was stopped rather than spending further credits on an environmental fault.) · previous: [LIVE_VERIFICATION_v0.63.0](LIVE_VERIFICATION_v0.63.0.md) (**`gflow video extend` — continuing a clip past Flow's 8s ceiling, verified 2026-09-01 on profile `ffroliva`, 20 Veo credits.** The decisive observation is that segment 2's `source_media_id` **is** segment 1's `media_id` (`0c9364f3…` seeded from `b9458021…`, then `648f9291…` seeded from `0c9364f3…`) — tail-only chaining, which no mock can establish; had it re-seeded from the source, the output would have been two divergent continuations of the same moment instead of one continuous shot. `extend_model_resolved` logged `candidate_count=99` against `SERVICE_TIER_INTERMEDIATE`, proving the key came from the live capability listing rather than a constant, and plan cost matched actual spend (`20 credits total, balance 875` → `Extended — 2/2 segment(s), 20 credits`). Render: 23.02s / 1280×720 / 24fps / h264+aac. **The run found a defect the offline suite is structurally incapable of seeing:** an extend segment carries **7.000000s** of content, not the 8 Flow advertises and bills, so server-side concat pads every internal seam with a frozen frame and digital silence (15s at −75.1 dB against −29 neighbours, reproduced on a second independent render) — filed in KNOWN_ISSUES with the three questions that must be answered before any clamp, and the reason `--extend N` on t2v/i2v was deliberately NOT shipped. Seven items are recorded as NOT verified rather than omitted: portrait `9:16`, `--aspect` against a mismatched source, chains longer than 2 segments, `--resume-from` against a live partial scene, the insufficient-credits refusal, a live Ctrl+C, and `OperationKind.EXTEND` rows.) · previous: [LIVE_VERIFICATION_v0.62.1](LIVE_VERIFICATION_v0.62.1.md) (**#604 `--model omni-flash` selects again after Flow's `Omni Flash` → `Omni 1.1 Flash` rename, verified 2026-08-30 on profile `ffroliva` at ZERO Veo credits.** The production `_select_video_model` was driven against the real picker: the shipped selector resolves verbatim — `model_selected model=omni_flash via="[role='menuitem']:has-text('Omni'):has-text('Flash'):not(:has-text('[Lower Priority]'))"` — and all six cases came back as expected: the four offered tiers SELECT, a tier Flow does not offer REFUSES, and a deliberately ambiguous selector REFUSES rather than resolving `.first`. Selection happens before submit, so the whole matrix is free. The transport's own refusal diagnostic read the live menu back as `Omni 1.1 Flash / Veo 3.1 - Lite / Fast / Quality`, independently corroborating the fixture. Four items are recorded as NOT verified rather than omitted: the rename *direction* [the `Omni Flash` baseline is a different account, locale and date], an actual `Omni ... [Lower Priority]` entry [Flow has never offered one], a full credit-spending generation on omni-flash, and #539's absence question, which stays open.) · previous: [LIVE_VERIFICATION_v0.62.0](LIVE_VERIFICATION_v0.62.0.md) (**#595 `auto` ≡ `classic` for images, verified 2026-08-28 on profile `ci-probe` — an account Flow had moved to the agentic cohort the day before — at ZERO Veo credits.** With no flags and no env vars the run logged `ui_driver.ui_mode.attempt_exit_agent` → `ui_driver.bound mode=classic ui_mode=classic` and generated a real 768x1376 JPEG (exit 0); the day before, the identical command on the same account bound `auto`→`agentic` and failed. The same log independently closed **#183**: `mode_switch_trigger` and `image_mode_tab`, the selectors it reported as unfindable, both matched. #591 was proven against the real 500-row catalog — **0** occurrences of the string `"None"`, 31 proper JSON `null`s, over a catalog holding 119 NULL-bearing rows. #592 shows exactly one `client.account_locale_cached` per command. Three items are recorded as NOT verified rather than omitted: the exit-28 abort on a *pinned* agentic account, the #597 batch inter-prompt guard, and any fresh announcement modal — the last two because all three accounts have already acked the current changelog, so no modal can be raised until Google ships the next one.) · previous: [LIVE_VERIFICATION_v0.61.0](LIVE_VERIFICATION_v0.61.0.md) (**#539 video-model refusal + #586 image-model refusal and server-side attribution, verified 2026-08-26/27 on profile `denon82`, ONE Veo generation total** — the video fix was proven by a **zero-credit A/B against the stashed pre-fix source running on live Flow**: the old code returned SELECTED for `veo-lite-lp`, a model Flow does not offer to this account, and for a deliberately ambiguous selector matching 3 entries; the new code refuses both with exit 18 naming what Flow offered. Model selection happens before submit, so refusals cost nothing and the A/B was free. The happy path still generates: `--model omni-flash` → exit 0, a real 2.2 MB `ftypisom` mp4, catalog recording `omni_flash`. Two items are recorded as NOT verified rather than omitted: three of #584's four navigation-settle sites were never exercised [no bearer refresh occurred in these runs], and #582's canary self-re-exec has its first real exercise tonight. Also falsified: #539's recorded note that the video picker uses a different trigger — the two constants are byte-identical strings, and the repeated empty menu captures were the capture's own fault.) · previous: [LIVE_VERIFICATION_v0.60.0](LIVE_VERIFICATION_v0.60.0.md)
|
|
161
|
+
**What was actually live-verified for the latest release?** → latest: [LIVE_VERIFICATION_v0.70.0](LIVE_VERIFICATION_v0.70.0.md) (**reference-to-video on the migrated `flow.google.com` host, verified 2026-09-06 on profile `denon82`.** Three r2v runs bound their references every time; the decisive one is semantic rather than structural — two hand-drawn reference images went in and the clip came back carrying the same marker strokes, face and paper texture, which is what separates "Flow bound the reference" from "Flow accepted and ignored it". A four-beat, two-character piece was then produced end to end and joined with the concat filter: 19.000s, 1280x576, `clip_qa` **ok**, A/V **+0.000s**, both actors recognisable across every cut from one face plate plus the canon repeated verbatim. Also verified as exit-code corrections on the real CLI: `-o <existing directory>` now exits **2 in 0.8s** instead of exit 1 after ~2 min **and a billed, orphaned clip**; `character create` on a moved account exits **36 immediately** instead of a bare `RuntimeError` exit 1 after a 20s wait. Four items recorded as NOT verified rather than omitted: #692's original failure could not be reproduced [the reporter's own re-run was on a build without the fix, so it shows the failure is intermittent, not that the fix works]; Flow CHARACTER entities were never exercised because `character create` cannot run on any account available here; `image`/`scene`/`movie`/`extend` all exit 36 on the migrated host and no unmoved account exists here; and the sign-in-interstitial fidelity question from #699 has no bundle evidence either way.) · previous: [LIVE_VERIFICATION_v0.68.0](LIVE_VERIFICATION_v0.68.0.md) (`gflow update` self-upgrading a real `uv tool` and a real `pipx` install from their own running `gflow.exe` to the PyPI release, Windows 11, zero credits — see its own row below) · previous: [LIVE_VERIFICATION_v0.67.0](LIVE_VERIFICATION_v0.67.0.md) (the migrated `flow.google.com` driver — see its own row below) · previous: [LIVE_VERIFICATION_v0.64.0](LIVE_VERIFICATION_v0.64.0.md) (**#626 `--model omni-flash --end-frame` — first+last interpolation on Omni 1.1 Flash, verified 2026-09-02.** The guard this release removes was evidence-gated, so it was retired on evidence: a route-aborted submit capture on **two distinct Google accounts** (`ffroliva`, `denon82`) fired `video:batchAsyncGenerateVideoStartAndEndImage` with `startImage` AND `endImage` non-null at **zero credits**, ruling out a single-account artifact. The decisive layer is semantic, not structural: the paid 4s generation's **last frame IS the supplied end image** and its first frame is the start image — two visibly different subjects — which is the only check that distinguishes "Flow bound the end frame" from "Flow accepted and ignored it", and which layers 1–4 would pass either way. Render: 4.01s / 720×1280 / h264+aac / 2.4 MB, `MEDIA_GENERATION_STATUS_SUCCESSFUL`. The static capability table is **deleted**, not corrected — it went stale silently once and would again; a post-submit route check (`_assert_i2v_route`) now fails a run whose end frame Flow dropped back to the `StartImage` route, catching a rollback on any account without anyone re-reading a support page. One item is recorded as NOT verified rather than omitted: `--duration 10` + end frame is **submit-verified only** (`duration_set seconds=10` on the correct route with both images bound), because the status poll returned HTTP 401 mid-run and a retry 401'd at `project.create` before submitting — [#561](https://github.com/ffroliva/gflow-cli/issues/561), pre-existing, so verification was stopped rather than spending further credits on an environmental fault.) · previous: [LIVE_VERIFICATION_v0.63.0](LIVE_VERIFICATION_v0.63.0.md) (**`gflow video extend` — continuing a clip past Flow's 8s ceiling, verified 2026-09-01 on profile `ffroliva`, 20 Veo credits.** The decisive observation is that segment 2's `source_media_id` **is** segment 1's `media_id` (`0c9364f3…` seeded from `b9458021…`, then `648f9291…` seeded from `0c9364f3…`) — tail-only chaining, which no mock can establish; had it re-seeded from the source, the output would have been two divergent continuations of the same moment instead of one continuous shot. `extend_model_resolved` logged `candidate_count=99` against `SERVICE_TIER_INTERMEDIATE`, proving the key came from the live capability listing rather than a constant, and plan cost matched actual spend (`20 credits total, balance 875` → `Extended — 2/2 segment(s), 20 credits`). Render: 23.02s / 1280×720 / 24fps / h264+aac. **The run found a defect the offline suite is structurally incapable of seeing:** an extend segment carries **7.000000s** of content, not the 8 Flow advertises and bills, so server-side concat pads every internal seam with a frozen frame and digital silence (15s at −75.1 dB against −29 neighbours, reproduced on a second independent render) — filed in KNOWN_ISSUES with the three questions that must be answered before any clamp, and the reason `--extend N` on t2v/i2v was deliberately NOT shipped. Seven items are recorded as NOT verified rather than omitted: portrait `9:16`, `--aspect` against a mismatched source, chains longer than 2 segments, `--resume-from` against a live partial scene, the insufficient-credits refusal, a live Ctrl+C, and `OperationKind.EXTEND` rows.) · previous: [LIVE_VERIFICATION_v0.62.1](LIVE_VERIFICATION_v0.62.1.md) (**#604 `--model omni-flash` selects again after Flow's `Omni Flash` → `Omni 1.1 Flash` rename, verified 2026-08-30 on profile `ffroliva` at ZERO Veo credits.** The production `_select_video_model` was driven against the real picker: the shipped selector resolves verbatim — `model_selected model=omni_flash via="[role='menuitem']:has-text('Omni'):has-text('Flash'):not(:has-text('[Lower Priority]'))"` — and all six cases came back as expected: the four offered tiers SELECT, a tier Flow does not offer REFUSES, and a deliberately ambiguous selector REFUSES rather than resolving `.first`. Selection happens before submit, so the whole matrix is free. The transport's own refusal diagnostic read the live menu back as `Omni 1.1 Flash / Veo 3.1 - Lite / Fast / Quality`, independently corroborating the fixture. Four items are recorded as NOT verified rather than omitted: the rename *direction* [the `Omni Flash` baseline is a different account, locale and date], an actual `Omni ... [Lower Priority]` entry [Flow has never offered one], a full credit-spending generation on omni-flash, and #539's absence question, which stays open.) · previous: [LIVE_VERIFICATION_v0.62.0](LIVE_VERIFICATION_v0.62.0.md) (**#595 `auto` ≡ `classic` for images, verified 2026-08-28 on profile `ci-probe` — an account Flow had moved to the agentic cohort the day before — at ZERO Veo credits.** With no flags and no env vars the run logged `ui_driver.ui_mode.attempt_exit_agent` → `ui_driver.bound mode=classic ui_mode=classic` and generated a real 768x1376 JPEG (exit 0); the day before, the identical command on the same account bound `auto`→`agentic` and failed. The same log independently closed **#183**: `mode_switch_trigger` and `image_mode_tab`, the selectors it reported as unfindable, both matched. #591 was proven against the real 500-row catalog — **0** occurrences of the string `"None"`, 31 proper JSON `null`s, over a catalog holding 119 NULL-bearing rows. #592 shows exactly one `client.account_locale_cached` per command. Three items are recorded as NOT verified rather than omitted: the exit-28 abort on a *pinned* agentic account, the #597 batch inter-prompt guard, and any fresh announcement modal — the last two because all three accounts have already acked the current changelog, so no modal can be raised until Google ships the next one.) · previous: [LIVE_VERIFICATION_v0.61.0](LIVE_VERIFICATION_v0.61.0.md) (**#539 video-model refusal + #586 image-model refusal and server-side attribution, verified 2026-08-26/27 on profile `denon82`, ONE Veo generation total** — the video fix was proven by a **zero-credit A/B against the stashed pre-fix source running on live Flow**: the old code returned SELECTED for `veo-lite-lp`, a model Flow does not offer to this account, and for a deliberately ambiguous selector matching 3 entries; the new code refuses both with exit 18 naming what Flow offered. Model selection happens before submit, so refusals cost nothing and the A/B was free. The happy path still generates: `--model omni-flash` → exit 0, a real 2.2 MB `ftypisom` mp4, catalog recording `omni_flash`. Two items are recorded as NOT verified rather than omitted: three of #584's four navigation-settle sites were never exercised [no bearer refresh occurred in these runs], and #582's canary self-re-exec has its first real exercise tonight. Also falsified: #539's recorded note that the video picker uses a different trigger — the two constants are byte-identical strings, and the repeated empty menu captures were the capture's own fault.) · previous: [LIVE_VERIFICATION_v0.60.0](LIVE_VERIFICATION_v0.60.0.md)
|
|
162
162
|
**"Was the playwright upper bound raised, and on what evidence?"** → [LIVE_VERIFICATION_playwright_1.61](LIVE_VERIFICATION_playwright_1.61.md) (**`>=1.59.0,<1.60.0` → `>=1.61.0,<1.62.0` verified 2026-08-05, 1 Imagen + 1 Veo credit** — the 2026-08-03 regression that motivated the bound does NOT reproduce on 1.61.0: a live `i2v` drove the full chain with `image_uploaded status=200` → `frame_attached` → `generate_captured status=200` with `startImage` parsed, where **1.62.0 hung silently at exactly that upload step**; live `i2i` local-ref attach passed outright [96.7s]. **1.62.0 stays excluded** — never root-caused. Also found, A/B-proven pre-existing on BOTH 1.59.0 and 1.61.0: Flow dropped the duration-tab UI, so **`--duration` is currently broken for i2v** — `UiSelectorDriftError` fires correctly [refusing rather than silently accepting Flow's default, #288] but the selector needs re-deriving; that is why the i2v proof was driven via the CLI without `--duration`, and Flow's own server-side `PUBLIC_ERROR_VIDEO_GENERATION_TIMED_OUT` means no finished mp4 is claimed).
|
|
163
163
|
**"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)).
|
|
164
164
|
**"What was live-verified for v0.66.1?"** → [LIVE_VERIFICATION_v0.66.1](LIVE_VERIFICATION_v0.66.1.md) — **the two migrated-origin fixes, verified 2026-09-03 on profile `ffroliva` at ZERO credits, on BOTH sides of what was then read as a flapping rollout** (superseded 2026-09-04: the handoff is a one-way per-account flag and exit 36 is non-retryable since). On a real `flow.google.com` load `get_ui_driver` raised `FlowHostMigratedError` in **0 ms** (was ~36 s: ~8 s detect window + ~24 s crop cascade + 4 s URL settle), exit 36, `retryable: true` (then; `false` since 2026-09-04), `ui_driver.migrated_host_bail` logged; `await_url_settled` returned `null` in **0 ms** (measured 4018 ms before); and the locale was recovered as `en` from `html lang=en-GB` where the URL gave `null`. The no-regression half is the stronger evidence: minutes later the same command landed on the OLD host and completed **exit 0** with a real 768x1376 JPEG in 42.2 s, proving the host guard is scoped and does not short-circuit the working path. Three items recorded as NOT verified rather than omitted: driving the migrated frontend (still impossible, #639 stays open), the pt-BR recovery live (measured `html lang=pt` on `denon82` but exercised live only on `en-GB`), and the `en-GB`→`en` region reduction against a locale where region is load-bearing (`zh-Hans`/`zh-Hant`) — only two locales observed.
|