gflow-cli 0.68.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.68.0 → gflow_cli-0.70.0}/.codex-plugin/plugin.json +1 -1
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.env.template +2 -1
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.github/PULL_REQUEST_TEMPLATE.md +1 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.gitignore +9 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/AGENTS.md +128 -15
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/CHANGELOG.md +297 -1
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/CONTRIBUTING.md +65 -3
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/KNOWN_ISSUES.md +37 -8
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/PKG-INFO +5 -2
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/README.md +4 -1
- {gflow_cli-0.68.0/website → gflow_cli-0.70.0}/docs/ARCHITECTURE.md +1 -1
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/CONFIGURATION.md +2 -2
- {gflow_cli-0.68.0/website → gflow_cli-0.70.0}/docs/DEVELOPMENT.md +3 -1
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/INDEX.md +6 -5
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.68.0.md +37 -2
- gflow_cli-0.70.0/docs/LIVE_VERIFICATION_v0.69.0.md +203 -0
- gflow_cli-0.70.0/docs/LIVE_VERIFICATION_v0.70.0.md +143 -0
- {gflow_cli-0.68.0/website → gflow_cli-0.70.0}/docs/MCP.md +15 -2
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/PROJECT_STATUS.md +98 -1
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/USAGE.md +61 -4
- {gflow_cli-0.68.0/website → gflow_cli-0.70.0}/docs/USER_GUIDE.md +20 -8
- gflow_cli-0.70.0/docs/superpowers/memory/e2e-evidence-is-a-contributor-deliverable.md +49 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/flow-capabilities-are-cohort-dependent.md +15 -2
- gflow_cli-0.70.0/docs/superpowers/memory/flow-recon-must-run-on-denon82-ffroliva-migrated.md +84 -0
- gflow_cli-0.70.0/docs/superpowers/memory/migrated-host-driver-wire-lessons.md +150 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/release-back-merge-gap-recovery.md +21 -1
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/video-model-capability-matrix.md +46 -5
- 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-frames-attach.md +61 -0
- gflow_cli-0.70.0/docs/superpowers/spikes/2026-09-05-migrated-model-menu-lower-priority.md +145 -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.68.0 → gflow_cli-0.70.0}/llms.txt +6 -2
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/pyproject.toml +3 -1
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/autopilot/pr_triage_autopilot.py +48 -16
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/autopilot/run_sandboxed_review.sh +17 -1
- {gflow_cli-0.68.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_model_menu.py +198 -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.68.0 → gflow_cli-0.70.0}/scripts/dev/incident_bundle_quality.py +10 -1
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/skillopt/README.md +25 -8
- gflow_cli-0.70.0/scripts/dev/skillopt/harness.py +410 -0
- 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_frames_attach.py +567 -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.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_video_tab_dom.py +1 -1
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/skills/README.md +1 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/skills/gflow-cli/SKILL.md +6 -2
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/skills/issue-assessment/SKILL.md +24 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/skills/live-verify/SKILL.md +8 -2
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/skills/pr-council-review/SKILL.md +12 -1
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/skills/release/SKILL.md +75 -6
- gflow_cli-0.70.0/skills/spike/SKILL.md +114 -0
- gflow_cli-0.70.0/skills/video-production/SKILL.md +244 -0
- gflow_cli-0.70.0/skills/video-production/clip_qa.py +321 -0
- gflow_cli-0.70.0/skills/video-production/composition.md +171 -0
- gflow_cli-0.70.0/skills/video-production/consistency.md +167 -0
- gflow_cli-0.70.0/skills/video-production/failure-modes.md +76 -0
- gflow_cli-0.70.0/skills/video-production/tasks.json +498 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/__init__.py +1 -1
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/api/client.py +301 -36
- gflow_cli-0.70.0/src/gflow_cli/api/credits.py +116 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/api/dto.py +47 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/api/routes.py +5 -0
- gflow_cli-0.70.0/src/gflow_cli/api/transports/migrated_composer.py +1420 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/api/transports/ui_automation.py +273 -75
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/auth/real_chrome.py +17 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/auth/verification.py +32 -18
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/cli.py +2 -0
- gflow_cli-0.70.0/src/gflow_cli/cli_credits.py +86 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/cli_image.py +2 -2
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/cli_video.py +3 -3
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/config.py +3 -2
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/data/recorder.py +15 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/errors.py +2 -1
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/mcp/tools.py +225 -6
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/services/character_create.py +55 -0
- gflow_cli-0.70.0/src/gflow_cli/services/credits.py +111 -0
- gflow_cli-0.70.0/tests/api/test_character_readback_fallback.py +254 -0
- {gflow_cli-0.68.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.70.0/tests/api/test_credits.py +51 -0
- gflow_cli-0.70.0/tests/api/test_credits_http.py +194 -0
- {gflow_cli-0.68.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.70.0/tests/api/transports/test_migrated_composer.py +1696 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/transports/test_migrated_dispatch.py +111 -2
- gflow_cli-0.70.0/tests/api/transports/test_migrated_r2v.py +300 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/transports/test_ui_character_editor.py +52 -120
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/auth/strategies/test_strategies.py +73 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/autopilot/test_pr_triage_autopilot.py +86 -2
- gflow_cli-0.70.0/tests/cli/test_cli_credits.py +116 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/cli/test_cli_video.py +35 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/data/test_find_incomplete_character.py +26 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/e2e/conftest.py +37 -1
- {gflow_cli-0.68.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_e2e.py +31 -0
- gflow_cli-0.70.0/tests/e2e/test_credits_mcp_e2e.py +104 -0
- gflow_cli-0.70.0/tests/e2e/test_migrated_host_e2e.py +294 -0
- gflow_cli-0.70.0/tests/e2e/test_migrated_i2v_e2e.py +201 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/e2e/test_sidebar_recovery_e2e.py +3 -0
- gflow_cli-0.70.0/tests/features/credits.feature +16 -0
- gflow_cli-0.70.0/tests/features/migrated_i2v.feature +42 -0
- gflow_cli-0.70.0/tests/features/test_credits_steps.py +79 -0
- gflow_cli-0.70.0/tests/features/test_migrated_i2v_steps.py +274 -0
- gflow_cli-0.70.0/tests/mcp/test_character_tools.py +158 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/mcp/test_cli_parity.py +127 -5
- gflow_cli-0.70.0/tests/mcp/test_credits_tool.py +43 -0
- gflow_cli-0.70.0/tests/mcp/test_migrated_i2v_parity.py +58 -0
- gflow_cli-0.70.0/tests/mcp/test_reference_entity_round_trip.py +120 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/mcp/test_tools_helpers.py +16 -2
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/mcp/test_tools_wired.py +33 -3
- {gflow_cli-0.68.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.68.0 → gflow_cli-0.70.0}/tests/scripts/test_incident_bundle_quality.py +57 -1
- gflow_cli-0.70.0/tests/scripts/test_skillopt_scoring.py +144 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/services/test_character_create_saga.py +93 -0
- gflow_cli-0.70.0/tests/services/test_credits.py +183 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_documentation_gate.py +24 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/uv.lock +1 -1
- {gflow_cli-0.68.0 → gflow_cli-0.70.0/website}/docs/ARCHITECTURE.md +1 -1
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/website/docs/CONFIGURATION.md +2 -2
- {gflow_cli-0.68.0 → gflow_cli-0.70.0/website}/docs/DEVELOPMENT.md +3 -1
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/website/docs/KNOWN_ISSUES.md +37 -8
- {gflow_cli-0.68.0 → gflow_cli-0.70.0/website}/docs/MCP.md +15 -2
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/website/docs/USAGE.md +61 -4
- {gflow_cli-0.68.0 → gflow_cli-0.70.0/website}/docs/USER_GUIDE.md +20 -8
- gflow_cli-0.68.0/docs/superpowers/memory/flow-recon-must-run-on-denon82-ffroliva-migrated.md +0 -58
- gflow_cli-0.68.0/docs/superpowers/memory/migrated-host-driver-wire-lessons.md +0 -55
- gflow_cli-0.68.0/scripts/dev/skillopt/harness.py +0 -365
- gflow_cli-0.68.0/src/gflow_cli/api/transports/migrated_composer.py +0 -596
- gflow_cli-0.68.0/tests/api/transports/test_migrated_composer.py +0 -802
- gflow_cli-0.68.0/tests/e2e/test_migrated_host_e2e.py +0 -146
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.agents/plugins/marketplace.json +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.claude/README.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.claude/commands/gflow/active.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.claude/commands/gflow/branch-review.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.claude/commands/gflow/changelog.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.claude/commands/gflow/check.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.claude/commands/gflow/doc-review.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.claude/commands/gflow/issue-assessment.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.claude/commands/gflow/issue-resolve.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.claude/commands/gflow/known-issues.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.claude/commands/gflow/live-verify.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.claude/commands/gflow/llm-council.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.claude/commands/gflow/next.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.claude/commands/gflow/plan.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.claude/commands/gflow/pr-council-review.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.claude/commands/gflow/predict.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.claude/commands/gflow/release.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.claude/commands/gflow/scenario.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.claude/commands/gflow/sonar.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.claude/commands/gflow/status.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.gitattributes +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.github/CODEOWNERS +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.github/FUNDING.yml +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.github/copilot-instructions.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.github/dependabot.yml +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.github/workflows/ci.yml +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.github/workflows/deps-watch.yml +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.github/workflows/external-pr-triage.yml +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.github/workflows/governance-advisory.yml +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.github/workflows/governance-benchmark.yml +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.github/workflows/labels.yml +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.github/workflows/main-base-guard.yml +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.github/workflows/pages.yml +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.github/workflows/release.yml +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.github/workflows/scorecard.yml +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.github/workflows/selector-probe.yml +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.github/workflows/star-history-watch.yml +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.gitleaks.toml +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.pre-commit-config.yaml +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/.secrets.baseline +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/CLAUDE.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/CONFIGURATION.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/DISCLAIMER.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/LICENSE +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/PLAN.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/RELEASE.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/ROADMAP.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/conftest.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/deploy/PR-TRIAGE-AUTOPILOT-OPS.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/deploy/logrotate-pr-triage +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docker-compose.yml +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/ACCOUNT_SAFETY.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/AGENT_GUIDE.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/AGENT_UI_E2E.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/AGENT_UI_RECON.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/ASSET_TAGGING_RECON.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/CHARACTER.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/CHARACTER_RECON.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/DATA_LAYER.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/DEMOS.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/E2E_TESTING.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/GITHUB.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/INSTRUCTIONS.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_playwright_1.61.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_reference_entity_guard.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.21.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.22.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.23.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.24.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.25.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.26.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.27.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.27.1.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.28.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.29.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.30.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.31.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.32.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.32.1.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.33.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.34.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.35.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.36.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.37.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.38.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.38.1.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.39.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.40.0-production-readiness.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.40.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.41.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.42.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.43.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.44.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.45.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.46.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.46.1.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.47.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.48.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.49.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.50.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.51.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.52.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.54.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.55.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.56.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.57.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.57.1.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.58.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.59.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.60.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.61.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.62.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.62.1.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.63.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.64.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.65.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.66.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.66.1.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.66.2.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.66.3.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.67.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/MEDIA_LIBRARY.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/MOVIE.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/PROMPT_EXPANSION.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/REFERENCE_STRATEGIES.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/SECURITY.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/TOOLS.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/assets/demo-split-pf.gif +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/assets/example-run.gif +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/assets/examples.webp +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/medium_tutorial.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/schemas/movie-handoff.schema.json +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/sonar-cleanup-tracker.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/README.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/agents-md-vs-llms-txt.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/background-e2e-pytest-pattern.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/bdd-stubs-mirror-runtime-signatures.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/credit-free-route-abort-verification.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/data-layer-overview.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/data-layer-test-pollution-trap.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/doc-examples-are-untested-fixtures.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/draft-pr-merge-trap.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/exit-code-16-data-store.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/flow-credits-videos-only.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/flow-locale-leak-icon-ligatures.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/force-color-breaks-cli-tests.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/full-test-suite-ooms.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/git-add-all-sweeps-scratch-files.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/image-video-mode-switch-symmetry.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/mcp-is-first-class-across-skill-chain.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/memory-is-working-dir-keyed.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/on-started-callback-recorder-safety.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/playwright-click-no-downstream-event-signature.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/pr-council-review-stale-tree-reads.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/pr-hygiene-revert-and-multi-commit.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/pr-must-verify-on-affected-surface.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/prose-conflicts-hide-in-disjoint-files.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/pypi-readme-staleness-fix.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/pypi-rejected-filename-reusable.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/readme-hybrid-router-pattern.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/real-browser-auth-mandatory.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/release-signing.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/release-spec-plan-memory-consolidation.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/rest-transports-drop-ui-fields.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/ruff-format-scope-is-src-tests.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/sonarcloud-hotspot-review-workflow.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/sonarcloud-new-code-gotchas.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/sonarcloud-pr-issues-scope-s7497.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/sonarcloud-setup.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/stale-test-discovery.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/structlog-cache-logger-off-for-tests.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/ui-selector-drift-error-exit-23.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/verification-ledger-5-layer.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/wheel-build-sanity-gate.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/windows-dev-quirks.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/memory/windows-running-launcher-blocks-uv-upgrade.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-07-08-pr-triage-autopilot/PLAN.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-07-09-camoufox-adoption/PLAN.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-07-14-storyboarding-and-visual-curation/PLAN.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-07-18-asset-tagging/PLAN.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-07-19-live-verify/PLAN.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-07-19-production-readiness-browser-lifecycle.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-07-19-production-readiness-driver-cdp-verification.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-07-19-production-readiness-public-truth.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-07-19-production-readiness-queue-safety.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-07-26-character-prompt-polishing/PLAN.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-07-26-project-name-management/PLAN.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-07-26-self-documenting-errors/PLAN.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-07-27-overlay-banner-dismissal/PLAN.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/PLAN.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/SCENARIO.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-04-mcp-tasks/PLAN.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-04-output-hardening/PLAN.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-05-issue-317-intra-batch-references/PLAN.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-05-issue-317-intra-batch-references/SCENARIO.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-05-issue-402-entity-provenance/PLAN.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-05-issue-402-entity-provenance/SCENARIO.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-05-issue-451-duration-tab-drift/PLAN.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-05-issue-451-duration-tab-drift/SCENARIO.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-06-driver-delay-jittering/PLAN.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-06-driver-delay-jittering/SCENARIO.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-06-overlay-changelog-watermark/PLAN.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-06-overlay-changelog-watermark/SCENARIO.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-06-ui-mode-policy/PLAN.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-06-ui-mode-policy/SCENARIO.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-14-video-ui-mode-policy/PLAN.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-14-video-ui-mode-policy/SCENARIO.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-21-selector-registry.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-08-25-workflow-hardening-gaps.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/plans/2026-09-01-video-extend/PLAN.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/research/2026-06-27-tool-abstraction-evaluation.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/specs/2026-06-29-issue-assessment-workflow-design.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/specs/2026-07-04-pr-triage-autopilot-design.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/specs/2026-07-18-asset-tagging-design.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/specs/2026-07-19-live-verify-design.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/specs/2026-07-19-production-readiness-hardening-design.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/specs/2026-08-21-selector-registry-design.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/specs/2026-08-26-model-attribution-provenance.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/specs/2026-08-26-model-cost-quota-catalog.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/specs/2026-08-27-changelog-modal-precondition-design.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/spikes/2026-07-09-camoufox-waf-403.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/spikes/2026-07-12-ui-cohort-backend-config.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/spikes/2026-07-17-production-readiness-assessment.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/spikes/2026-08-01-mcp-2026-07-28-spec-impact.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/spikes/2026-08-14-video-model-capability-matrix.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/spikes/2026-08-15-picker-tile-alt-text.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/spikes/2026-08-31-veo-extend-route-recon.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/spikes/2026-09-04-migrated-host-handoff-mechanism.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/docs/superpowers/spikes/2026-09-05-migrated-host-wire-protocol.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/eval/pr_triage_eval.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/eval/pr_triage_fixtures.json +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/examples/README.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/examples/batch_from_config.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/examples/multi_prompt_t2i.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/examples/sample_config.json +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/examples/sample_prompts.txt +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/examples/single_image_t2i.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/examples/workflow_chain.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/index.html +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/samples/README.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/samples/captured/01_upload_image.json +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/samples/captured/04_archive_workflow.json +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/samples/captured/05_createProject.json +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/samples/captured/06_batchGenerateImages.json +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/samples/captured/12_create_scene.json +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/samples/captured/14_get_scene_workflows.json +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/autopilot/Dockerfile.triage +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/autopilot/entrypoint.sh +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/autopilot/package-lock.json +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/autopilot/package.json +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/autopilot/pr_triage_gate.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/canary/register_task.ps1 +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/canary/run_canary.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/ci/check_council_memory.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/ci/check_doc_links.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/ci/check_materiality.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/ci/check_repo_hygiene.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/ci/check_test_count.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/ci/check_website_docs_pii.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/ci/generate_website_docs.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/debug_editor.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/debug_gen_settings.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/debug_settings.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/_recording_client.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/_spike_common.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/active_plan.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/capture_frames_mode_trigger_ligature.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/capture_locale_invariants.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/capture_lower_priority_model_cost.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/capture_project_listing.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/capture_r2v_ingredient_lifecycle.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/capture_sidebar_state_dom.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/capture_video_model_capability_matrix.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/character_create_spike.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/character_create_spike_v2.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/dump_character_selectors.js +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/live_verify_mcp_tasks.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/live_verify_policy_400_v060.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/live_verify_video_model_select.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/make_project.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/materiality_backtest.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/measure_html_lang_settle.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/measure_locale_probe.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/measure_migrated_host_flip.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/patch_character.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/skillopt/tasks.json +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/sonar-local-scan.sh +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/sonar-pre-push-gate.sh +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_changelog_capture.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_char_editor_dom.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_char_gen_capture.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_character_prompt_format.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_extend_model_recon.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_extend_ourstack_verify.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_extend_route_capture.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_extend_submit_capture.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_extend_ui_recon.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_incident_live.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_issue313_agent_mode_controls.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_issue314_picker_filename_search.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_issue404_count_tabs_recon.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_locale_poison.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_migrated_duration_by_model.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_migrated_editor_dom_inventory.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_migrated_host_trigger.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_migrated_submit_capture.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_migration_flag_bootstrap.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_mode_roundtrip.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_mode_switch_agentic_to_classic.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_model_inventory.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_movie_picker_select.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_movie_voice_list.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_omni_flash_i2v_ui_recon.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_patch_entity.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_patchright.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/spike_trpc_origin_referer_401.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/verify_lang_settle_fix.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/verify_language_agnostic.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/verify_locale_navigation_race.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/dev/verify_model_attribution.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/diag/README.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/diag/capture_flow_traffic.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/diag/diag_aisandbox_bearer.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/diag/memory_profile.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/diag/recaptcha_mint.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/diag/spike_387_openai_compat.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/e2e/capture_agent_toggle.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/probe/run_probe.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/probe/spike_auth_matrix.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/record_demo.ps1 +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/smoke_image.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/smoke_video_editor.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/smoke_worker_style.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/spike_waf_camoufox.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/scripts/verify_chrome_auth_viability.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/skills/changelog/SKILL.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/skills/check/SKILL.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/skills/doc-review/SKILL.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/skills/issue-resolve/SKILL.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/skills/known-issues/SKILL.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/skills/llm-council/SKILL.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/skills/plan/SKILL.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/skills/predict/SKILL.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/skills/scenario/SKILL.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/skills/sonar/SKILL.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/skills/status/SKILL.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/sonar-project.properties +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/__main__.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/_cli_helpers.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/api/__init__.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/api/_engine.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/api/_retry.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/api/character.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/api/extend_chain.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/api/image.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/api/image_upscale.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/api/recaptcha.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/api/scene.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/api/transports/__init__.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/api/transports/_common.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/api/transports/base.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/api/transports/batchexecute.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/api/transports/drivers/agentic.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/api/transports/drivers/base.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/api/transports/drivers/classic.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/api/transports/drivers/factory.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/api/transports/mode_control.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/api/transports/ui_automation_video.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/api/video.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/api/video_extend.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/auth/__init__.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/auth/base.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/auth/cookies.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/auth/factory.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/auth/strategies.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/browser_manager.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/chain.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/chain_manifest.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/cli_character.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/cli_data.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/cli_doctor.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/cli_instructions.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/cli_models.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/cli_movie.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/cli_project.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/cli_run.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/cli_scene.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/cli_tools.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/cli_update.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/composition.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/data/__init__.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/data/chain_repo.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/data/migrations/0007_queue.sql +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/data/migrations/0008_add_operation_expanded_prompt.sql +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/data/migrations/0009_queue_claims.sql +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/data/models.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/data/queries.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/data/redaction.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/data/repository.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/data/store.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/diagnostics.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/exceptions.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/file_integrity.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/flow_selectors/__init__.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/flow_selectors/grading.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/flow_selectors/model.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/flow_selectors/registry.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/image_batch.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/json_output.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/mcp/__init__.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/mcp/prompts.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/mcp/resources.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/mcp/server.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/mcp/setup.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/mcp/tasks_extension.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/media.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/movie_manifest.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/observability.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/paths.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/profile_lease.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/profile_store.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/redaction.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/services/__init__.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/services/catalog_sync.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/services/doctor.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/services/mentions.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/storage.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/tools/__init__.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/tools/banned.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/tools/builtin/__init__.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/tools/builtin/creative-director.toml +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/tools/builtin/reverse-engineer.toml +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/tools/builtin/storyboard.toml +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/tools/expander.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/tools/invocation.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/tools/loader.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/tools/registry.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/tools/runtime.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/tools/spec.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/ui/app.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/ui/server.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/update_check.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/winsec.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/worker/codec.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/worker/daemon.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/src/gflow_cli/worker/queue.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tasks/lessons.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/test_assets/sample_batch.json +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/test_assets/sample_batch.tsv +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/test_assets/sample_batch_invalid.tsv +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/__init__.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/__init__.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/fixtures/character_gen_response.json +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/fixtures/patch_entity_response.json +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/fixtures/project_initial_data_extend_models.json +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_aisandbox_auth_error.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_bearer_redaction.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_character.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_client.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_client_character.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_client_delete_characters.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_client_errors.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_client_extend.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_client_generate_character.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_client_incidents.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_client_launch_kwargs.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_client_locale_cache.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_client_patch_entity.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_client_scene.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_client_upscale.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_concurrency.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_dto.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_engine.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_extend_chain.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_image.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_image_dto.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_image_upscale.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_post_json_aisandbox_auth.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_recaptcha.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_retry.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_routes.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_routes_character.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_routes_locale.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_routes_scene.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_sapisidhash_helper.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_scene_models.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_video.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_video_extend.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_video_request.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/test_video_status_poll.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/transports/__init__.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/transports/conftest.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/transports/drivers/test_agentic.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/transports/drivers/test_classic.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/transports/drivers/test_factory.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/transports/test_agentic_cohort_detection.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/transports/test_base.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/transports/test_batchexecute.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/transports/test_bearer.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/transports/test_common.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/transports/test_factory.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/transports/test_fingerprint.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/transports/test_locale_navigation.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/transports/test_migrated_host_gate.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/transports/test_migrated_route.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/transports/test_mode_control.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/transports/test_model_selection_loud.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/transports/test_navigation_settled.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/transports/test_overlay_precondition.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/transports/test_policy_400.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/transports/test_sapisidhash.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/transports/test_selector_symmetry.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/transports/test_transport_timeout.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/transports/test_ui_automation.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/transports/test_ui_automation_batch.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/transports/test_ui_automation_video.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/api/transports/test_video_model_selection_loud.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/auth/strategies/test_factory.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/auth/test_cookies.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/auth/test_real_chrome.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/auth/test_verification.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/auth/test_windows_acl.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/cli/__init__.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/cli/test_auth_status.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/cli/test_cli_auth_list.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/cli/test_cli_character.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/cli/test_cli_character_create.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/cli/test_cli_data.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/cli/test_cli_data_errors.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/cli/test_cli_data_errors_retention.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/cli/test_cli_data_sync.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/cli/test_cli_doctor.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/cli/test_cli_image.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/cli/test_cli_image_selector_drift.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/cli/test_cli_image_upscale.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/cli/test_cli_image_uuid_ref_enrichment.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/cli/test_cli_instructions.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/cli/test_cli_models.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/cli/test_cli_movie.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/cli/test_cli_run.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/cli/test_cli_scene.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/cli/test_cli_tools.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/cli/test_cli_video_chain.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/cli/test_cli_video_extend.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/cli/test_error_handling.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/cli/test_failure_funnel.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/cli/test_helpers.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/cli/test_incident_output.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/cli/test_movie_manifest.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/cli/test_movie_manifest_style_variants.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/cli/test_predictable_output.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/cli/test_run_with_handlers_interrupt.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/cli/test_settings_validation.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/composition/test_character.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/composition/test_compose_prompt.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/composition/test_handoff.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/composition/test_style_variants.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/composition/test_style_variants_e2e.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/conftest.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/data/__init__.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/data/test_chain_repo.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/data/test_failure_recording.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/data/test_models.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/data/test_null_columns_stay_null.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/data/test_packaging.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/data/test_recorder.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/data/test_recorder_character.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/data/test_redaction.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/data/test_repository.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/data/test_scene_persistence.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/data/test_settings_and_errors.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/data/test_store.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/data/test_store_migrations.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/dev/test_recording_client.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/e2e/__init__.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/e2e/test_agentic_count_enforcement_e2e.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/e2e/test_asset_tagging_e2e.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/e2e/test_cancellation_e2e.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/e2e/test_chain_e2e.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/e2e/test_classic_count_setter_e2e.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/e2e/test_crash_recovery_e2e.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/e2e/test_daemon_e2e.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/e2e/test_data_layer_e2e.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/e2e/test_data_sync_names_e2e.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/e2e/test_entity_provenance_e2e.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/e2e/test_entity_smuggling_e2e.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/e2e/test_i2v_flags_e2e.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/e2e/test_image_batch_e2e.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/e2e/test_image_uuid_ref_e2e.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/e2e/test_incident_quality_e2e.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/e2e/test_json_output_e2e.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/e2e/test_live_agentic_instructions.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/e2e/test_project_naming_e2e.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/e2e/test_refresh_on_miss_e2e.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/e2e/test_scene_compose_live.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/e2e/test_tools_e2e.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/e2e/test_transports_e2e.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/e2e/test_video_r2v_uuid_name_e2e.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/__init__.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/asset_tagging.feature +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/auth.feature +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/auth_login.feature +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/character_create.feature +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/character_read.feature +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/conftest.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/duration_tab_drift.feature +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/entity_provenance.feature +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/image.feature +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/image_batch_references.feature +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/image_upscale.feature +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/incident_diagnostics.feature +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/instructions.feature +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/latched_locale_recovery.feature +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/locale_picker_include.feature +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/mcp_tasks.feature +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/media_picker_tiers.feature +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/migrated_driver.feature +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/migrated_host_gate.feature +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/output_hardening.feature +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/test_asset_tagging_steps.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/test_auth_login_steps.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/test_auth_steps.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/test_character_create_steps.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/test_character_read_steps.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/test_image_steps.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/test_image_upscale_steps.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/test_incident_diagnostics_steps.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/test_instructions_steps.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/test_locale_picker_include_steps.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/test_mcp_tasks_steps.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/test_media_picker_tiers_steps.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/test_migrated_driver_steps.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/test_migrated_host_gate_steps.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/test_output_hardening_steps.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/test_step_collision_guard.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/test_video_agent_ui_steps.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/test_video_chain_steps.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/video_agent_ui.feature +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/features/video_chain.feature +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/fixtures/__init__.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/fixtures/changelog_modal_page.html +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/fixtures/doctor_env.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/fixtures/flow_model_inventory.json +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/fixtures/flow_project_listing_media.json +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/fixtures/listing_payload.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/fixtures/seeded_catalog.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/flow_selectors/__init__.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/flow_selectors/test_grading.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/flow_selectors/test_model.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/flow_selectors/test_model_governance.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/flow_selectors/test_registry.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/flow_selectors/test_report.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/image_batch/__init__.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/image_batch/test_image_manifest.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/image_batch/test_jitter_config.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/image_batch/test_observability_events.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/integration/__init__.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/integration/conftest.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/integration/constants.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/integration/test_expander_gateway.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/integration/test_storage_gcs.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/integration/test_storage_s3.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/mcp/__init__.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/mcp/conftest.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/mcp/test_auth_status_tool.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/mcp/test_error_funnel.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/mcp/test_http_transport.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/mcp/test_known_issues_resource.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/mcp/test_no_spend.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/mcp/test_rate_limit_envelope.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/mcp/test_resources.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/mcp/test_server.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/mcp/test_setup.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/mcp/test_stdio_transport.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/mcp/test_tasks_extension.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/mcp/test_tools_instructions.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/scripts/test_canary_classify.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/scripts/test_canary_reexec.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/scripts/test_capture_video_model_capability_matrix.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/scripts/test_check_council_memory.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/scripts/test_check_materiality.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/scripts/test_check_repo_hygiene.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/scripts/test_check_test_count.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/scripts/test_check_website_docs_pii.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/scripts/test_codex_plugin.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/scripts/test_generate_website_docs.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/scripts/test_materiality_backtest.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/scripts/test_workflow_hardening.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/services/__init__.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/services/test_catalog_sync.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/services/test_character_create_redaction.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/services/test_doctor.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/services/test_media_attribution.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/services/test_mentions_observability.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/services/test_mentions_parse.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/services/test_mentions_resolve.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/services/test_resolve_and_apply.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/smoke/__init__.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/smoke/test_profile_account_smoke.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/smoke/test_real_flow.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_auth.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_browser_manager.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_chain.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_chain_manifest.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_cli_data.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_cli_project.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_cli_update.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_config.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_conftest_isolation.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_data_queries.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_diagnostics_bundle.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_diagnostics_events.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_diagnostics_journal.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_diagnostics_recorder.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_diagnostics_retention.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_diagnostics_sanitize.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_duration_tab_drift.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_entity_provenance.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_errors.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_errors_classification.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_image_batch_references.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_incident_generation_requests.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_json_output.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_marker_registry.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_media.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_observability.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_overlay_banner_dismissal.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_paths.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_playwright_pin.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_profile_lease.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_profile_lease_subprocess.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_profile_store.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_profile_store_locale.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_project_list_urls.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_self_documenting_errors.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_smoke.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/test_update_check.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/tools/__init__.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/tools/test_banned.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/tools/test_expander.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/tools/test_invocation.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/tools/test_loader.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/tools/test_registry.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/tools/test_runtime.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/tools/test_spec.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/ui/test_app.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/worker/test_codec.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/worker/test_daemon.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/worker/test_mcp_daemon_race.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/worker/test_queue.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/worker/test_queue_multiprocess.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/tests/worker/test_queue_reconciliation.py +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/website/docs/ACCOUNT_SAFETY.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/website/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/website/docs/CHARACTER.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/website/docs/DATA_LAYER.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/website/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/website/docs/E2E_TESTING.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/website/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/website/docs/INSTRUCTIONS.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/website/docs/MEDIA_LIBRARY.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/website/docs/MOVIE.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/website/docs/PROMPT_EXPANSION.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/website/docs/SECURITY.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/website/docs/TOOLS.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/website/docs/agents.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/website/docs/index.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/website/docs/installation.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/website/docs/onboarding-mockup.html +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/website/docs/onboarding.md +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/website/docs/stylesheets/extra.css +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/website/mkdocs.yml +0 -0
- {gflow_cli-0.68.0 → gflow_cli-0.70.0}/website/requirements.in +0 -0
- {gflow_cli-0.68.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.
|
|
@@ -183,7 +183,8 @@
|
|
|
183
183
|
# GFLOW_CLI_UI_MODE=auto
|
|
184
184
|
|
|
185
185
|
# Which Flow frontend gflow drives (#639). auto (default): flow.google.com is the
|
|
186
|
-
# default host for what it can serve today (video t2v
|
|
186
|
+
# default host for what it can serve today (video t2v, and video i2v from a local
|
|
187
|
+
# --initial-frame, with --project) on every
|
|
187
188
|
# account; requests it cannot serve yet keep the labs driver on an unmoved
|
|
188
189
|
# account, and a moved account gets the migrated composer for everything ported.
|
|
189
190
|
# flow.google.com: force the migrated composer for everything.
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
- [ ] `scenario` + `plan` written under `docs/superpowers/plans/<date>-<slug>/` and linked here
|
|
13
13
|
- [ ] `check` green, including the step 1b CLI↔MCP mirror sweep
|
|
14
14
|
- [ ] MCP twin added, or a reasoned exemption in `tests/mcp/test_cli_parity.py`
|
|
15
|
+
- [ ] **E2E evidence provided** — name the `tests/e2e/` test you ran and paste its result, or point at the new test this PR adds. If you could not run it, say why here:
|
|
15
16
|
- [ ] Live-verified against real Flow where a generation path changed; what could NOT be verified is stated below
|
|
16
17
|
- [ ] Council review run (`pr-council-review` / `branch-review`) and must-fix items addressed
|
|
17
18
|
|
|
@@ -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 |
|
|
@@ -41,10 +42,10 @@ by construction, so Codex / Cursor / Aider / `agy` read exactly what Claude Code
|
|
|
41
42
|
|
|
42
43
|
## Project at a glance
|
|
43
44
|
|
|
44
|
-
- Unofficial Python CLI for [Google Flow](https://labs.google/fx/tools/flow) — drives Veo (image-to-video, text-to-video) and Imagen (text-to-image) generations from the terminal by reverse-engineering Flow's private REST API at `aisandbox-pa.googleapis.com` — and, for accounts Google has moved to `flow.google.com`, that frontend's `batchexecute` wire (text-to-video today; `GFLOW_CLI_FLOW_HOST`).
|
|
45
|
+
- Unofficial Python CLI for [Google Flow](https://labs.google/fx/tools/flow) — drives Veo (image-to-video, text-to-video) and Imagen (text-to-image) generations from the terminal by reverse-engineering Flow's private REST API at `aisandbox-pa.googleapis.com` — and, for accounts Google has moved to `flow.google.com`, that frontend's `batchexecute` wire (text-to-video, and image-to-video from a local `--initial-frame`, today; `GFLOW_CLI_FLOW_HOST`).
|
|
45
46
|
- Python 3.11+ · `uv`-managed · `hatchling` builds · Playwright Chromium transport · `pyright` strict · `ruff` · `pytest`.
|
|
46
|
-
- Single-package modular monolith. Top-level modules under `src/gflow_cli/`: `api/`, `auth/`, `data/`, `mcp/`, `services/`, `tools/`, `ui/`, `worker/`, `browser_manager.py`, `cli.py`, `_cli_helpers.py`, `diagnostics.py`, `json_output.py`, `media.py`, `profile_lease.py`, `redaction.py`, `storage.py`, `winsec.py`, `cli_project.py`, `cli_character.py`, `cli_data.py`, `cli_image.py`, `cli_instructions.py`, `cli_models.py`, `cli_movie.py`, `cli_run.py`, `cli_scene.py`, `cli_tools.py`, `cli_video.py`, `chain.py`, `chain_manifest.py`, `cli_doctor.py`, `cli_update.py`, `composition.py`, `config.py`, `errors.py`, `file_integrity.py`, `flow_selectors/`, `update_check.py`, `exceptions.py`, `image_batch.py`, `movie_manifest.py`, `observability.py`, `paths.py`, `profile_store.py`.
|
|
47
|
-
- Command surface: `gflow auth`, `gflow image` (t2i/i2i/batch/upload/upscale), `gflow video` (t2v/i2v/r2v/chain/extend — `extend` continues an existing clip past Flow's 8s ceiling, server-seeded from the source so the join is continuous; no `batch` subcommand; the nonfunctional stub was removed, loop `gflow video t2v`/`i2v` from the shell for multi-clip runs), `gflow character` (create/list/show/rm/voices — reusable project-scoped Flow Character entities), `gflow scene` (create/show — Add Clip / Scenes, with `create --output` for credit-free server-side extended video), `gflow instructions` (persistent Agent-Mode brief cards — add/list/enable/disable/rm/apply/toggle-mode, credits-free, `--project` required), `gflow movie` (run/template — multi-scene manifest pipeline), `gflow tools` (list/show/run — prompt-rewriting tools, also `--tool` on generation commands), `gflow data` (catalog queries), `gflow doctor` (read-only pre-flight diagnostic, exit 33 = findings present), `gflow update` (self-update through the installer that put it here — uv tool / pipx / pip; `--check` only reports; source installs refused, exit 11; deliberately no MCP twin), `gflow project`, `gflow models`, `gflow run`, `gflow mcp` (run/setup — stdio MCP server), and `gflow serve` (Streamable HTTP at `/mcp`; `--transport sse` is deprecated).
|
|
47
|
+
- Single-package modular monolith. Top-level modules under `src/gflow_cli/`: `api/`, `auth/`, `data/`, `mcp/`, `services/`, `tools/`, `ui/`, `worker/`, `browser_manager.py`, `cli.py`, `_cli_helpers.py`, `diagnostics.py`, `json_output.py`, `media.py`, `profile_lease.py`, `redaction.py`, `storage.py`, `winsec.py`, `cli_project.py`, `cli_character.py`, `cli_credits.py`, `cli_data.py`, `cli_image.py`, `cli_instructions.py`, `cli_models.py`, `cli_movie.py`, `cli_run.py`, `cli_scene.py`, `cli_tools.py`, `cli_video.py`, `chain.py`, `chain_manifest.py`, `cli_doctor.py`, `cli_update.py`, `composition.py`, `config.py`, `errors.py`, `file_integrity.py`, `flow_selectors/`, `update_check.py`, `exceptions.py`, `image_batch.py`, `movie_manifest.py`, `observability.py`, `paths.py`, `profile_store.py`.
|
|
48
|
+
- Command surface: `gflow auth`, `gflow credits` (user/list — read-only Veo balance), `gflow image` (t2i/i2i/batch/upload/upscale), `gflow video` (t2v/i2v/r2v/chain/extend — `extend` continues an existing clip past Flow's 8s ceiling, server-seeded from the source so the join is continuous; no `batch` subcommand; the nonfunctional stub was removed, loop `gflow video t2v`/`i2v` from the shell for multi-clip runs), `gflow character` (create/list/show/rm/voices — reusable project-scoped Flow Character entities), `gflow scene` (create/show — Add Clip / Scenes, with `create --output` for credit-free server-side extended video), `gflow instructions` (persistent Agent-Mode brief cards — add/list/enable/disable/rm/apply/toggle-mode, credits-free, `--project` required), `gflow movie` (run/template — multi-scene manifest pipeline), `gflow tools` (list/show/run — prompt-rewriting tools, also `--tool` on generation commands), `gflow data` (catalog queries), `gflow doctor` (read-only pre-flight diagnostic, exit 33 = findings present), `gflow update` (self-update through the installer that put it here — uv tool / pipx / pip; `--check` only reports; source installs refused, exit 11; deliberately no MCP twin), `gflow project`, `gflow models`, `gflow run`, `gflow mcp` (run/setup — stdio MCP server), and `gflow serve` (Streamable HTTP at `/mcp`; `--transport sse` is deprecated).
|
|
48
49
|
- Works with any Google account that has Flow access. All generations bill against the user's own Google account.
|
|
49
50
|
|
|
50
51
|
## Headed-browser dependency (architectural reality)
|
|
@@ -95,8 +96,10 @@ the five other mirror axes), which no command here can check and no CI gate can
|
|
|
95
96
|
- Use `pytest -m "not live and not e2e and not smoke"` locally; full suite OOMs on small dev machines. Scope to changed dirs; trust CI for the full sweep.
|
|
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
|
-
- **A PR is not done until its SonarCloud gate is green (zero new issues).** The
|
|
99
|
-
-
|
|
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).
|
|
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.
|
|
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.
|
|
102
|
+
- Live tests (`@pytest.mark.live`) opt in via `GFLOW_LIVE=1`.
|
|
100
103
|
|
|
101
104
|
## Code style
|
|
102
105
|
|
|
@@ -107,10 +110,11 @@ the five other mirror axes), which no command here can check and no CI gate can
|
|
|
107
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.
|
|
108
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`.
|
|
109
112
|
|
|
110
|
-
**That
|
|
111
|
-
|
|
112
|
-
restriction the CLI no longer has
|
|
113
|
-
|
|
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:
|
|
114
118
|
|
|
115
119
|
| Phase | Skill | Its MCP duty |
|
|
116
120
|
|---|---|---|
|
|
@@ -140,10 +144,86 @@ the five other mirror axes), which no command here can check and no CI gate can
|
|
|
140
144
|
|
|
141
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.
|
|
142
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
|
+
|
|
143
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.)
|
|
144
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.
|
|
145
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.
|
|
146
|
-
- **
|
|
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.
|
|
147
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`.
|
|
148
228
|
|
|
149
229
|
## Standard Workflow Sequence
|
|
@@ -152,6 +232,7 @@ All AI agents and harnesses working on `gflow-cli` follow this standard 10-phase
|
|
|
152
232
|
|
|
153
233
|
| Phase | Skill / Command | Purpose | Output Artifact |
|
|
154
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` |
|
|
155
236
|
| 1. Triage | `/gflow:issue-assessment <N>` | Read-only issue analysis & root cause hypothesis | `issue_assessment_<N>.md` |
|
|
156
237
|
| 2. Pre-Implementation | `/gflow:predict <proposal>` | Adversarial audit (D14 YAGNI, security, risks) | GO / CAUTION / STOP verdict |
|
|
157
238
|
| 3. BDD Scaffolding | `/gflow:scenario <feature>` | Edge-case explorer & BDD Gherkin spec | `Scenario:` blocks & test scaffold |
|
|
@@ -159,7 +240,7 @@ All AI agents and harnesses working on `gflow-cli` follow this standard 10-phase
|
|
|
159
240
|
| 5. Council Review | `/gflow:pr-council-review` / `llm-council` | Multi-dimensional audit across 6 core dimensions | Consensus verdict report |
|
|
160
241
|
| 6. Task Execution | `/gflow:status` | Track unchecked tasks during TDD execution | Next unchecked task |
|
|
161
242
|
| 7. Pre-Commit Quality | `/gflow:check` | The Impeccable Routine (hygiene, ruff, pyright, pytest) | All green local checks |
|
|
162
|
-
| 8. Live Verification | `/gflow:live-verify` | 5-layer proof against real Flow transport | `docs/LIVE_VERIFICATION_vX.Y.Z.md` |
|
|
243
|
+
| 8. E2E + Live Verification | `pytest -m e2e` → `/gflow:live-verify` | The e2e suite against a live profile, then the 5-layer proof against real Flow transport | Pasted e2e result + `docs/LIVE_VERIFICATION_vX.Y.Z.md` |
|
|
163
244
|
| 9. PR & Issue Close | `/gflow:issue-resolve <N>` | PR, SonarCloud 0-issue gate, merge to develop | Closed GitHub issue |
|
|
164
245
|
| 10. Release Pipeline | `/gflow:release` | Version bump, signed tag (`git tag -s`), PyPI publish. **Internally gates on `/gflow:changelog` → `/gflow:check` → `/gflow:live-verify` → `/gflow:doc-review`; a failure at any of them is a STOP, not a warning.** | Shipped release & back-merge |
|
|
165
246
|
|
|
@@ -174,9 +255,9 @@ Every AI agent executing any phase of this pipeline MUST proactively state the c
|
|
|
174
255
|
| Phase 3: BDD Scaffolding | `Scenario:` blocks & test scaffold | ➔ Phase 4: Implementation Plan (`/gflow:plan <feature>`) |
|
|
175
256
|
| Phase 4: Implementation Plan | `PLAN.md` created & approved | ➔ Phase 6: Task Execution (`/gflow:status`) |
|
|
176
257
|
| Phase 6: Task Execution | All plan tasks checked | ➔ Phase 7: Pre-Commit Quality (`/gflow:check`) |
|
|
177
|
-
| Phase 7: Pre-Commit Quality | All
|
|
178
|
-
| Phase 5: Council Review | Consensus 🟢 GREEN | ➔ Phase 8: Live Verification (`/gflow:live-verify`) or Phase 9 (`/gflow:issue-resolve <N>`) |
|
|
179
|
-
| Phase 8: Live Verification | `LIVE_VERIFICATION_vX.Y.Z.md` | ➔ Phase 9: Issue Resolve & PR (`/gflow:issue-resolve <N>`) |
|
|
258
|
+
| Phase 7: Pre-Commit Quality | All quality gates green | ➔ Phase 5: Council Review (`/gflow:branch-review` or `/gflow:pr-council-review`) |
|
|
259
|
+
| Phase 5: Council Review | Consensus 🟢 GREEN | ➔ Phase 8: E2E + Live Verification (`pytest -m e2e`, then `/gflow:live-verify`) or Phase 9 (`/gflow:issue-resolve <N>`) |
|
|
260
|
+
| Phase 8: E2E + Live Verification | e2e result + `LIVE_VERIFICATION_vX.Y.Z.md` | ➔ Phase 9: Issue Resolve & PR (`/gflow:issue-resolve <N>`) |
|
|
180
261
|
| Phase 9: Issue Resolve & PR | PR open & SonarCloud 0-issue gate green | ➔ Phase 10: Release Pipeline (`/gflow:release`) |
|
|
181
262
|
| Phase 10: Release Pipeline | Signed tag & PyPI published | ➔ Done (Release shipped & back-merged) |
|
|
182
263
|
|
|
@@ -187,6 +268,7 @@ The `skills/` directory ships installable agent skill docs in plain Markdown wit
|
|
|
187
268
|
| Skill | Path | When to load |
|
|
188
269
|
|---|---|---|
|
|
189
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 |
|
|
190
272
|
| `predict` | [`skills/predict/SKILL.md`](skills/predict/SKILL.md) | Pre-implementation adversarial analysis before any high-stakes change |
|
|
191
273
|
| `scenario` | [`skills/scenario/SKILL.md`](skills/scenario/SKILL.md) | Edge-case explorer after a predict GO/CAUTION |
|
|
192
274
|
| `plan` | [`skills/plan/SKILL.md`](skills/plan/SKILL.md) | Create a structured task-by-task implementation plan for a feature |
|
|
@@ -198,6 +280,7 @@ The `skills/` directory ships installable agent skill docs in plain Markdown wit
|
|
|
198
280
|
| `check` | [`skills/check/SKILL.md`](skills/check/SKILL.md) | Quality gates (lint/format/types/tests) before every commit |
|
|
199
281
|
| `changelog` | [`skills/changelog/SKILL.md`](skills/changelog/SKILL.md) | Unreleased changes + last tagged version |
|
|
200
282
|
| `known-issues` | [`skills/known-issues/SKILL.md`](skills/known-issues/SKILL.md) | Open/mitigated known issues — before auth/reCAPTCHA work |
|
|
283
|
+
| `video-production` | [`skills/video-production/SKILL.md`](skills/video-production/SKILL.md) | User wants a finished multi-shot or dialogue video (consistent actors, room, several angles, spoken lines), or clips came back with a film border, a drifting room, rushed dialogue, a person-policy refusal or exit 36 |
|
|
201
284
|
| `sonar` | [`skills/sonar/SKILL.md`](skills/sonar/SKILL.md) | Drive the SonarCloud quality gate to zero for a PR/branch |
|
|
202
285
|
| `live-verify` | [`skills/live-verify/SKILL.md`](skills/live-verify/SKILL.md) | Pre-flight state check at start of work; live-verification against real Flow before claiming done |
|
|
203
286
|
| `doc-review` | [`skills/doc-review/SKILL.md`](skills/doc-review/SKILL.md) | Council-driven documentation audit before a release |
|
|
@@ -226,7 +309,36 @@ extension does not currently load plugins, so IDE-only users should include the
|
|
|
226
309
|
**Claude Code:** the `/gflow:` slash commands in `.claude/commands/gflow/` are auto-discovered when the project is open — no extra setup needed. To register a skill globally, copy the command file to `~/.claude/commands/`.
|
|
227
310
|
**Custom agents:** fetch `skills/gflow-cli/SKILL.md` into your knowledge base before answering gflow questions.
|
|
228
311
|
|
|
229
|
-
The SkillOpt harness at `scripts/dev/skillopt/` measures how accurately each skill guides an agent
|
|
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).
|
|
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.
|
|
230
342
|
|
|
231
343
|
## Where to look next
|
|
232
344
|
|
|
@@ -237,6 +349,7 @@ The SkillOpt harness at `scripts/dev/skillopt/` measures how accurately each ski
|
|
|
237
349
|
- **Known issues** (read before touching auth / reCAPTCHA) → [KNOWN_ISSUES.md](KNOWN_ISSUES.md)
|
|
238
350
|
- **Current task** → `/gflow:status` · **Create a feature plan** → `/gflow:plan <feature>` · **Full roadmap** → [PLAN.md](PLAN.md)
|
|
239
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)
|
|
240
353
|
|
|
241
354
|
## Claude Code-specific notes
|
|
242
355
|
|
|
@@ -7,6 +7,300 @@ 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
|
+
|
|
172
|
+
## [0.69.0] — 2026-09-06
|
|
173
|
+
|
|
174
|
+
### Added
|
|
175
|
+
|
|
176
|
+
- **Read-only Flow balance inspection:** `gflow credits user`, `gflow credits list`, and the
|
|
177
|
+
matching `gflow_get_credits` MCP tool report current
|
|
178
|
+
balances and account tiers from saved profiles. Multi-profile inspection preserves partial
|
|
179
|
+
successes and emits stable JSON for automation. Saved cookies + ordinary HTTP are the primary
|
|
180
|
+
path, with browser-backed retrieval only as a fallback; cookies remain scoped to `labs.google`,
|
|
181
|
+
and no copied bearer token or browser API key is stored. The reported balance funds Veo video;
|
|
182
|
+
image generation uses separate per-model daily quotas.
|
|
183
|
+
|
|
184
|
+
- **Image-to-video from a local start frame on the migrated `flow.google.com` host**
|
|
185
|
+
([#639](https://github.com/ffroliva/gflow-cli/issues/639), slice 1). `gflow video i2v
|
|
186
|
+
--initial-frame <local file> --project <id>` now runs on the new host — on a moved
|
|
187
|
+
account, and by default (`GFLOW_CLI_FLOW_HOST=auto`) on an unmoved one too. The port
|
|
188
|
+
is UI-driven and observed, never replayed: the composer selects the Frames submode,
|
|
189
|
+
uploads the file through the editor's own toolbar Upload entry and reads the media id
|
|
190
|
+
off the app's `maseQ` reply, finds the upload in the Start-frame picker under its file
|
|
191
|
+
name (the picker exposes no media id in its DOM), and only then submits. **An unbound
|
|
192
|
+
chip is refused before the click** — exit 23, zero credits — because an empty Frames
|
|
193
|
+
submit silently goes out as text-to-video (the labs #125 shape). The app's submit
|
|
194
|
+
*request* is then inspected as it leaves: a body without that media id, or carrying a
|
|
195
|
+
`_t2v_` model key, fails the run with `WireFormatError` (exit 7) naming what Flow was
|
|
196
|
+
actually asked to make — after the fact, since the request is already on the wire.
|
|
197
|
+
An upload Flow refuses is exit 27 on route `batchexecute:maseQ`; a file the picker
|
|
198
|
+
never lists after three searches is exit 32. For i2v the submit rpc is `eb1hJf` (t2v
|
|
199
|
+
stays `YhhmEf`), and an i2v request with no `--model` binds the veo-lite default here
|
|
200
|
+
exactly as it has always done on labs (#125). Not ported in this slice and named in
|
|
201
|
+
the exit-36 detail: `--end-frame`, a frame given by media UUID or `@Name`, and r2v.
|
|
202
|
+
A "Get started" modal over a fresh migrated editor is now dismissed before the run.
|
|
203
|
+
Recon: `docs/superpowers/spikes/2026-09-05-migrated-frames-attach.md`.
|
|
204
|
+
|
|
205
|
+
- **`--model veo-lite-lp` is drivable on the migrated `flow.google.com` host.** It was
|
|
206
|
+
the one tier the migrated model map omitted, so an account Google has already moved
|
|
207
|
+
could not select it at all: `_select_model` refused with `ConfigurationError` (exit
|
|
208
|
+
11, "not available on the migrated Flow host") before ever reading the live menu.
|
|
209
|
+
The omission was not an oversight — the tier's full menu label is unknown, because
|
|
210
|
+
Flow has never rendered the entry on any account gflow has driven (the 2026-08-14
|
|
211
|
+
two-account capability matrix, #650's duration capture and v0.61.0's refusal A/B all
|
|
212
|
+
recorded a picker MISS), and the migrated map is keyed by label. It is now matched
|
|
213
|
+
the way the labs driver has matched it since #539 — by the `[Lower Priority]` tag
|
|
214
|
+
alone. **The entry has now been captured** (2026-09-05, a migrated account): the menu
|
|
215
|
+
renders `Veo 3.1 - Lite [Lower Priority]`, and that account's picker was already
|
|
216
|
+
*defaulted* to it — presumably why every earlier capture missed the entry, having been
|
|
217
|
+
taken on accounts Flow was not throttling. Matching stays on the tag rather than the
|
|
218
|
+
newly-known label: one account's rendering, and a tag Flow appends to whichever tier it
|
|
219
|
+
throttles survives that tier changing. Verified live at $0 by driving `_select_model`
|
|
220
|
+
for all five tiers and reading the picker back after each switch — including the
|
|
221
|
+
lower-priority tier reached through the menu — plus one real 8 s generation on it.
|
|
222
|
+
Routing is deliberately unchanged: `veo-lite-lp` still does not make
|
|
223
|
+
`migrated_can_serve` pull an **unmoved** account onto the new host, since Flow appears
|
|
224
|
+
not to offer the tier to accounts it is not throttling.
|
|
225
|
+
Capture: `docs/superpowers/spikes/2026-09-05-migrated-model-menu-lower-priority.md`.
|
|
226
|
+
|
|
227
|
+
### Changed
|
|
228
|
+
|
|
229
|
+
- **`video-production` skill, epoch 1: the reference cap now routes instead of only
|
|
230
|
+
forbidding.** A scored rollout picked `veo-quality` for a two-reference shot while
|
|
231
|
+
correctly reciting that its reference cap is 0 — the skill stated the prohibition in two
|
|
232
|
+
places and named the substitute in none, and the remedy lived only in the reference files
|
|
233
|
+
an agent may never load. Step 4 now carries the rule: the reference count picks the model
|
|
234
|
+
before quality does, `omni-flash` for a single generation needing references and quality
|
|
235
|
+
together, a `veo-lite` variant when 3 refs is enough — and `video chain` is called out as
|
|
236
|
+
the exception, since it refuses `omni-flash` outright. Validated by a controlled A/B on
|
|
237
|
+
one model with the document as the only variable: 0.00 → 0.90.
|
|
238
|
+
|
|
239
|
+
- **The SkillOpt harness uses the project's own `GFLOW_CLI_LLM_*` settings.** It carried a
|
|
240
|
+
second, parallel provider configuration — its own `--provider anthropic|openai` switch,
|
|
241
|
+
its own key env vars and its own `--base-url` — while `Settings.llm_base_url` /
|
|
242
|
+
`llm_api_key` / `llm_model` already drove the prompt tools. Any OpenAI-compatible endpoint
|
|
243
|
+
works through the one setting (OpenAI, OpenRouter, LiteLLM, freellmapi, a local gateway,
|
|
244
|
+
Google's compat endpoint); both LLM SDK dependencies are gone, and the harness now
|
|
245
|
+
inherits the URL validation its own flag used to bypass. It requires `uv run`. A scoring
|
|
246
|
+
bug is fixed with it: float accumulation made `1.0 - 0.3 + 0.1` fall short of the `>= 0.8`
|
|
247
|
+
PASS threshold, so a task at exactly the threshold graded PARTIAL while printing "0.80".
|
|
248
|
+
|
|
249
|
+
### Fixed
|
|
250
|
+
|
|
251
|
+
- **Moved accounts: `image t2i` / `i2i` (and `upscale`, `extend`) now exit 36, not a
|
|
252
|
+
bare `RecaptchaError` exit 1 (#673).** The labs client mints the reCAPTCHA token on
|
|
253
|
+
the pool's bootstrap page *before* the UI transport runs, so none of the transport's
|
|
254
|
+
migration guards could fire; on a moved account that page is the `flow.google.com`
|
|
255
|
+
project grid after the client-side handoff, which loads no
|
|
256
|
+
`recaptcha/enterprise.js`, so site-key discovery raised `RecaptchaError` — a
|
|
257
|
+
`RuntimeError` unmapped in `EXIT_CODE_MAP`: exit 1 "unexpected", with a remediation
|
|
258
|
+
about headless Chrome. `_mint_recaptcha_token` now runs the same one-line
|
|
259
|
+
`raise_if_migrated` guard the transport uses, so the distinct, non-retryable exit
|
|
260
|
+
36 and its migration remediation come back within seconds, before any submit.
|
|
261
|
+
Reproduced and re-verified on a moved maintainer account at zero credits (exit 1 →
|
|
262
|
+
exit 36); the new
|
|
263
|
+
`tests/e2e/test_migrated_host_e2e.py::test_e2e_image_on_a_moved_account_exits_36_not_recaptcha`
|
|
264
|
+
(`e2e_auth`, $0) is the regression.
|
|
265
|
+
|
|
266
|
+
- **The migrated model picker could bind a tier the user did not ask for.** The port
|
|
267
|
+
matched menu entries by case-insensitive *substring* and took `.first`, so on an
|
|
268
|
+
account whose menu carries a lower-priority sibling, `--model veo-lite` also matched
|
|
269
|
+
`Veo 3.1 - Lite [Lower Priority]` and Flow billed whichever Angular happened to list
|
|
270
|
+
first. The same substring ran against the picker button's read-back, where a pane
|
|
271
|
+
already showing the lower-priority tier satisfied `startswith("Veo 3.1 - Lite")` and
|
|
272
|
+
returned "already selected" without opening the menu — silently keeping the wrong
|
|
273
|
+
tier. This is the ambiguity #539 fixed on labs.google (whose selectors carry
|
|
274
|
+
`:not(:has-text('[Lower Priority]'))`) and which this port had dropped. Ordinary
|
|
275
|
+
tiers now exclude the tag on both paths, and a matcher hitting more than one live
|
|
276
|
+
entry **refuses** (exit 11) naming every candidate rather than guessing which one
|
|
277
|
+
Flow would bill. Confirmed against the real button text on a throttled account:
|
|
278
|
+
`"Veo 3.1 - Lite [Lower Priority] arrow_drop_down".lower().startswith("veo 3.1 - lite")`
|
|
279
|
+
is `True`, so pre-fix `--model veo-lite` there generated on the throttled tier without
|
|
280
|
+
ever opening the menu.
|
|
281
|
+
|
|
282
|
+
- **Switching `--model` on the migrated host broke the next run** — reported as "run 1
|
|
283
|
+
with a new model dies, run 2 with the same model works, run 3 with another model dies
|
|
284
|
+
again". Picking from the model menu leaves Angular with **two** stacked overlays (the
|
|
285
|
+
settings pane and the menu opened over it) and each Escape dismisses exactly one, so
|
|
286
|
+
`_close_pane`'s single press closed only the menu and left the settings pane covering
|
|
287
|
+
the composer. `send_prompt`'s click then failed actionability and surfaced ~5 s later
|
|
288
|
+
as a bare `TimeoutError` naming `[contenteditable='true']`, pointing nowhere near the
|
|
289
|
+
pane. A repeat run binds the model at the button read-back, never opens the menu and
|
|
290
|
+
never stacks the second overlay — which is exactly why re-running the same model
|
|
291
|
+
worked. Measured at $0: after a switch the composer's bounding box is *identical* for
|
|
292
|
+
12 s (it was never unstable) while `.cdk-overlay-pane:visible` stays at 1; one more
|
|
293
|
+
Escape takes it to 0. `_close_pane` now escapes until no overlay is visible, bounded,
|
|
294
|
+
and raises pre-submit if one will not close rather than leaving the composer click to
|
|
295
|
+
report it. The old read-back did fire `migrated.pane_still_open` — as a warning the run
|
|
296
|
+
ignored; the observation was there and only the consequence was missing.
|
|
297
|
+
|
|
298
|
+
- **A migrated run that short-circuited model selection logged nothing.** `_select_model`
|
|
299
|
+
returning at its button read-back emitted no event, so a field timeline could not tell
|
|
300
|
+
"bound the tier you asked for" from "never touched the picker" — answering that for the
|
|
301
|
+
2026-09-05 run took a separate probe. It now logs `migrated.model_already_selected`
|
|
302
|
+
with the observed button text.
|
|
303
|
+
|
|
10
304
|
## [0.68.0] — 2026-09-05
|
|
11
305
|
|
|
12
306
|
### Added
|
|
@@ -3934,7 +4228,9 @@ shell-script template that branches on these codes.
|
|
|
3934
4228
|
|
|
3935
4229
|
First skeleton. Not functional end-to-end yet.
|
|
3936
4230
|
|
|
3937
|
-
[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
|
|
4233
|
+
[0.69.0]: https://github.com/ffroliva/gflow-cli/compare/v0.68.0...v0.69.0
|
|
3938
4234
|
[0.68.0]: https://github.com/ffroliva/gflow-cli/compare/v0.67.0...v0.68.0
|
|
3939
4235
|
[0.67.0]: https://github.com/ffroliva/gflow-cli/compare/v0.66.3...v0.67.0
|
|
3940
4236
|
[0.66.3]: https://github.com/ffroliva/gflow-cli/compare/v0.66.2...v0.66.3
|