gflow-cli 0.42.0__tar.gz → 0.43.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.42.0 → gflow_cli-0.43.0}/.env.template +10 -1
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/.github/workflows/ci.yml +6 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/AGENTS.md +1 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/CHANGELOG.md +109 -1
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/KNOWN_ISSUES.md +63 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/PKG-INFO +1 -1
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/PLAN.md +1 -1
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/ARCHITECTURE.md +37 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/CONFIGURATION.md +9 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/DEBUGGING.md +91 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/E2E_TESTING.md +14 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/INDEX.md +2 -1
- gflow_cli-0.43.0/docs/LIVE_VERIFICATION_v0.43.0.md +117 -0
- {gflow_cli-0.42.0/website → gflow_cli-0.43.0}/docs/MCP.md +17 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/PROJECT_STATUS.md +13 -1
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/SECURITY.md +28 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/USAGE.md +53 -2
- {gflow_cli-0.42.0/website → gflow_cli-0.43.0}/docs/USER_GUIDE.md +56 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/superpowers/plans/2026-07-18-asset-tagging/PLAN.md +9 -2
- gflow_cli-0.43.0/docs/superpowers/plans/2026-07-22-private-incident-diagnostics/AUDIT.md +116 -0
- gflow_cli-0.43.0/docs/superpowers/plans/2026-07-22-private-incident-diagnostics/PLAN.md +773 -0
- gflow_cli-0.43.0/docs/superpowers/plans/2026-07-22-private-incident-diagnostics/SCENARIO.md +207 -0
- gflow_cli-0.43.0/docs/superpowers/specs/2026-07-22-private-incident-diagnostics-design.md +605 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/llms.txt +2 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/pyproject.toml +1 -1
- gflow_cli-0.43.0/scripts/ci/check_website_docs_pii.py +91 -0
- gflow_cli-0.43.0/scripts/ci/generate_website_docs.py +151 -0
- gflow_cli-0.43.0/scripts/dev/incident_bundle_quality.py +291 -0
- gflow_cli-0.43.0/scripts/dev/spike_incident_live.py +182 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/skills/check/SKILL.md +7 -1
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/skills/doc-review/SKILL.md +73 -2
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/skills/release/SKILL.md +2 -2
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/__init__.py +1 -1
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/_cli_helpers.py +26 -1
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/api/_engine.py +9 -1
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/api/client.py +297 -16
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/api/transports/__init__.py +24 -1
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/api/transports/ui_automation.py +1 -8
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/api/transports/ui_automation_video.py +123 -8
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/config.py +12 -0
- gflow_cli-0.43.0/src/gflow_cli/diagnostics.py +1720 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/errors.py +77 -1
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/image_batch.py +11 -10
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/json_output.py +31 -32
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/mcp/tools.py +10 -3
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/profile_lease.py +101 -8
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/worker/daemon.py +15 -1
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/worker/queue.py +3 -1
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/test_client.py +67 -1
- gflow_cli-0.43.0/tests/api/test_client_incidents.py +381 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/test_client_launch_kwargs.py +15 -8
- gflow_cli-0.43.0/tests/api/transports/test_agentic_cohort_detection.py +192 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/transports/test_evaluate_fetch.py +30 -18
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/transports/test_factory.py +26 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/transports/test_ui_automation.py +44 -26
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/transports/test_ui_automation_image_mode.py +14 -5
- gflow_cli-0.43.0/tests/cli/test_incident_output.py +64 -0
- gflow_cli-0.43.0/tests/e2e/test_incident_quality_e2e.py +144 -0
- gflow_cli-0.43.0/tests/features/incident_diagnostics.feature +43 -0
- gflow_cli-0.43.0/tests/features/test_incident_diagnostics_steps.py +354 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/mcp/test_server.py +49 -0
- gflow_cli-0.43.0/tests/scripts/test_check_website_docs_pii.py +66 -0
- gflow_cli-0.43.0/tests/scripts/test_generate_website_docs.py +70 -0
- gflow_cli-0.43.0/tests/scripts/test_incident_bundle_quality.py +293 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/services/test_character_gen_no_direct_post.py +17 -11
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/test_config.py +20 -0
- gflow_cli-0.43.0/tests/test_diagnostics_bundle.py +170 -0
- gflow_cli-0.43.0/tests/test_diagnostics_events.py +153 -0
- gflow_cli-0.43.0/tests/test_diagnostics_journal.py +148 -0
- gflow_cli-0.43.0/tests/test_diagnostics_recorder.py +369 -0
- gflow_cli-0.43.0/tests/test_diagnostics_retention.py +253 -0
- gflow_cli-0.43.0/tests/test_diagnostics_sanitize.py +212 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/test_errors.py +29 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/test_json_output.py +67 -1
- gflow_cli-0.43.0/tests/test_profile_lease.py +306 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/test_profile_lease_subprocess.py +13 -2
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/worker/test_daemon.py +33 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/worker/test_queue.py +3 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/uv.lock +1 -1
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/website/docs/ARCHITECTURE.md +37 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/website/docs/AUTHENTICATION.md +7 -7
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/website/docs/CHARACTER.md +25 -14
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/website/docs/CONFIGURATION.md +34 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/website/docs/DATA_LAYER.md +5 -1
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/website/docs/DEBUGGING.md +91 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/website/docs/E2E_TESTING.md +21 -2
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/website/docs/KNOWN_ISSUES.md +124 -23
- {gflow_cli-0.42.0 → gflow_cli-0.43.0/website}/docs/MCP.md +17 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/website/docs/SECURITY.md +44 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/website/docs/USAGE.md +54 -3
- {gflow_cli-0.42.0 → gflow_cli-0.43.0/website}/docs/USER_GUIDE.md +56 -0
- gflow_cli-0.42.0/tests/test_profile_lease.py +0 -148
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/.claude/README.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/.claude/commands/gflow/active.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/.claude/commands/gflow/branch-review.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/.claude/commands/gflow/changelog.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/.claude/commands/gflow/check.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/.claude/commands/gflow/doc-review.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/.claude/commands/gflow/issue-assessment.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/.claude/commands/gflow/issue-resolve.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/.claude/commands/gflow/known-issues.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/.claude/commands/gflow/live-verify.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/.claude/commands/gflow/llm-council.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/.claude/commands/gflow/next.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/.claude/commands/gflow/plan.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/.claude/commands/gflow/pr-council-review.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/.claude/commands/gflow/predict.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/.claude/commands/gflow/release.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/.claude/commands/gflow/scenario.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/.claude/commands/gflow/sonar.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/.claude/commands/gflow/status.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/.gitattributes +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/.github/CODEOWNERS +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/.github/copilot-instructions.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/.github/dependabot.yml +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/.github/workflows/external-pr-triage.yml +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/.github/workflows/governance-advisory.yml +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/.github/workflows/governance-benchmark.yml +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/.github/workflows/main-base-guard.yml +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/.github/workflows/pages.yml +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/.github/workflows/release.yml +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/.gitignore +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/.gitleaks.toml +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/.pre-commit-config.yaml +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/.secrets.baseline +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/CLAUDE.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/CONFIGURATION.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/CONTRIBUTING.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/DISCLAIMER.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/LICENSE +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/README.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/RELEASE.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/ROADMAP.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/conftest.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/deploy/PR-TRIAGE-AUTOPILOT-OPS.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docker-compose.yml +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/AGENT_GUIDE.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/AGENT_UI_E2E.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/AGENT_UI_RECON.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/ASSET_TAGGING_RECON.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/CHARACTER.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/CHARACTER_RECON.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/DATA_LAYER.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/DEMOS.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/GITHUB.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/INSTRUCTIONS.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.21.0.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.22.0.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.23.0.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.24.0.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.25.0.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.26.0.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.27.0.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.27.1.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.28.0.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.29.0.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.30.0.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.31.0.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.32.0.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.32.1.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.33.0.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.34.0.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.35.0.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.36.0.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.37.0.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.38.0.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.38.1.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.39.0.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.40.0-production-readiness.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.40.0.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.41.0.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.42.0.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/MOVIE.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/PROMPT_EXPANSION.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/REFERENCE_STRATEGIES.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/TOOLS.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/assets/demo-split-pf.gif +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/assets/example-run.gif +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/assets/examples.webp +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/medium_tutorial.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/schemas/movie-handoff.schema.json +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/sonar-cleanup-tracker.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/superpowers/plans/2026-07-08-pr-triage-autopilot/PLAN.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/superpowers/plans/2026-07-09-camoufox-adoption/PLAN.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/superpowers/plans/2026-07-14-storyboarding-and-visual-curation/PLAN.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/superpowers/plans/2026-07-19-live-verify/PLAN.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/superpowers/plans/2026-07-19-production-readiness-browser-lifecycle.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/superpowers/plans/2026-07-19-production-readiness-driver-cdp-verification.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/superpowers/plans/2026-07-19-production-readiness-public-truth.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/superpowers/plans/2026-07-19-production-readiness-queue-safety.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/superpowers/research/2026-06-27-tool-abstraction-evaluation.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/superpowers/specs/2026-06-29-issue-assessment-workflow-design.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/superpowers/specs/2026-07-04-pr-triage-autopilot-design.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/superpowers/specs/2026-07-18-asset-tagging-design.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/superpowers/specs/2026-07-19-live-verify-design.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/superpowers/specs/2026-07-19-production-readiness-hardening-design.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/superpowers/spikes/2026-07-09-camoufox-waf-403.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/superpowers/spikes/2026-07-12-ui-cohort-backend-config.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/docs/superpowers/spikes/2026-07-17-production-readiness-assessment.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/eval/pr_triage_eval.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/eval/pr_triage_fixtures.json +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/examples/README.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/examples/batch_from_config.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/examples/multi_prompt_t2i.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/examples/sample_config.json +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/examples/sample_prompts.txt +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/examples/single_image_t2i.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/examples/workflow_chain.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/index.html +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/samples/README.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/samples/captured/01_upload_image.json +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/samples/captured/04_archive_workflow.json +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/samples/captured/05_createProject.json +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/samples/captured/06_batchGenerateImages.json +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/samples/captured/12_create_scene.json +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/samples/captured/14_get_scene_workflows.json +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/autopilot/Dockerfile.triage +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/autopilot/entrypoint.sh +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/autopilot/pr_triage_autopilot.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/autopilot/pr_triage_gate.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/autopilot/run_sandboxed_review.sh +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/ci/check_doc_links.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/ci/check_materiality.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/ci/check_release_artifacts.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/ci/check_repo_hygiene.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/debug_editor.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/debug_gen_settings.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/debug_settings.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/_recording_client.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/_spike_common.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/active_plan.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/capture_locale_invariants.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/character_create_spike.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/character_create_spike_v2.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/dump_character_selectors.js +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/make_project.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/materiality_backtest.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/monitor_pr_38.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/patch_character.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/skillopt/README.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/skillopt/harness.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/skillopt/tasks.json +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/sonar-local-scan.sh +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/sonar-pre-push-gate.sh +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/spike_char_editor_dom.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/spike_char_gen_capture.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/spike_issue313_agent_mode_controls.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/spike_issue314_picker_filename_search.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/spike_mode_roundtrip.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/spike_mode_switch_agentic_to_classic.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/spike_movie_picker_select.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/spike_movie_voice_list.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/spike_patch_entity.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/dev/spike_patchright.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/diag/README.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/diag/capture_flow_traffic.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/diag/memory_profile.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/diag/recaptcha_mint.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/e2e/capture_agent_toggle.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/record_demo.ps1 +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/smoke_image.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/smoke_video_editor.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/smoke_worker_style.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/spike_waf_camoufox.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/scripts/verify_chrome_auth_viability.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/skills/README.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/skills/changelog/SKILL.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/skills/gflow-cli/SKILL.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/skills/issue-assessment/SKILL.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/skills/issue-resolve/SKILL.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/skills/known-issues/SKILL.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/skills/live-verify/SKILL.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/skills/llm-council/SKILL.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/skills/plan/SKILL.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/skills/pr-council-review/SKILL.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/skills/predict/SKILL.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/skills/scenario/SKILL.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/skills/sonar/SKILL.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/skills/status/SKILL.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/sonar-project.properties +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/__main__.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/api/__init__.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/api/_retry.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/api/character.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/api/dto.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/api/image.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/api/image_upscale.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/api/recaptcha.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/api/routes.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/api/scene.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/api/transports/_common.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/api/transports/base.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/api/transports/drivers/agentic.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/api/transports/drivers/base.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/api/transports/drivers/classic.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/api/transports/drivers/factory.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/api/transports/mode_control.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/api/video.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/auth/__init__.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/auth/base.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/auth/cookies.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/auth/factory.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/auth/real_chrome.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/auth/strategies.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/auth/verification.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/browser_manager.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/chain.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/chain_manifest.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/cli.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/cli_character.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/cli_data.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/cli_image.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/cli_instructions.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/cli_models.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/cli_movie.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/cli_run.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/cli_scene.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/cli_tools.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/cli_video.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/composition.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/data/__init__.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/data/chain_repo.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/data/migrations/0007_queue.sql +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/data/migrations/0008_add_operation_expanded_prompt.sql +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/data/migrations/0009_queue_claims.sql +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/data/models.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/data/queries.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/data/recorder.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/data/redaction.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/data/repository.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/data/store.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/exceptions.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/mcp/__init__.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/mcp/prompts.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/mcp/resources.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/mcp/server.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/media.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/movie_manifest.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/observability.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/paths.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/profile_store.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/services/__init__.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/services/character_create.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/services/mentions.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/storage.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/tools/__init__.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/tools/banned.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/tools/builtin/__init__.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/tools/builtin/creative-director.toml +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/tools/builtin/reverse-engineer.toml +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/tools/builtin/storyboard.toml +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/tools/expander.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/tools/invocation.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/tools/loader.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/tools/registry.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/tools/runtime.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/tools/spec.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/ui/app.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/ui/server.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/src/gflow_cli/worker/codec.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tasks/lessons.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/test_assets/sample_batch.json +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/test_assets/sample_batch.tsv +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/test_assets/sample_batch_invalid.tsv +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/__init__.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/__init__.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/fixtures/character_gen_response.json +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/fixtures/patch_entity_response.json +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/test_aisandbox_auth_error.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/test_bearer_redaction.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/test_character.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/test_client_character.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/test_client_delete_characters.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/test_client_generate_character.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/test_client_image.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/test_client_patch_entity.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/test_client_scene.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/test_client_upscale.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/test_concurrency.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/test_dto.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/test_engine.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/test_image.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/test_image_dto.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/test_image_upscale.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/test_post_json_aisandbox_auth.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/test_recaptcha.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/test_retry.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/test_routes.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/test_routes_character.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/test_routes_scene.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/test_sapisidhash_helper.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/test_scene_models.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/test_video.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/test_video_request.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/transports/__init__.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/transports/conftest.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/transports/drivers/test_agentic.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/transports/drivers/test_classic.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/transports/drivers/test_factory.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/transports/drivers/test_ui_mode.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/transports/test_base.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/transports/test_bearer.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/transports/test_common.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/transports/test_fingerprint.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/transports/test_mode_control.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/transports/test_sapisidhash.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/transports/test_selector_symmetry.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/transports/test_transport_timeout.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/transports/test_ui_automation_batch.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/transports/test_ui_automation_video.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/api/transports/test_ui_character_editor.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/auth/strategies/test_factory.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/auth/strategies/test_strategies.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/auth/test_cookies.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/auth/test_real_chrome.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/auth/test_verification.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/autopilot/test_pr_triage_autopilot.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/cli/__init__.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/cli/test_cli_auth_list.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/cli/test_cli_character.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/cli/test_cli_character_create.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/cli/test_cli_data.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/cli/test_cli_data_errors.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/cli/test_cli_image.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/cli/test_cli_image_selector_drift.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/cli/test_cli_image_upscale.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/cli/test_cli_instructions.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/cli/test_cli_models.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/cli/test_cli_movie.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/cli/test_cli_run.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/cli/test_cli_scene.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/cli/test_cli_tools.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/cli/test_cli_video.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/cli/test_cli_video_chain.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/cli/test_error_handling.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/cli/test_failure_funnel.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/cli/test_helpers.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/cli/test_movie_manifest.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/cli/test_movie_manifest_style_variants.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/cli/test_settings_validation.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/composition/test_character.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/composition/test_compose_prompt.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/composition/test_handoff.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/composition/test_style_variants.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/composition/test_style_variants_e2e.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/conftest.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/data/__init__.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/data/test_chain_repo.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/data/test_failure_recording.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/data/test_find_incomplete_character.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/data/test_models.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/data/test_packaging.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/data/test_recorder.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/data/test_recorder_character.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/data/test_redaction.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/data/test_repository.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/data/test_scene_persistence.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/data/test_settings_and_errors.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/data/test_store_migrations.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/dev/test_recording_client.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/e2e/__init__.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/e2e/conftest.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/e2e/test_agentic_count_enforcement_e2e.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/e2e/test_asset_tagging_e2e.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/e2e/test_cancellation_e2e.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/e2e/test_chain_e2e.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/e2e/test_character_create_e2e.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/e2e/test_crash_recovery_e2e.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/e2e/test_daemon_e2e.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/e2e/test_data_layer_e2e.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/e2e/test_entity_smuggling_e2e.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/e2e/test_i2v_flags_e2e.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/e2e/test_image_batch_e2e.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/e2e/test_json_output_e2e.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/e2e/test_live_agentic_instructions.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/e2e/test_scene_compose_live.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/e2e/test_tools_e2e.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/e2e/test_transports_e2e.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/features/__init__.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/features/asset_tagging.feature +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/features/auth.feature +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/features/auth_login.feature +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/features/character_create.feature +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/features/character_read.feature +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/features/conftest.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/features/image.feature +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/features/image_upscale.feature +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/features/instructions.feature +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/features/locale_picker_include.feature +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/features/test_asset_tagging_steps.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/features/test_auth_login_steps.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/features/test_auth_steps.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/features/test_character_create_steps.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/features/test_character_read_steps.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/features/test_image_steps.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/features/test_image_upscale_steps.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/features/test_instructions_steps.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/features/test_locale_picker_include_steps.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/features/test_step_collision_guard.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/features/test_video_agent_ui_steps.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/features/test_video_chain_steps.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/features/video_agent_ui.feature +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/features/video_chain.feature +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/fixtures/__init__.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/fixtures/seeded_catalog.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/image_batch/__init__.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/image_batch/test_image_manifest.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/image_batch/test_jitter_config.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/image_batch/test_observability_events.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/integration/__init__.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/integration/conftest.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/integration/constants.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/integration/test_storage_gcs.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/integration/test_storage_s3.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/mcp/__init__.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/mcp/conftest.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/mcp/test_cli_parity.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/mcp/test_stdio_transport.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/mcp/test_tools_helpers.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/mcp/test_tools_instructions.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/mcp/test_tools_wired.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/scripts/test_check_materiality.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/scripts/test_check_release_artifacts.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/scripts/test_check_repo_hygiene.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/scripts/test_materiality_backtest.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/services/__init__.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/services/test_character_create_redaction.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/services/test_character_create_saga.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/services/test_mentions_observability.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/services/test_mentions_parse.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/services/test_mentions_resolve.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/services/test_resolve_and_apply.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/smoke/__init__.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/smoke/test_profile_account_smoke.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/smoke/test_real_flow.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/test_auth.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/test_browser_manager.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/test_chain.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/test_chain_manifest.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/test_cli_data.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/test_conftest_isolation.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/test_data_queries.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/test_documentation_gate.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/test_errors_classification.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/test_marker_registry.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/test_media.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/test_observability.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/test_paths.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/test_profile_store.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/test_smoke.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/tools/__init__.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/tools/test_banned.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/tools/test_expander.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/tools/test_invocation.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/tools/test_loader.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/tools/test_registry.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/tools/test_runtime.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/tools/test_spec.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/ui/test_app.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/worker/test_codec.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/worker/test_mcp_daemon_race.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/worker/test_queue_multiprocess.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/tests/worker/test_queue_reconciliation.py +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/website/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/website/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/website/docs/INSTRUCTIONS.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/website/docs/MOVIE.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/website/docs/PROMPT_EXPANSION.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/website/docs/TOOLS.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/website/docs/agents.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/website/docs/index.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/website/docs/installation.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/website/docs/onboarding-mockup.html +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/website/docs/onboarding.md +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/website/docs/stylesheets/extra.css +0 -0
- {gflow_cli-0.42.0 → gflow_cli-0.43.0}/website/mkdocs.yml +0 -0
|
@@ -160,9 +160,18 @@
|
|
|
160
160
|
# GFLOW_CLI_PROJECT_NAME=
|
|
161
161
|
|
|
162
162
|
# -----------------------------------------------------------------------------
|
|
163
|
-
# Debugging (
|
|
163
|
+
# Debugging (see docs/CONFIGURATION.md; HAR/traceback are opt-in and can
|
|
164
|
+
# expose secrets)
|
|
164
165
|
# -----------------------------------------------------------------------------
|
|
165
166
|
|
|
167
|
+
# Automatic private incident bundles (DEFAULT: true). On relevant operational
|
|
168
|
+
# failures (Flow app crash, UI drift, transport timeout, WAF/network errors,
|
|
169
|
+
# profile-lock contention) gflow writes a bounded diagnostic bundle under
|
|
170
|
+
# <GFLOW_CLI_HOME>/incidents/. Automatic JSON is allowlisted structural
|
|
171
|
+
# metadata only; screenshots live under sensitive/ and must be reviewed
|
|
172
|
+
# before sharing. Nothing is ever uploaded. Set false to disable.
|
|
173
|
+
# GFLOW_CLI_INCIDENT_CAPTURE=true
|
|
174
|
+
|
|
166
175
|
# Captures full Playwright network traffic (requests, responses, headers,
|
|
167
176
|
# cookies) to this HAR file for the session. SECURITY: a HAR file contains
|
|
168
177
|
# live auth cookies and bearer tokens -- never share one publicly.
|
|
@@ -63,6 +63,12 @@ jobs:
|
|
|
63
63
|
- name: Documentation links
|
|
64
64
|
run: uv run python scripts/ci/check_doc_links.py
|
|
65
65
|
|
|
66
|
+
- name: Website docs PII guard (no private identifiers in the published mirror)
|
|
67
|
+
run: uv run python scripts/ci/check_website_docs_pii.py
|
|
68
|
+
|
|
69
|
+
- name: Website docs mirror in sync (regenerate-and-diff)
|
|
70
|
+
run: uv run python scripts/ci/generate_website_docs.py --check
|
|
71
|
+
|
|
66
72
|
- name: Lint
|
|
67
73
|
run: uv run ruff check src tests
|
|
68
74
|
|
|
@@ -39,6 +39,7 @@ Run these gates in order before every commit:
|
|
|
39
39
|
$env:PYTHONUTF8=1
|
|
40
40
|
uv run python scripts/ci/check_repo_hygiene.py
|
|
41
41
|
uv run python scripts/ci/check_doc_links.py
|
|
42
|
+
uv run python scripts/ci/check_website_docs_pii.py
|
|
42
43
|
uv run ruff check src tests
|
|
43
44
|
uv run ruff format --check src tests
|
|
44
45
|
uv run pyright src
|
|
@@ -7,6 +7,113 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.43.0] — 2026-07-23
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **Private incident diagnostics** (`GFLOW_CLI_INCIDENT_CAPTURE`, default
|
|
15
|
+
**on**). Relevant operational failures — Flow app crashes, agentic-cohort /
|
|
16
|
+
UI-mode errors, selector drift, transport timeouts, WAF/network/wire-format
|
|
17
|
+
errors, profile-lock contention, unexpected exceptions — now automatically
|
|
18
|
+
write a bounded, **private** incident bundle under
|
|
19
|
+
`<GFLOW_CLI_HOME>/incidents/`: an allowlisted `manifest.json`, structural
|
|
20
|
+
`ui.json` (ligatures/signals/overlay geometry — never raw text),
|
|
21
|
+
`network.json` + `browser.json` ring journals (host categories, canonical
|
|
22
|
+
routes, status codes, text lengths — never prompts/tokens/cookies/bodies/
|
|
23
|
+
signed URLs), and a `sensitive/screenshot.png` for UI-state failures that
|
|
24
|
+
every surface marks review-before-sharing. Nothing is ever uploaded; remote
|
|
25
|
+
MCP/HTTP/worker error envelopes carry only an opaque `{id, capture_status}`
|
|
26
|
+
while the local CLI prints the bundle path. Retention is bounded
|
|
27
|
+
(50 bundles / 250 MiB) and validates ownership before pruning. Raw HAR
|
|
28
|
+
stays separate and opt-in; the manifest's `har_state` now reports honestly
|
|
29
|
+
whether the session's HAR demonstrably finalized. See
|
|
30
|
+
[DEBUGGING § Automatic incident bundles](docs/DEBUGGING.md#automatic-incident-bundles).
|
|
31
|
+
Refs #369, #370, #174, #183.
|
|
32
|
+
- **Profile-lock owner evidence.** `ProfileLockedError` contention now
|
|
33
|
+
surfaces the recorded lease owner's PID and observed start time locally
|
|
34
|
+
(never in remote envelopes or logs; identities are per-command HMACs, never
|
|
35
|
+
the raw owner token). The lock-file layout is v1-versioned: byte 0 is the
|
|
36
|
+
kernel-locked sentinel and metadata starts at offset 1, so Windows
|
|
37
|
+
contenders can read it while the lock is held (legacy byte-0 files degrade
|
|
38
|
+
to "evidence unavailable"). The kernel lock remains authoritative — no
|
|
39
|
+
reclaim, unlink, or PID kill is ever performed from metadata. Refs #370.
|
|
40
|
+
- **UI-drift debug engine** (`capture_ui_diagnostics`). On a `mode_switch_trigger`
|
|
41
|
+
failure, gflow dumps the composer's **structural** DOM signature — the
|
|
42
|
+
Material-Symbols ligature inventory, `crop_*` presence, textbox count, and
|
|
43
|
+
bounded overlay geometry — to a JSON alongside a **full-page** screenshot,
|
|
44
|
+
so a Flow frontend change is diagnosable from one artifact instead of a
|
|
45
|
+
bare (often black) viewport shot. Consolidated onto the incident-bundle
|
|
46
|
+
engine: the earlier in-development raw URL/title/body-text fields were
|
|
47
|
+
removed before release. (#183)
|
|
48
|
+
- **`website/docs/` PII-leak CI guard** (`scripts/ci/check_website_docs_pii.py`).
|
|
49
|
+
The published mkdocs mirror under `website/docs/` is an anonymized copy of
|
|
50
|
+
canonical `docs/`; this new gate fails CI (and runs in `/gflow:check`) if a
|
|
51
|
+
known private identifier — `denon82`, the OS username `ffrol`, a real
|
|
52
|
+
name/email — appears in a published file, catching an anonymization miss
|
|
53
|
+
before it ships (the failure mode of #362). Public references such as
|
|
54
|
+
`github.com/ffroliva/gflow-cli` and the APP_AUTHOR path are trap-free by
|
|
55
|
+
construction, so the guard needs no allow-list.
|
|
56
|
+
|
|
57
|
+
### Fixed
|
|
58
|
+
|
|
59
|
+
- **Incident-capture hardening from the max-effort review** (14 confirmed
|
|
60
|
+
findings fixed pre-release): journals now stage first and page artifacts
|
|
61
|
+
share the 8s budget via a deadline, so a fully wedged renderer can no longer
|
|
62
|
+
cost the whole bundle or bypass suppression; the legacy mode-switch debug
|
|
63
|
+
dump writes structural JSON only (the unmarked full-page screenshot that
|
|
64
|
+
previously landed in the plain output dir on every ordinary run is gone —
|
|
65
|
+
the bundle's `sensitive/` screenshot is the one imagery artifact); capture
|
|
66
|
+
now also covers `generate_character_image` (which additionally gains the
|
|
67
|
+
exit-15 closed-browser mapping) and `upsample_image`, plus the common
|
|
68
|
+
stale-Chrome launch-crash contention path (#293); manifests report
|
|
69
|
+
`har_state: complete` only when the context demonstrably closed gracefully;
|
|
70
|
+
bundles staged for unexpected non-typed exceptions are now surfaced (path in
|
|
71
|
+
human output and `--json`); retention runs even when capture is disabled
|
|
72
|
+
(an opt-out no longer freezes previously captured bundles on disk), runs off
|
|
73
|
+
the event loop, and an undeletable pending bundle can no longer condemn
|
|
74
|
+
healthy ones; a Windows sharing violation during manifest finalization gets
|
|
75
|
+
a bounded retry; `browser.json` records the real JS error class
|
|
76
|
+
(`TypeError`/`ReferenceError`) instead of the constant `Error`; worker
|
|
77
|
+
daemon tasks rebind a per-task correlation id so incident ids are unique
|
|
78
|
+
and joinable to queue rows.
|
|
79
|
+
- **`FlowAppError` and `FlowAgentUiError` now report `retryable: true` on
|
|
80
|
+
every machine-readable surface.** Both are documented (and presented to
|
|
81
|
+
humans) as transient/retryable, but the CLI `--json` payload said
|
|
82
|
+
`retryable: false` and the MCP / worker-queue error envelopes carried no
|
|
83
|
+
retry signal at all. The classification now lives in one shared
|
|
84
|
+
`errors.is_retryable()` consumed by CLI JSON, MCP tool envelopes, and
|
|
85
|
+
persisted worker-queue error payloads — the three surfaces can no longer
|
|
86
|
+
drift.
|
|
87
|
+
- **Documentation drift corrected against the code:** `gflow image batch` docs
|
|
88
|
+
claimed generations run in parallel inside Flow (the transport is strictly
|
|
89
|
+
serial — each prompt's generation is awaited before the next submission)
|
|
90
|
+
and listed `--fail-fast` as the default (the CLI default is
|
|
91
|
+
`--continue-on-error`); the root plan still labeled the MCP server as
|
|
92
|
+
unshipped (shipped v0.21.0/v0.23.0).
|
|
93
|
+
- **Flow's new media-library / agentic A/B cohort now fails cleanly.** When a
|
|
94
|
+
project opens into Flow's full-page media-library (or agentic chat) composer —
|
|
95
|
+
which has no classic `crop_*` aspect/mode control — `gflow image` and
|
|
96
|
+
`gflow video` now raise a clear, retryable `FlowAgentUiError` ("this cohort
|
|
97
|
+
flaps; retry shortly") instead of the misleading `UiSelectorDriftError`
|
|
98
|
+
"file a bug". Detection is a runtime DOM scan at a new shared
|
|
99
|
+
`_mode_switch_error` raise site covering **both** the image and video paths.
|
|
100
|
+
Refs #174, #183.
|
|
101
|
+
- **Flow web-app crashes now fail cleanly instead of "file a bug".** When Flow's
|
|
102
|
+
web app renders its client-side-exception error boundary (a transient Flow
|
|
103
|
+
crash) instead of the editor, the mode-switch raise site now raises a retryable
|
|
104
|
+
`FlowAppError` (exit code 31) — "transient Flow error, retry shortly" — rather
|
|
105
|
+
than the misleading `UiSelectorDriftError`. Detected via the Flow error-page
|
|
106
|
+
title; surfaced by the #183 UI-drift debug engine.
|
|
107
|
+
- **Experimental transport self-lockout.** The `bearer` and `sapisidhash`
|
|
108
|
+
transports discard a caller-supplied Playwright page and re-acquire the profile
|
|
109
|
+
`ProfileLease` in their own `setup()`. Driving one via `GFLOW_CLI_TRANSPORT`
|
|
110
|
+
inside a `FlowApiClient` (which already holds the lease) self-locked with an
|
|
111
|
+
opaque `ProfileLockedError`. `FlowApiClient` now refuses these standalone-only
|
|
112
|
+
transports up front with a clear `ConfigurationError` naming the transport and
|
|
113
|
+
pointing to `ui_automation`/`evaluate_fetch` or standalone use. `evaluate_fetch`
|
|
114
|
+
is unaffected (it shares the client's page). New `STANDALONE_ONLY_TRANSPORTS`
|
|
115
|
+
set + `resolve_transport_name()` helper in `api/transports`.
|
|
116
|
+
|
|
10
117
|
## [0.42.0] — 2026-07-21
|
|
11
118
|
|
|
12
119
|
### Fixed
|
|
@@ -2225,7 +2332,8 @@ shell-script template that branches on these codes.
|
|
|
2225
2332
|
|
|
2226
2333
|
First skeleton. Not functional end-to-end yet.
|
|
2227
2334
|
|
|
2228
|
-
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.
|
|
2335
|
+
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.43.0...HEAD
|
|
2336
|
+
[0.43.0]: https://github.com/ffroliva/gflow-cli/compare/v0.42.0...v0.43.0
|
|
2229
2337
|
[0.42.0]: https://github.com/ffroliva/gflow-cli/compare/v0.41.0...v0.42.0
|
|
2230
2338
|
[0.41.0]: https://github.com/ffroliva/gflow-cli/compare/v0.40.0...v0.41.0
|
|
2231
2339
|
[0.40.0]: https://github.com/ffroliva/gflow-cli/compare/v0.39.0...v0.40.0
|
|
@@ -14,6 +14,56 @@ Living list of behaviour that's broken, surprising, or limited by design — alo
|
|
|
14
14
|
|
|
15
15
|
## Open
|
|
16
16
|
|
|
17
|
+
### One-time Flow banner/modal can cover the composer on first load
|
|
18
|
+
|
|
19
|
+
- **Status:** Open ([#369](https://github.com/ffroliva/gflow-cli/issues/369))
|
|
20
|
+
- **Severity:** Low (transient) · **Affected:** any UI-automation command on a profile that hasn't seen the banner yet
|
|
21
|
+
|
|
22
|
+
A Flow-side one-time announcement banner/modal can overlay the composer and
|
|
23
|
+
make the mode-switch / settings probes miss. It shows once per
|
|
24
|
+
profile+cookie state, so it is gone on re-run and cannot be reproduced on
|
|
25
|
+
demand. gflow does **not** guess a dismiss selector for unknown overlays
|
|
26
|
+
(clicking unknown UI is riskier than failing). Since v0.43.0 the automatic
|
|
27
|
+
incident bundle records the overlay's bounded geometry, `role`,
|
|
28
|
+
`aria-modal`, `z-index`, `pointer-events`, and inner Material-Symbol
|
|
29
|
+
ligatures (no raw text) plus a `sensitive/` screenshot — enough to write a
|
|
30
|
+
targeted dismissal once the next occurrence is captured. **Workaround:**
|
|
31
|
+
re-run the command; open the project once manually in Chrome to consume the
|
|
32
|
+
banner.
|
|
33
|
+
|
|
34
|
+
### Reported stale profile lock blocks acquisition (unreproduced)
|
|
35
|
+
|
|
36
|
+
- **Status:** Open ([#370](https://github.com/ffroliva/gflow-cli/issues/370))
|
|
37
|
+
- **Severity:** Medium (blocks the profile until resolved) · **Affected:** `ProfileLease` acquisition (exit 11)
|
|
38
|
+
|
|
39
|
+
A user report of `ProfileLockedError` with no apparently-live owner. Not
|
|
40
|
+
reproduced: in every observed case the kernel advisory lock was held by a
|
|
41
|
+
real process (e.g. a pytest child that outlived its parent shell). The
|
|
42
|
+
kernel lock is authoritative — a merely *stale metadata file* cannot block
|
|
43
|
+
acquisition, and gflow will never auto-delete a lock file or kill a
|
|
44
|
+
recorded PID based on metadata. Since v0.43.0, contention reports the
|
|
45
|
+
recorded owner's PID and observed start time locally (lock-file metadata
|
|
46
|
+
now starts at offset 1 so Windows contenders can read it while byte 0 is
|
|
47
|
+
kernel-locked), and a metadata-only incident bundle is written before any
|
|
48
|
+
Chrome launch. **Workaround:** find and close the owning process (the
|
|
49
|
+
error's local output names its PID), or use a different `--profile`.
|
|
50
|
+
|
|
51
|
+
### Unexplained image-generation HTTP 400 (observed live 2026-07-22)
|
|
52
|
+
|
|
53
|
+
- **Status:** Open (no issue yet — evidence-gathering)
|
|
54
|
+
- **Severity:** Low (single occurrence) · **Affected:** `image t2i` wire path
|
|
55
|
+
|
|
56
|
+
One live `batchGenerateImages` call returned an HTTP 400 that was neither a
|
|
57
|
+
content-safety rejection nor a known wire shape; the retry succeeded. Root
|
|
58
|
+
cause unidentified and **not** claimed fixed by v0.43.0. A 400 that resolves
|
|
59
|
+
on retry writes **no** incident bundle (successful commands capture nothing).
|
|
60
|
+
The diagnostics help only when such a 400 *terminates* the command as a
|
|
61
|
+
captured failure (e.g. a `WireFormatError`): its incident bundle's
|
|
62
|
+
`network.json` then carries allowlisted discovery evidence for the failed
|
|
63
|
+
request (numeric error code, status enum, known-key booleans, unknown-key
|
|
64
|
+
count, message length — never the raw body), which is the evidence this entry
|
|
65
|
+
is waiting on. **Workaround:** retry; the failure has not recurred.
|
|
66
|
+
|
|
17
67
|
### Flow's `uploadImage` endpoint rejects some JPEGs with HTTP 400 (metadata-sensitive)
|
|
18
68
|
|
|
19
69
|
- **Status:** Open ([#287](https://github.com/ffroliva/gflow-cli/issues/287))
|
|
@@ -109,6 +159,17 @@ reaches the submit** — the request carries no `referenceEntities`, so the
|
|
|
109
159
|
submit backstops raise `WireFormatError` (**exit 7**) instead of silently
|
|
110
160
|
returning a text-only generation as success.
|
|
111
161
|
|
|
162
|
+
**Plain generation on this cohort now fails cleanly (#183).** When a project
|
|
163
|
+
opens into this full-page library (or the agentic chat composer) there is no
|
|
164
|
+
classic `crop_*` aspect/mode control, so `gflow image`/`gflow video` can't drive
|
|
165
|
+
generation. Rather than the old opaque `UiSelectorDriftError` "file a bug", the
|
|
166
|
+
mode-switch raise site now runs a runtime DOM scan and raises a clear, **retryable**
|
|
167
|
+
`FlowAgentUiError` (**exit 25**, "this cohort flaps; retry shortly"), and dumps a
|
|
168
|
+
DOM-signature diagnostics artifact (`diag_mode_switch_miss.json` + a full-page
|
|
169
|
+
screenshot) for reporting. The cohort is server-assigned per page load and flaps
|
|
170
|
+
within ~12h, so a re-run often lands the classic UI. Driving the new UI directly
|
|
171
|
+
is still out of scope.
|
|
172
|
+
|
|
112
173
|
**How to tell which UI your account has:** in the Flow web editor, click
|
|
113
174
|
**Add Media** — a small dialog means the old (working) UI; a navigation to a
|
|
114
175
|
full-page library means the affected new UI.
|
|
@@ -352,6 +413,8 @@ The worker queue (`generation_queue`, used by the `gflow serve` daemon and MCP t
|
|
|
352
413
|
|
|
353
414
|
**Why this can't be resolved automatically today:** Flow's generation-status REST endpoint rejects a bare, cookie-only `page.request` re-check with HTTP 401 — only a live, authenticated Playwright SPA re-poll (opening the project page and reading the DOM) can turn a preserved handle back into a real status, and that live re-poll path is not wired into recovery yet (tracked for a future phase; see the C1 handle-spike notes in `docs/superpowers/specs/2026-07-19-production-readiness-hardening-design.md` Appendix A).
|
|
354
415
|
|
|
416
|
+
**Decision (2026-07-21):** keep the safe stub — `recover_processing` marks post-submit interruptions `indeterminate` and never auto-resubmits, which is already correct. Building the auto-reconciler is deferred until **F1** (credit-free project-page re-entry) is confirmed against live Flow; until then a blind reconciler would be speculative code against unverified blackbox behavior. The `client` reconcile-hook seam and the live-gated `tests/e2e/test_crash_recovery_e2e.py` are already in place for when F1 lands.
|
|
417
|
+
|
|
355
418
|
**Manual reconciliation:** an `indeterminate` row's checkpoint retains whatever handle/project info was captured before interruption. To resolve one by hand: open the relevant Flow project in the browser and check whether the expected asset appears.
|
|
356
419
|
- **Found** — the generation completed; no action needed (the credit was spent as intended, just not auto-recorded locally).
|
|
357
420
|
- **Not found after a few minutes** — it likely never completed; safe to resubmit the same prompt manually.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gflow-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.43.0
|
|
4
4
|
Summary: Unofficial CLI for Google Flow — drive Veo image-to-video generations from the terminal.
|
|
5
5
|
Project-URL: Homepage, https://github.com/ffroliva/gflow-cli
|
|
6
6
|
Project-URL: Issues, https://github.com/ffroliva/gflow-cli/issues
|
|
@@ -358,7 +358,7 @@ The video-generation feature has its own sub-phase plan (spike → Phase A → P
|
|
|
358
358
|
- **Phase 3 (PR #90 / [#63](https://github.com/ffroliva/gflow-cli/issues/63), 2026-05-26, develop `9a0896a8`):** replaced `FRAME_SLOTS_STRUCT` with the locale-free pattern `div[type='button'][aria-haspopup='dialog']` (verified via DOM probe — matches exactly 2). Also fixed the End-frame OOB index after Start is attached. **I2V live-proof on de-DE: 124 s, mp4 with `ftyp` magic bytes, both `frame_attached` events fired (Start + End).**
|
|
359
359
|
- **Phase 4 (Task #6, 2026-05-26, branch `claude/next-quick-win-gBPqS`, PR #93):** `NEW_PROJECT_SELECTORS` expanded to all 14 locales (icon-first tier + 14-locale text tier); English-only ARIA fallbacks (`[aria-label*='New project']`, `[aria-label*='Project']`) removed. `SUBMIT_BUTTON_SELECTORS` drops its English-only `button[aria-label*="Create"]` entry — `arrow_forward` icon selectors cover it in all locales. Both tuples are now fully locale-invariant. Note: issue #24 was closed 2026-05-24 after Phases 1–3; Phase 4 is cosmetic tail work. `--lang=en-US` retained only to stabilise `IMAGE_MODEL_OPTION_SELECTORS` (product names like "Nano Banana 2" may be localised). Removing it requires converting the image model picker to a structural anchor — tracked as issue #94 (Phase 5 below). **R2V live e2e on non-EN not yet exercised** — still open.
|
|
360
360
|
- **Phase 5 (2026-05-30, branch `claude/issue-94-staleness-check-MnsEY`, PR #127):** `IMAGE_MODEL_OPTION_SELECTORS` and `VIDEO_MODEL_OPTION_SELECTORS` converted from `dict[Model, str]` to `dict[Model, tuple[str, ...]]` (cascade discipline; Tier 1 structural slots reserved for future DOM-probe-confirmed anchors). `--lang=en-US` removed from Chromium launch args — locale controlled by `locale=locale_env` Playwright kwarg (persists across all navigations including `/project/<uuid>` deep-links) + `FLOW_URL`'s `?hl=en` on initial load. Branded model names confirmed locale-stable. Four new `TestSelectorLocaleInvariance` tests + four `TestSelectImageModel` runtime tests. **R2V live e2e on non-EN still pending (owner gate — requires authenticated non-EN Chrome profile).**
|
|
361
|
-
- [
|
|
361
|
+
- [x] **Model Context Protocol (MCP) Server — SHIPPED** (stdio + HTTP/SSE server in v0.21.0, MCP→FlowWorker generation wiring in v0.23.0/PR #228; `gflow mcp run/setup` + `gflow serve`). Planned in [PREDICT.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md) / [SCENARIO.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md) / [PLAN.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md).
|
|
362
362
|
- [x] **Tools framework + Prompt Expansion ("Creative Director") — shipped → develop (PRs #210 + #211, 2026-06-28).** Prompt expansion evolved from the never-released `-e`/`--expand` flag into a TOML-defined **Tools framework**: `creative-director` is the first built-in tool, invoked uniformly via `--tool/-t <name>[:k=v]` on every generation command (`image t2i`/`i2i`/`batch`, `video t2v`/`i2v`/`r2v`/`chain`) or standalone via `gflow tools list/show/run`. The tool rewrites a terse prompt via Gemini's 5-component formula (`src/gflow_cli/tools/`, stdlib-urllib expander, never-fatal: missing key / 429-backoff / network / empty-clean all fall back to the original), with 15 domain styles and deterministic banned-keyword stripping. `operations.expanded_prompt` records original + submitted expansion (withheld under `history_prompts=redacted`); `metadata_json.tool` records `{name, version, model, params, config_hash}` provenance (minimized in redacted mode). Reuses `GFLOW_CLI_GEMINI_API_KEY`; `GFLOW_CLI_GEMINI_MODEL` overrides. MCP parity: `gflow_list_tools` + a `tools` array param per AGENTS.md §61. Docs: [TOOLS.md](file:///C:/development/github/gflow-cli/docs/TOOLS.md) + [PROMPT_EXPANSION.md](file:///C:/development/github/gflow-cli/docs/PROMPT_EXPANSION.md). Memory `[[prompt-expansion-feature]]`.
|
|
363
363
|
- **PR #210 (framework):** `tools/` package (spec/loader/registry/runtime/expander/banned/invocation), `creative-director.toml`, `gflow tools list/show/run`, `--tool` on t2i/t2v (single-prompt guard kept), MCP `gflow_list_tools` + `tools` param.
|
|
364
364
|
- **PR #211 (broaden surface):** `original_prompt`/`tool` carried on the request DTOs (`GenerateImageRequest`/`GenerateVideoRequest`/`BatchPromptItem`/`ChainLinkSpec`); recorder reads `request.original_prompt` (kwarg retired); `metadata_json.tool` recording; `--tool` wired into i2i/batch/i2v/r2v/chain; single-prompt guard removed. Silent-misrecord hazard resolved by carrying `original_prompt` on the DTO rather than re-threading a kwarg through each recorder method.
|
|
@@ -303,6 +303,41 @@ Format defaults to **human-readable on TTY**, **JSON when piped or `GFLOW_CLI_LO
|
|
|
303
303
|
|
|
304
304
|
Pipes cleanly into `jq` / Loki / Datadog without configuration. See [`docs/USER_GUIDE.md` § Journey 6](USER_GUIDE.md#journey-6--read-the-structured-logs) for `jq` recipes.
|
|
305
305
|
|
|
306
|
+
## Incident diagnostics (shipped, v0.43.0)
|
|
307
|
+
|
|
308
|
+
`FlowApiClient` owns one session-scoped `IncidentRecorder`
|
|
309
|
+
(`gflow_cli.diagnostics`) because it already owns the persistent
|
|
310
|
+
`BrowserContext`, the Page pool, teardown ordering, settings, and the
|
|
311
|
+
profile lease. Lifecycle, in order:
|
|
312
|
+
|
|
313
|
+
1. **Construct before lease acquisition** (plus best-effort retention
|
|
314
|
+
pruning), so `ProfileLockedError` contention can produce a metadata-only
|
|
315
|
+
bundle without ever launching Chrome.
|
|
316
|
+
2. **Attach listeners after context launch, before the bootstrap
|
|
317
|
+
navigation:** context-level `request`/`response`/`requestfailed` plus a
|
|
318
|
+
`page` hook, and `console`/`pageerror` on every pooled page. Callbacks do
|
|
319
|
+
synchronous primitive extraction into bounded ring journals only — they
|
|
320
|
+
never retain Playwright objects, read bodies, touch the DOM, or perform
|
|
321
|
+
I/O.
|
|
322
|
+
3. **Capture at the generation boundaries** (`generate_image` /
|
|
323
|
+
`generate_images_batch` / `generate_video`) while the page is still
|
|
324
|
+
alive: structural DOM + sensitive screenshot + journal snapshots are
|
|
325
|
+
*staged*; the manifest is not yet written. Capture is observation-only
|
|
326
|
+
and serialized by a recorder-local lock; repeats of one failure
|
|
327
|
+
fingerprint only bump a suppression counter (max 3 bundles/command).
|
|
328
|
+
4. **Teardown order (load-bearing):** detach + freeze journals → bounded
|
|
329
|
+
context close → resolve HAR state honestly from a pre-launch file
|
|
330
|
+
snapshot → atomically finalize staged manifests (`manifest.json` last)
|
|
331
|
+
→ driver stop → lease release. Finalization runs through the same
|
|
332
|
+
bounded/shielded teardown-step helper as everything else and can never
|
|
333
|
+
mask a close/driver/lease failure or swallow a cancellation.
|
|
334
|
+
|
|
335
|
+
The legacy `capture_ui_diagnostics` debug dump consumes the same structural
|
|
336
|
+
DOM engine (`STRUCTURAL_DOM_JS` + `validate_structural_dom`) — there is one
|
|
337
|
+
DOM/screenshot engine, not two artifact formats. See
|
|
338
|
+
[DEBUGGING § Automatic incident bundles](DEBUGGING.md#automatic-incident-bundles)
|
|
339
|
+
and [SECURITY § Automatic incident bundles](SECURITY.md#automatic-incident-bundles-gflow_cli_incident_capture-default-on).
|
|
340
|
+
|
|
306
341
|
## Testing topology
|
|
307
342
|
|
|
308
343
|
| Layer | Test type | Where | Network? |
|
|
@@ -395,6 +430,8 @@ We attempted three pure-HTTP transport strategies before settling on `ui_automat
|
|
|
395
430
|
|
|
396
431
|
All three now live as standalone modules under `src/gflow_cli/api/transports/experimental/` (`evaluate_fetch.py` / `bearer.py` / `sapisidhash.py`), preserved for reference and future iteration. None survives Google's anti-bot stack for mutation/generation endpoints, so the production path is `ui_automation`.
|
|
397
432
|
|
|
433
|
+
**Standalone-only transports.** `bearer` and `sapisidhash` discard any caller-supplied Playwright page and launch their own browser under a fresh `ProfileLease`, so they are **standalone-only** — they cannot run inside a `FlowApiClient` that already holds the profile lease (the second acquire would self-lock with `ProfileLockedError`). Selecting either via `GFLOW_CLI_TRANSPORT` (or the Python API) while the client owns the profile now fails fast with a clear `ConfigurationError` naming the transport, rather than the opaque lock error. `evaluate_fetch` is exempt: it reuses the client's shared page and takes no second lease. The standalone-only set lives in `STANDALONE_ONLY_TRANSPORTS` (`api/transports/__init__.py`); to drive `bearer`/`sapisidhash`, run them outside an owning client.
|
|
434
|
+
|
|
398
435
|
### What this costs users
|
|
399
436
|
|
|
400
437
|
- A **persistent Chrome profile** on disk (~150 MB after `playwright install chromium`).
|
|
@@ -261,6 +261,15 @@ GFLOW_CLI_HISTORY_PROMPTS=redacted gflow image t2i "confidential brief"
|
|
|
261
261
|
**When to set it:** capturing locale-invariant DOM via `scripts/dev/capture_locale_invariants.py`, or live-verifying a generation under a non-EN account language.
|
|
262
262
|
**Important:** Chrome's *UI* language is independently forced to `en-US` via the `--lang=en-US` launch arg (so Flow keeps serving `/fx/tools/flow/` and the editor's localized text selectors keep working). This env var only affects request headers — not the editor UI you see. See [KNOWN_ISSUES § issue #24](../KNOWN_ISSUES.md) for the path to dropping `--lang=en-US`.
|
|
263
263
|
|
|
264
|
+
### `GFLOW_CLI_INCIDENT_CAPTURE`
|
|
265
|
+
|
|
266
|
+
**What:** Automatically writes a **private incident bundle** on relevant operational failures (Flow app crash, agentic-cohort/UI-mode errors, selector drift, transport timeouts, WAF/network/wire-format errors, profile-lock contention, unexpected exceptions while a page is alive) under `<GFLOW_CLI_HOME>/incidents/<YYYY-MM-DD>/<UTC-stamp>-<incident-id>-<rand>/`. See [DEBUGGING § Automatic incident bundles](DEBUGGING.md#automatic-incident-bundles) for the bundle layout and triggers.
|
|
267
|
+
**Values:** `true` | `false`
|
|
268
|
+
**Default:** `true`
|
|
269
|
+
**When to disable:** shared machines where even structural failure metadata should not persist, or scripted runs that must write nothing outside the output dir.
|
|
270
|
+
|
|
271
|
+
**Privacy:** the automatic JSON artifacts (`manifest.json`, `ui.json`, `network.json`, `browser.json`) are built from an explicit allowlist — no prompts, tokens, cookies, headers, request/response bodies, signed URLs, raw page titles, raw error/console text, or unknown hosts/routes ever enter them. The screenshot is inherently sensitive (it can show your account identity, prompts, and media) and therefore lives under the bundle's `sensitive/` subdirectory — **review it before sharing**. Nothing is ever uploaded; retention is bounded (at most 50 complete bundles / 250 MiB, pruned oldest-first at startup). Raw HAR capture stays separate and strictly opt-in via `GFLOW_CLI_HAR_PATH`.
|
|
272
|
+
|
|
264
273
|
### `GFLOW_CLI_HAR_PATH`
|
|
265
274
|
|
|
266
275
|
**What:** Captures full Playwright network traffic (requests, responses, headers, cookies) to a HAR file for the session — useful for diagnosing wire-format surprises or WAF rejections.
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
| Symptom | First thing to try | Read |
|
|
11
11
|
|---|---|---|
|
|
12
|
+
| Any operational failure (crash, drift, timeout, WAF, lock) | Open the incident bundle path printed with the error | [Automatic incident bundles](#automatic-incident-bundles) |
|
|
12
13
|
| `gflow image t2i` hangs ≥ 3 min then fails with `TimeoutError` | Re-run with `--verbose` and grep for `batch_response_seen` | [Listener log keys](#listener--http-layer-debugging) |
|
|
13
14
|
| `aspect_ratio_set_failed` warning then wrong-aspect output | The aspect-tab selector cascade missed; capture a DOM snapshot of the gen-settings panel | [Inspecting Flow's live UI](#inspecting-flows-live-ui) |
|
|
14
15
|
| `UnicodeEncodeError: 'charmap' codec can't encode` on Windows | Set `PYTHONUTF8=1` (PowerShell: `$env:PYTHONUTF8="1"`) before any `gflow` invocation | [Windows console](#windows-console-encoding) |
|
|
@@ -59,6 +60,96 @@ uv run gflow --verbose image t2i "prompt" --profile <name> --out tmp\debug 2>&1
|
|
|
59
60
|
Select-String 'batch_response|aspect_ratio|prompt_submitted|error_unhandled'
|
|
60
61
|
```
|
|
61
62
|
|
|
63
|
+
## Automatic incident bundles
|
|
64
|
+
|
|
65
|
+
Since v0.43.0, relevant operational failures automatically write a **private
|
|
66
|
+
incident bundle** (`GFLOW_CLI_INCIDENT_CAPTURE`, default `true` — see
|
|
67
|
+
[CONFIGURATION § GFLOW_CLI_INCIDENT_CAPTURE](CONFIGURATION.md#gflow_cli_incident_capture)).
|
|
68
|
+
The human error output prints the bundle path; `--json` carries it as the
|
|
69
|
+
`error.incident` object; remote surfaces (MCP/HTTP/worker) receive only an
|
|
70
|
+
opaque `{id, capture_status}`.
|
|
71
|
+
|
|
72
|
+
### Layout
|
|
73
|
+
|
|
74
|
+
The directory name embeds the **incident id** (`<correlation-id>-<fingerprint>`,
|
|
75
|
+
the same value in `manifest.json`'s `incident_id` and the CLI's `incident`
|
|
76
|
+
object) between the UTC timestamp and a collision-resistant random suffix:
|
|
77
|
+
|
|
78
|
+
```text
|
|
79
|
+
<GFLOW_CLI_HOME>/incidents/<YYYY-MM-DD>/<UTC-stamp>-<incident-id>-<rand>/
|
|
80
|
+
├── manifest.json # allowlisted facts: version/env, error class + exit
|
|
81
|
+
│ # code + retryable, sanitized route, phase, artifact
|
|
82
|
+
│ # classifications, HAR state, suppression count
|
|
83
|
+
├── ui.json # structural DOM only: Material-Symbol ligatures,
|
|
84
|
+
│ # signal booleans, tag counts, viewport/scroll,
|
|
85
|
+
│ # bounded overlay geometry — never raw text/HTML
|
|
86
|
+
├── network.json # last ≤100 responses/failures: method, host
|
|
87
|
+
│ # category, canonical route, status, duration
|
|
88
|
+
├── browser.json # last ≤100 console warn/error + ≤50 page errors —
|
|
89
|
+
│ # class/category + length only, never message text
|
|
90
|
+
├── sensitive/screenshot.png # UI-state failures only — REVIEW BEFORE SHARING
|
|
91
|
+
└── .pending # present only while a capture is still staging
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
`manifest.json` is written last and marks the bundle complete; a directory
|
|
95
|
+
with only `.pending` is a crash leftover and is pruned automatically after
|
|
96
|
+
24 h. Retention keeps at most 50 complete bundles / 250 MiB (oldest pruned
|
|
97
|
+
at command startup).
|
|
98
|
+
|
|
99
|
+
### What triggers a capture (and what never does)
|
|
100
|
+
|
|
101
|
+
Captured: `FlowAppError` (31), `FlowAgentUiError` (25),
|
|
102
|
+
`UiModeUnavailableError` (28), `UiSelectorDriftError` (23),
|
|
103
|
+
`TransportTimeoutError` (9), `BrowserSessionClosedError` (15),
|
|
104
|
+
`WireFormatError` (7), `WafRejectionError` (10), `NetworkError` (6),
|
|
105
|
+
unexpected exceptions while a page is alive, and `ProfileLockedError` (11)
|
|
106
|
+
as a **metadata-only** bundle (no Chrome is launched; the local human output
|
|
107
|
+
also shows the recorded lock owner's PID/start-time evidence — advisory
|
|
108
|
+
only, the kernel lock stays authoritative and nothing is ever reclaimed).
|
|
109
|
+
|
|
110
|
+
Never captured: expected `ContentPolicyError`, ordinary `AuthExpiredError`,
|
|
111
|
+
usage/config validation, cancellation (Ctrl-C). Successful commands write
|
|
112
|
+
nothing. At most 3 bundles per command; repeats of the same failure
|
|
113
|
+
fingerprint increment `suppressed_count` in the manifest instead.
|
|
114
|
+
|
|
115
|
+
Capture is **observation-only** (it never retries, navigates, or submits)
|
|
116
|
+
and best-effort: the original error, exit code, and traceback always win,
|
|
117
|
+
and a capture problem surfaces only as an `incident.capture_failed` log
|
|
118
|
+
event.
|
|
119
|
+
|
|
120
|
+
### Escalation path
|
|
121
|
+
|
|
122
|
+
The automatic bundle answers "what state was Flow in?". When you need raw
|
|
123
|
+
payloads (wire-format surprises, WAF forensics), escalate explicitly to
|
|
124
|
+
[`GFLOW_CLI_HAR_PATH`](CONFIGURATION.md#gflow_cli_har_path) — the manifest's
|
|
125
|
+
`har_state` field records honestly whether that session's HAR demonstrably
|
|
126
|
+
finalized (`disabled` / `pending_flush` / `complete` / `possibly_incomplete`).
|
|
127
|
+
Raw HAR is never enabled or copied automatically.
|
|
128
|
+
|
|
129
|
+
### Assessing a bundle's quality
|
|
130
|
+
|
|
131
|
+
To score how *useful* a bundle is — not just that it exists —
|
|
132
|
+
`scripts/dev/incident_bundle_quality.py` grades any bundle directory against
|
|
133
|
+
the five diagnostic questions above plus completeness/fidelity/actionability,
|
|
134
|
+
with a hard privacy gate (any leaked identifier → grade F). Reusable on a
|
|
135
|
+
bundle a user emails you:
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
.venv/Scripts/python.exe scripts/dev/incident_bundle_quality.py <bundle-dir> [known-secret ...]
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
It prints a scorecard (grade, per-question YES/NO/N/A, privacy verdict). The
|
|
142
|
+
live e2e benchmark (`tests/e2e/test_incident_quality_e2e.py`, credit-free)
|
|
143
|
+
enforces quality floors on real bundles so a regression that hollows out the
|
|
144
|
+
evidence fails CI even though the artifacts still exist.
|
|
145
|
+
|
|
146
|
+
### Worker / daemon correlation
|
|
147
|
+
|
|
148
|
+
In the worker daemon each task rebinds a per-task correlation id (`wk-<task_id>`),
|
|
149
|
+
so an incident bundle's id (`<correlation>-<fingerprint>`) is unique per task and
|
|
150
|
+
joinable to the queue row and the task's structured-log events — two tasks that
|
|
151
|
+
fail the same way no longer collide on one incident id.
|
|
152
|
+
|
|
62
153
|
## Inspecting Flow's live UI
|
|
63
154
|
|
|
64
155
|
When a selector breaks, the cheapest path is a DOM snapshot of the page
|
|
@@ -163,9 +163,23 @@ tests/
|
|
|
163
163
|
├── test_transports_e2e.py # [e2e, e2e_{auth,image,batch,video}]
|
|
164
164
|
├── test_image_batch_e2e.py # [e2e, e2e_batch]
|
|
165
165
|
├── test_video_t2v_e2e.py # [e2e, e2e_video]
|
|
166
|
+
├── test_incident_quality_e2e.py # [e2e, e2e_auth] incident-bundle quality benchmark — 0 credits
|
|
166
167
|
└── test_data_layer_e2e.py # [e2e, e2e_{image,video,data}]
|
|
167
168
|
```
|
|
168
169
|
|
|
170
|
+
### Incident-bundle quality benchmark
|
|
171
|
+
|
|
172
|
+
`test_incident_quality_e2e.py` (marker `e2e_auth`, **0 credits**) is not a
|
|
173
|
+
generation test — it drives a real UI-state failure plus real two-process
|
|
174
|
+
profile contention and **grades the resulting incident bundles' diagnostic
|
|
175
|
+
quality**, asserting hard floors so a regression that hollows out the captured
|
|
176
|
+
evidence (empty journals, hosts all reduced to `other`, a null command, a
|
|
177
|
+
leaked identifier) fails CI even though the artifacts still exist. It reuses the
|
|
178
|
+
standalone scorer `scripts/dev/incident_bundle_quality.py` (also runnable on any
|
|
179
|
+
field bundle a user emails), which is unit-covered offline by
|
|
180
|
+
`tests/scripts/test_incident_bundle_quality.py`. See
|
|
181
|
+
[DEBUGGING § Assessing a bundle's quality](DEBUGGING.md#assessing-a-bundles-quality).
|
|
182
|
+
|
|
169
183
|
### Smoke test inventory
|
|
170
184
|
|
|
171
185
|
| File | Credits | What it verifies |
|
|
@@ -130,9 +130,10 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
|
|
|
130
130
|
**"How do I embed FlowApiClient in a long-lived worker / service?"** → [USER_GUIDE § Journey 14](USER_GUIDE.md#journey-14--embedding-flowapiclient-in-a-long-lived-worker)
|
|
131
131
|
**"What's the standard way to import gflow errors in my code?"** → [USAGE § Programmatic use](USAGE.md#programmatic-use)
|
|
132
132
|
**"A gflow command hangs / fails — where do I start?"** → [DEBUGGING § Quick reference](DEBUGGING.md#quick-reference)
|
|
133
|
+
**"A command failed — where is the incident bundle and what's in it?"** → [DEBUGGING § Automatic incident bundles](DEBUGGING.md#automatic-incident-bundles) (layout, triggers, review-before-sharing); privacy boundaries: [SECURITY § Automatic incident bundles](SECURITY.md#automatic-incident-bundles-gflow_cli_incident_capture-default-on); disable via [CONFIGURATION § GFLOW_CLI_INCIDENT_CAPTURE](CONFIGURATION.md#gflow_cli_incident_capture)
|
|
133
134
|
**"Flow's UI broke a selector — how do I diagnose it?"** → [DEBUGGING § Inspecting Flow's live UI](DEBUGGING.md#inspecting-flows-live-ui)
|
|
134
135
|
**"What does each `ui_automation.*` log event mean?"** → [DEBUGGING § Listener & HTTP-layer debugging](DEBUGGING.md#listener--http-layer-debugging)
|
|
135
|
-
**What was actually live-verified for the latest release?** → latest: [LIVE_VERIFICATION_v0.42.0](LIVE_VERIFICATION_v0.42.0.md) (**#361 production-readiness live-gaps confirmed live 2026-07-21, 1 Veo credit** — a real `veo-lite` t2v through the worker path persisted a real `remote_started` checkpoint [observer→checkpoint→DB chain confirmed], crash-recovery classified the task `indeterminate` without resubmitting, and mid-launch cancellation released the `ProfileLease` credit-free; full evidence in [v0.40.0-production-readiness § "2026-07-21 live follow-up"](LIVE_VERIFICATION_v0.40.0-production-readiness.md#2026-07-21-live-follow-up-0420-cycle); #359 content-safety `400`→`ContentPolicyError` classification is unit-covered, not live-triggered [would require a deliberate policy violation]; #360/#362 are docs-only, verified by the documentation gates). Prior: [v0.41.0](LIVE_VERIFICATION_v0.41.0.md) (**#357 production-readiness hardening — stale-session fail-fast, free image gen, paid veo-lite T2V all proven live**). Prior: [v0.40.0](LIVE_VERIFICATION_v0.40.0.md) (**#344 `@`-mention asset-tagging resolution proven live e2e, ~2 Imagen credits** — `gflow character create` staged a real taggable character [bound reference images, `has_reference_images` guard], the e2e test's documented propagation wait cleared Flow's `projectInitialData` lag, and `gflow image t2i "@Zoro …"` passed with returncode 0, a real generated image, and the correctly de-tagged prompt in the catalog — no code changes needed, `resolve_and_apply` as merged in #344 already works end-to-end; pre-existing unrelated issue #174 [Flow media-library A/B flake] can still intermittently block generation regardless of this feature — recorded, not omitted). Prior: [v0.39.0](LIVE_VERIFICATION_v0.39.0.md) (**#341 failed-generation persistence proven live** — a real `image t2i` on denon82 failed at the wire [`batchGenerateImages` HTTP 400 → `WireFormatError`] and the record-on-catch funnel wrote the **first-ever `failed` row** into the production catalog [`error_type=wire-format`, redacted `error_detail`, browsable via `gflow data list errors`], **$0**; the remaining paid paths [video/chain/batch/movie/worker] are funnel-regression-tested, not force-failed live [would cost credits], and the status-aware `succeeded=false` video-poll fix is unit-locked — recorded, not omitted). Prior: [v0.38.1](LIVE_VERIFICATION_v0.38.1.md) (**#338 agentic-pin recovery proven live ON the pinned account** — run 1 caught the composer-render race the unit suite could not [`ensure_media_incomplete` +115 ms, toggle never reached]; the readiness-wait fix landed and run 2 recovered classic on denon82 after ~2h of pin [`ui_driver.bound mode=classic`, real 768×1376 JPEG, exact prompt adherence]; reload branch unit-locked, live trigger not observed this cycle — recorded, not omitted). Prior: [v0.38.0](LIVE_VERIFICATION_v0.38.0.md) (**#332 mode control + #314 i2i ref dedup proven live e2e** — `image t2i --ui-mode classic` recovered agentic→classic in a real run [`ui_mode.attempt_exit_agent` → full classic chain, 1376×768 JPEG]; two identical `image i2i` runs proved the dedup contract [run 1: picker miss → `image_uploaded`; run 2: `reference_deduped_by_filename`, ZERO uploads]; `video t2v` veo-fast [`MEDIA_GENERATION_STATUS_SUCCESSFUL`, 15.2 MB `ftyp` mp4]; autopilot #333 recorded deferred-with-reason [hermes-ops deployment staged separately]). Prior: [v0.37.0](LIVE_VERIFICATION_v0.37.0.md) (**viewport 1920×1080 + agentic count enforcement + FIPS-safe SAPISIDHASH proven live e2e** — `image t2i` [classic cohort, real 1376×768 JPEG] and `video t2v` veo-fast [`MEDIA_GENERATION_STATUS_SUCCESSFUL`, 11.5 MB `ftyp` mp4] both succeeded end-to-end at the new 1920×1080 viewport with every selector resolving [no drift]; SAPISIDHASH digest verified byte-identical [FIPS-safe `usedforsecurity=False`], auth unchanged). Prior: [v0.36.0](LIVE_VERIFICATION_v0.36.0.md) (**#316 diagnostic tooling live-verified against real Flow traffic** — `GFLOW_CLI_HAR_PATH` captured a real 54-entry HAR [real Flow domains, 34× 200s, and a genuine 401 the tool exists to diagnose]; `GFLOW_CLI_DEBUG_TRACEBACK`'s typed-error scoping confirmed live [console output identical with/without the flag on a `GFlowError`]; unhandled-path behavior covered by 6 new tests (30 total across both files) + SDD task review; #312 reference-entity-smuggling fix covered by its own dedicated e2e test). Prior: [v0.35.0](LIVE_VERIFICATION_v0.35.0.md) (**#305-follow-up multimodal reverse-engineering & storyboard tool proven live e2e** — `gflow tools run storyboard` successfully deconstructed a cyberpunk scene into a cohesive 4-panel sequence; `reverse-engineer` tool extracts frames from video streams/URLs using `claude-video`'s `watch.py` and produces structured prompt components using Gemini multimodal models; dynamic token budgeting and strict Pyright types verified via test suite). Prior: [v0.34.0](LIVE_VERIFICATION_v0.34.0.md) (**#299 `--ui-mode` gate proven live, ZERO credits** — drove `get_ui_driver` directly over 4 real editor loads, never generated: bidirectional switch works [classic→agentic via `_force_agent_mode`, agentic→classic via `_exit_agent_mode`, each DOM-reverified], `agentic`-when-already-agentic is idempotent, and a timed-out toggle → **exit-28 fail-fast before submission**; deprecation behavior-change [`prefer_classic`→exit 28] confirmed). Prior: [v0.33.0](LIVE_VERIFICATION_v0.33.0.md) (**#287-follow-up picker fix proven live on the original repro** — the v0.32.1-failing `i2v <uuid> --project <crowded>` command now exits 0 with a real 3.0 MB `ftyp` mp4, `frame_ref_attached` + `video_saved`, zero uploads; **#241 jitter live-verified on both paths** — flag `--jitter 4-6` → `batch_jitter_sleep seconds=4.98`, and the new 0.5–1.5 s default → `seconds=1.47`, each firing exactly once between two t2i submissions; environment note: the denon82 cohort is now natively agentic and round-2 generations hit the pre-existing #281 `MediaAttributionError`, not a regression). Prior: [v0.32.1](LIVE_VERIFICATION_v0.32.1.md) (**#293 teardown fix live-verified credit-free** — error-path aborts leave ZERO chrome.exe holding the profile [3× leak reproduced pre-fix same day]; force-close fallback + ProfileLockedError translation unit-pinned; #283 wave logic fixes mock-verified to exact call counts). Prior: [v0.32.0](LIVE_VERIFICATION_v0.32.0.md) (**#287 UUID i2v frames proven live e2e** — an in-project asset selected by media UUID in the frame-slot dialog [frame_ref_attached, startImage bound on the wire, ZERO upload events] produced a real 720×1280 interpolation, resolving the #237 negative prior; foreign UUID → exit 9 pre-generation with screenshot; **#288 duration fail-fast proven live** — exit 23 pre-submit saved a 10-credit generation, and the debug screenshot confirmed the duration control is ABSENT from the cohort's settings popover [locale hypothesis refuted]; upload-400 exit-27 repro deferred-with-reason — the original rejected JPEG no longer exists). Prior: [v0.31.0](LIVE_VERIFICATION_v0.31.0.md) (**#281 wrong-media defenses live-verified in BOTH directions, credit-free** — correct attribution downloads with real wire metadata [seed, 768×1376]; the incident-class lazy-render ambiguity reproduced live and hard-stopped with `MediaAttributionError` exit 26 naming every candidate UUID, no file written; **#282 two-UUID-ref i2i proven e2e** — both freshly generated portrait UUIDs picker-selected into one scene with both canonical identities visually transferred). Prior: [v0.30.0](LIVE_VERIFICATION_v0.30.0.md) (**agentic-cohort image path + both fixes live-verified credit-free** — native 768×1376 stills, i2i-chain + canonical-ref identity hold; the character-create `DataIntegrityError` and the `prefer_classic` WARNING were observed live then fixed [recorder idempotent + INFO log]; MCP video-param feature deferred-with-reason on Veo credits, per the stills-only goal). Prior: [v0.29.0](LIVE_VERIFICATION_v0.29.0.md) (**persistent `gflow instructions` CRUD proven live e2e GREEN, credit-free** — 11-command sequence on a fresh project: add incl. `--ref <image-UUID>` attach, list/enable/disable, master toggle both ways, TOML `apply` destructive full-sync with `enabled=false` honored, `rm` with server card-id preserved across mutations; movie brief-sync code-path-verified via the same primitives, deferred-with-reason on credits; MCP `gflow_instructions_*` tools are thin adapters over the live-verified primitives). Prior: [v0.28.0](LIVE_VERIFICATION_v0.28.0.md) (**agent instructions `-i` now steer agentic generation — crayon e2e GREEN**: a style-neutral prompt + an enabled "crayon" card produced an unmistakable crayon drawing through the real transport; root causes were conversational phrasing + the `project_brief.enabled` master switch). Prior: [v0.27.1](LIVE_VERIFICATION_v0.27.1.md) (**v0.27.0 release follow-up fixes and documentation sync**). Prior: [v0.27.0](LIVE_VERIFICATION_v0.27.0.md) (**`[style]` block with named variants + prompt-aware resume — credit-free CLI verification**: real `movie run --dry-run` 3-way ledger proving resolved-style display, `skip (done)` on matching `style_hash`, and `re-run (style changed)` after a style edit; composition is local, wire path untouched, so no Veo credits spent — first credited styled run will confirm visually). Prior: [v0.26.0](LIVE_VERIFICATION_v0.26.0.md) (**image i2i by generated-image UUID proven live e2e GREEN** — the existing asset is *selected in place* by its media UUID, no duplicate upload, producing an i2i output that references it; plus generated-image `display_name` capture, credited @C1ph3r404). Prior: [v0.25.0](LIVE_VERIFICATION_v0.25.0.md) (**#237 remote-UUID i2v proven live e2e GREEN** — a real 8s 720×1280 interpolation from a generated image's UUID, after the picker-search attach was reworked to local upload; #240 home-`.env` matrix live; plus two silent-failure guards root-caused live: video-as-image download rejection and rejected-upload fail-loud). Prior: [v0.24.0](LIVE_VERIFICATION_v0.24.0.md) (--project parity across CLI + MCP — automated coverage; live gen auth-gated). Prior: [v0.23.0](LIVE_VERIFICATION_v0.23.0.md) (MCP generation wiring proven live end-to-end — tool→worker→real Flow REST→structured-error translation; final image-write blocked by an expired session, environmental. #222 macOS fix reporter-verified e2e on Apple Silicon). Prior: [v0.22.0](LIVE_VERIFICATION_v0.22.0.md) (Tools framework — automated/CI coverage complete; credit/key-gated live feature run is a pending owner gate, see the doc) · [v0.21.0](LIVE_VERIFICATION_v0.21.0.md) (MCP server over stdio + HTTP/SSE — credit-free protocol handshake; 4 tools / 2 prompts / 3 resources confirmed on stdout) · [v0.20.1](LIVE_VERIFICATION_v0.20.1.md) · [v0.20.0](LIVE_VERIFICATION_v0.20.0.md) · [v0.19.0](LIVE_VERIFICATION_v0.19.0.md) · [v0.18.0](LIVE_VERIFICATION_v0.18.0.md) · [v0.17.0](LIVE_VERIFICATION_v0.17.0.md) · [v0.16.0](LIVE_VERIFICATION_v0.16.0.md) · [v0.13.0](LIVE_VERIFICATION_v0.13.0.md) · [v0.12.0](LIVE_VERIFICATION_v0.12.0.md) · [v0.11.0](LIVE_VERIFICATION_v0.11.0.md) · [v0.10.0](LIVE_VERIFICATION_v0.10.0.md) · [v0.9.1](LIVE_VERIFICATION_v0.9.1.md) · [v0.9.0](LIVE_VERIFICATION_v0.9.0.md) · [v0.8.1](LIVE_VERIFICATION_v0.8.1.md) · [v0.7.0](LIVE_VERIFICATION_v0.7.0.md)
|
|
136
|
+
**What was actually live-verified for the latest release?** → latest: [LIVE_VERIFICATION_v0.43.0](LIVE_VERIFICATION_v0.43.0.md) (**private incident diagnostics live-verified 2026-07-23, 1 Veo credit** — real-editor recorder bundle 19/19 checks [structural DOM + host-category reduction + leak-scan clean on real traffic, honest `har_state`], real two-process contention → exit-11 metadata-only bundle with owner evidence and no reclaim, a real credit-free t2i proving no-incident-on-success, and the approved paid `veo-lite` T2V [S43] — HTTP-200 submission, `MEDIA_GENERATION_STATUS_SUCCESSFUL`, 2.3 MB `ftyp` mp4, catalog provenance, no incident bundle, lease re-acquirable — one lifecycle proven, availability soak explicitly NOT claimed). Prior: [v0.42.0](LIVE_VERIFICATION_v0.42.0.md) (**#361 production-readiness live-gaps confirmed live 2026-07-21, 1 Veo credit** — a real `veo-lite` t2v through the worker path persisted a real `remote_started` checkpoint [observer→checkpoint→DB chain confirmed], crash-recovery classified the task `indeterminate` without resubmitting, and mid-launch cancellation released the `ProfileLease` credit-free; full evidence in [v0.40.0-production-readiness § "2026-07-21 live follow-up"](LIVE_VERIFICATION_v0.40.0-production-readiness.md#2026-07-21-live-follow-up-0420-cycle); #359 content-safety `400`→`ContentPolicyError` classification is unit-covered, not live-triggered [would require a deliberate policy violation]; #360/#362 are docs-only, verified by the documentation gates). Prior: [v0.41.0](LIVE_VERIFICATION_v0.41.0.md) (**#357 production-readiness hardening — stale-session fail-fast, free image gen, paid veo-lite T2V all proven live**). Prior: [v0.40.0](LIVE_VERIFICATION_v0.40.0.md) (**#344 `@`-mention asset-tagging resolution proven live e2e, ~2 Imagen credits** — `gflow character create` staged a real taggable character [bound reference images, `has_reference_images` guard], the e2e test's documented propagation wait cleared Flow's `projectInitialData` lag, and `gflow image t2i "@Zoro …"` passed with returncode 0, a real generated image, and the correctly de-tagged prompt in the catalog — no code changes needed, `resolve_and_apply` as merged in #344 already works end-to-end; pre-existing unrelated issue #174 [Flow media-library A/B flake] can still intermittently block generation regardless of this feature — recorded, not omitted). Prior: [v0.39.0](LIVE_VERIFICATION_v0.39.0.md) (**#341 failed-generation persistence proven live** — a real `image t2i` on denon82 failed at the wire [`batchGenerateImages` HTTP 400 → `WireFormatError`] and the record-on-catch funnel wrote the **first-ever `failed` row** into the production catalog [`error_type=wire-format`, redacted `error_detail`, browsable via `gflow data list errors`], **$0**; the remaining paid paths [video/chain/batch/movie/worker] are funnel-regression-tested, not force-failed live [would cost credits], and the status-aware `succeeded=false` video-poll fix is unit-locked — recorded, not omitted). Prior: [v0.38.1](LIVE_VERIFICATION_v0.38.1.md) (**#338 agentic-pin recovery proven live ON the pinned account** — run 1 caught the composer-render race the unit suite could not [`ensure_media_incomplete` +115 ms, toggle never reached]; the readiness-wait fix landed and run 2 recovered classic on denon82 after ~2h of pin [`ui_driver.bound mode=classic`, real 768×1376 JPEG, exact prompt adherence]; reload branch unit-locked, live trigger not observed this cycle — recorded, not omitted). Prior: [v0.38.0](LIVE_VERIFICATION_v0.38.0.md) (**#332 mode control + #314 i2i ref dedup proven live e2e** — `image t2i --ui-mode classic` recovered agentic→classic in a real run [`ui_mode.attempt_exit_agent` → full classic chain, 1376×768 JPEG]; two identical `image i2i` runs proved the dedup contract [run 1: picker miss → `image_uploaded`; run 2: `reference_deduped_by_filename`, ZERO uploads]; `video t2v` veo-fast [`MEDIA_GENERATION_STATUS_SUCCESSFUL`, 15.2 MB `ftyp` mp4]; autopilot #333 recorded deferred-with-reason [hermes-ops deployment staged separately]). Prior: [v0.37.0](LIVE_VERIFICATION_v0.37.0.md) (**viewport 1920×1080 + agentic count enforcement + FIPS-safe SAPISIDHASH proven live e2e** — `image t2i` [classic cohort, real 1376×768 JPEG] and `video t2v` veo-fast [`MEDIA_GENERATION_STATUS_SUCCESSFUL`, 11.5 MB `ftyp` mp4] both succeeded end-to-end at the new 1920×1080 viewport with every selector resolving [no drift]; SAPISIDHASH digest verified byte-identical [FIPS-safe `usedforsecurity=False`], auth unchanged). Prior: [v0.36.0](LIVE_VERIFICATION_v0.36.0.md) (**#316 diagnostic tooling live-verified against real Flow traffic** — `GFLOW_CLI_HAR_PATH` captured a real 54-entry HAR [real Flow domains, 34× 200s, and a genuine 401 the tool exists to diagnose]; `GFLOW_CLI_DEBUG_TRACEBACK`'s typed-error scoping confirmed live [console output identical with/without the flag on a `GFlowError`]; unhandled-path behavior covered by 6 new tests (30 total across both files) + SDD task review; #312 reference-entity-smuggling fix covered by its own dedicated e2e test). Prior: [v0.35.0](LIVE_VERIFICATION_v0.35.0.md) (**#305-follow-up multimodal reverse-engineering & storyboard tool proven live e2e** — `gflow tools run storyboard` successfully deconstructed a cyberpunk scene into a cohesive 4-panel sequence; `reverse-engineer` tool extracts frames from video streams/URLs using `claude-video`'s `watch.py` and produces structured prompt components using Gemini multimodal models; dynamic token budgeting and strict Pyright types verified via test suite). Prior: [v0.34.0](LIVE_VERIFICATION_v0.34.0.md) (**#299 `--ui-mode` gate proven live, ZERO credits** — drove `get_ui_driver` directly over 4 real editor loads, never generated: bidirectional switch works [classic→agentic via `_force_agent_mode`, agentic→classic via `_exit_agent_mode`, each DOM-reverified], `agentic`-when-already-agentic is idempotent, and a timed-out toggle → **exit-28 fail-fast before submission**; deprecation behavior-change [`prefer_classic`→exit 28] confirmed). Prior: [v0.33.0](LIVE_VERIFICATION_v0.33.0.md) (**#287-follow-up picker fix proven live on the original repro** — the v0.32.1-failing `i2v <uuid> --project <crowded>` command now exits 0 with a real 3.0 MB `ftyp` mp4, `frame_ref_attached` + `video_saved`, zero uploads; **#241 jitter live-verified on both paths** — flag `--jitter 4-6` → `batch_jitter_sleep seconds=4.98`, and the new 0.5–1.5 s default → `seconds=1.47`, each firing exactly once between two t2i submissions; environment note: the denon82 cohort is now natively agentic and round-2 generations hit the pre-existing #281 `MediaAttributionError`, not a regression). Prior: [v0.32.1](LIVE_VERIFICATION_v0.32.1.md) (**#293 teardown fix live-verified credit-free** — error-path aborts leave ZERO chrome.exe holding the profile [3× leak reproduced pre-fix same day]; force-close fallback + ProfileLockedError translation unit-pinned; #283 wave logic fixes mock-verified to exact call counts). Prior: [v0.32.0](LIVE_VERIFICATION_v0.32.0.md) (**#287 UUID i2v frames proven live e2e** — an in-project asset selected by media UUID in the frame-slot dialog [frame_ref_attached, startImage bound on the wire, ZERO upload events] produced a real 720×1280 interpolation, resolving the #237 negative prior; foreign UUID → exit 9 pre-generation with screenshot; **#288 duration fail-fast proven live** — exit 23 pre-submit saved a 10-credit generation, and the debug screenshot confirmed the duration control is ABSENT from the cohort's settings popover [locale hypothesis refuted]; upload-400 exit-27 repro deferred-with-reason — the original rejected JPEG no longer exists). Prior: [v0.31.0](LIVE_VERIFICATION_v0.31.0.md) (**#281 wrong-media defenses live-verified in BOTH directions, credit-free** — correct attribution downloads with real wire metadata [seed, 768×1376]; the incident-class lazy-render ambiguity reproduced live and hard-stopped with `MediaAttributionError` exit 26 naming every candidate UUID, no file written; **#282 two-UUID-ref i2i proven e2e** — both freshly generated portrait UUIDs picker-selected into one scene with both canonical identities visually transferred). Prior: [v0.30.0](LIVE_VERIFICATION_v0.30.0.md) (**agentic-cohort image path + both fixes live-verified credit-free** — native 768×1376 stills, i2i-chain + canonical-ref identity hold; the character-create `DataIntegrityError` and the `prefer_classic` WARNING were observed live then fixed [recorder idempotent + INFO log]; MCP video-param feature deferred-with-reason on Veo credits, per the stills-only goal). Prior: [v0.29.0](LIVE_VERIFICATION_v0.29.0.md) (**persistent `gflow instructions` CRUD proven live e2e GREEN, credit-free** — 11-command sequence on a fresh project: add incl. `--ref <image-UUID>` attach, list/enable/disable, master toggle both ways, TOML `apply` destructive full-sync with `enabled=false` honored, `rm` with server card-id preserved across mutations; movie brief-sync code-path-verified via the same primitives, deferred-with-reason on credits; MCP `gflow_instructions_*` tools are thin adapters over the live-verified primitives). Prior: [v0.28.0](LIVE_VERIFICATION_v0.28.0.md) (**agent instructions `-i` now steer agentic generation — crayon e2e GREEN**: a style-neutral prompt + an enabled "crayon" card produced an unmistakable crayon drawing through the real transport; root causes were conversational phrasing + the `project_brief.enabled` master switch). Prior: [v0.27.1](LIVE_VERIFICATION_v0.27.1.md) (**v0.27.0 release follow-up fixes and documentation sync**). Prior: [v0.27.0](LIVE_VERIFICATION_v0.27.0.md) (**`[style]` block with named variants + prompt-aware resume — credit-free CLI verification**: real `movie run --dry-run` 3-way ledger proving resolved-style display, `skip (done)` on matching `style_hash`, and `re-run (style changed)` after a style edit; composition is local, wire path untouched, so no Veo credits spent — first credited styled run will confirm visually). Prior: [v0.26.0](LIVE_VERIFICATION_v0.26.0.md) (**image i2i by generated-image UUID proven live e2e GREEN** — the existing asset is *selected in place* by its media UUID, no duplicate upload, producing an i2i output that references it; plus generated-image `display_name` capture, credited @C1ph3r404). Prior: [v0.25.0](LIVE_VERIFICATION_v0.25.0.md) (**#237 remote-UUID i2v proven live e2e GREEN** — a real 8s 720×1280 interpolation from a generated image's UUID, after the picker-search attach was reworked to local upload; #240 home-`.env` matrix live; plus two silent-failure guards root-caused live: video-as-image download rejection and rejected-upload fail-loud). Prior: [v0.24.0](LIVE_VERIFICATION_v0.24.0.md) (--project parity across CLI + MCP — automated coverage; live gen auth-gated). Prior: [v0.23.0](LIVE_VERIFICATION_v0.23.0.md) (MCP generation wiring proven live end-to-end — tool→worker→real Flow REST→structured-error translation; final image-write blocked by an expired session, environmental. #222 macOS fix reporter-verified e2e on Apple Silicon). Prior: [v0.22.0](LIVE_VERIFICATION_v0.22.0.md) (Tools framework — automated/CI coverage complete; credit/key-gated live feature run is a pending owner gate, see the doc) · [v0.21.0](LIVE_VERIFICATION_v0.21.0.md) (MCP server over stdio + HTTP/SSE — credit-free protocol handshake; 4 tools / 2 prompts / 3 resources confirmed on stdout) · [v0.20.1](LIVE_VERIFICATION_v0.20.1.md) · [v0.20.0](LIVE_VERIFICATION_v0.20.0.md) · [v0.19.0](LIVE_VERIFICATION_v0.19.0.md) · [v0.18.0](LIVE_VERIFICATION_v0.18.0.md) · [v0.17.0](LIVE_VERIFICATION_v0.17.0.md) · [v0.16.0](LIVE_VERIFICATION_v0.16.0.md) · [v0.13.0](LIVE_VERIFICATION_v0.13.0.md) · [v0.12.0](LIVE_VERIFICATION_v0.12.0.md) · [v0.11.0](LIVE_VERIFICATION_v0.11.0.md) · [v0.10.0](LIVE_VERIFICATION_v0.10.0.md) · [v0.9.1](LIVE_VERIFICATION_v0.9.1.md) · [v0.9.0](LIVE_VERIFICATION_v0.9.0.md) · [v0.8.1](LIVE_VERIFICATION_v0.8.1.md) · [v0.7.0](LIVE_VERIFICATION_v0.7.0.md)
|
|
136
137
|
**"Where is the reverse-engineered wire protocol for a feature?"** → the `*_RECON.md` design docs: [CHARACTER_RECON](CHARACTER_RECON.md) (Flow character entity protocol), [IMAGE_UPSCALE_RECON](IMAGE_UPSCALE_RECON.md) (`/v1/flow/upsampleImage` wire). Naming convention: one `<FEATURE>_RECON.md` per reverse-engineered surface, kept as the durable spec after the feature ships. Pre-capture research recons: [ASSET_TAGGING_RECON](ASSET_TAGGING_RECON.md) (`@`-mention asset tagging — shipped in v0.40.0, see [LIVE_VERIFICATION_v0.40.0](LIVE_VERIFICATION_v0.40.0.md)).
|
|
137
138
|
**"What was live-verified for the data layer (PR #58)?"** → [LIVE_VERIFICATION_data_layer](LIVE_VERIFICATION_data_layer.md) — 1 Imagen + 1 Veo credit on denon82, 6-layer ledger (file + magic + Pillow + DB rows + CLI round-trip + structlog)
|
|
138
139
|
**"What was live-verified for the video-download feature (#29)?"** → [LIVE_VERIFICATION_video_download](LIVE_VERIFICATION_video_download.md)
|