gflow-cli 0.59.0__tar.gz → 0.60.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.59.0 → gflow_cli-0.60.0}/.codex-plugin/plugin.json +1 -1
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.github/workflows/ci.yml +57 -7
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.github/workflows/deps-watch.yml +3 -1
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.github/workflows/external-pr-triage.yml +9 -1
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.github/workflows/governance-advisory.yml +11 -3
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.github/workflows/governance-benchmark.yml +2 -1
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.github/workflows/main-base-guard.yml +2 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.github/workflows/pages.yml +2 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.github/workflows/release.yml +8 -1
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.github/workflows/scorecard.yml +1 -1
- gflow_cli-0.60.0/.github/workflows/selector-probe.yml +26 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/CHANGELOG.md +84 -1
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/PKG-INFO +2 -2
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/deploy/PR-TRIAGE-AUTOPILOT-OPS.md +28 -4
- gflow_cli-0.60.0/deploy/logrotate-pr-triage +21 -0
- {gflow_cli-0.59.0/website → gflow_cli-0.60.0}/docs/E2E_TESTING.md +159 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/GITHUB.md +87 -0
- gflow_cli-0.60.0/docs/INDEX.md +165 -0
- gflow_cli-0.60.0/docs/LIVE_VERIFICATION_v0.60.0.md +180 -0
- gflow_cli-0.60.0/docs/superpowers/plans/2026-08-21-selector-registry.md +743 -0
- gflow_cli-0.60.0/docs/superpowers/plans/2026-08-25-workflow-hardening-gaps.md +171 -0
- gflow_cli-0.60.0/docs/superpowers/specs/2026-08-21-selector-registry-design.md +307 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/pyproject.toml +3 -3
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/autopilot/Dockerfile.triage +4 -0
- gflow_cli-0.60.0/scripts/autopilot/entrypoint.sh +10 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/autopilot/package-lock.json +48 -36
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/autopilot/package.json +1 -1
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/autopilot/pr_triage_autopilot.py +105 -10
- gflow_cli-0.60.0/scripts/autopilot/run_sandboxed_review.sh +172 -0
- gflow_cli-0.60.0/scripts/canary/register_task.ps1 +79 -0
- gflow_cli-0.60.0/scripts/canary/run_canary.py +362 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/ci/check_repo_hygiene.py +20 -6
- gflow_cli-0.60.0/scripts/dev/live_verify_policy_400_v060.py +142 -0
- gflow_cli-0.60.0/scripts/dev/spike_trpc_origin_referer_401.py +151 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/diag/README.md +1 -0
- gflow_cli-0.60.0/scripts/diag/diag_aisandbox_bearer.py +124 -0
- gflow_cli-0.60.0/scripts/probe/run_probe.py +210 -0
- gflow_cli-0.60.0/scripts/probe/spike_auth_matrix.py +131 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/__init__.py +1 -1
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/client.py +59 -60
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/_common.py +54 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/base.py +24 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/ui_automation.py +103 -27
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/ui_automation_video.py +21 -4
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/diagnostics.py +72 -13
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/errors.py +57 -1
- gflow_cli-0.60.0/src/gflow_cli/flow_selectors/__init__.py +1 -0
- gflow_cli-0.60.0/src/gflow_cli/flow_selectors/grading.py +51 -0
- gflow_cli-0.60.0/src/gflow_cli/flow_selectors/model.py +59 -0
- gflow_cli-0.60.0/src/gflow_cli/flow_selectors/registry.py +63 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_post_json_aisandbox_auth.py +74 -0
- gflow_cli-0.60.0/tests/api/transports/test_policy_400.py +185 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/test_ui_automation.py +16 -3
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/test_ui_automation_batch.py +8 -8
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/autopilot/test_pr_triage_autopilot.py +344 -2
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/conftest.py +26 -2
- gflow_cli-0.60.0/tests/flow_selectors/test_grading.py +67 -0
- gflow_cli-0.60.0/tests/flow_selectors/test_model.py +37 -0
- gflow_cli-0.60.0/tests/flow_selectors/test_registry.py +47 -0
- gflow_cli-0.60.0/tests/flow_selectors/test_report.py +57 -0
- gflow_cli-0.60.0/tests/scripts/test_canary_classify.py +326 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/scripts/test_check_repo_hygiene.py +46 -2
- gflow_cli-0.60.0/tests/scripts/test_workflow_hardening.py +203 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_errors_classification.py +9 -8
- gflow_cli-0.60.0/tests/test_incident_generation_requests.py +94 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_self_documenting_errors.py +34 -5
- gflow_cli-0.60.0/tests/tools/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/uv.lock +53 -53
- {gflow_cli-0.59.0 → gflow_cli-0.60.0/website}/docs/E2E_TESTING.md +159 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/requirements.txt +3 -3
- gflow_cli-0.59.0/docs/INDEX.md +0 -159
- gflow_cli-0.59.0/scripts/autopilot/entrypoint.sh +0 -9
- gflow_cli-0.59.0/scripts/autopilot/run_sandboxed_review.sh +0 -115
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.agents/plugins/marketplace.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/README.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/active.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/branch-review.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/changelog.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/check.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/doc-review.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/issue-assessment.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/issue-resolve.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/known-issues.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/live-verify.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/llm-council.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/next.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/plan.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/pr-council-review.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/predict.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/release.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/scenario.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/sonar.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.claude/commands/gflow/status.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.env.template +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.gitattributes +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.github/CODEOWNERS +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.github/copilot-instructions.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.github/dependabot.yml +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.github/workflows/labels.yml +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.gitignore +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.gitleaks.toml +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.pre-commit-config.yaml +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/.secrets.baseline +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/AGENTS.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/CLAUDE.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/CONFIGURATION.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/CONTRIBUTING.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/DISCLAIMER.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/KNOWN_ISSUES.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/LICENSE +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/README.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/RELEASE.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/ROADMAP.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/conftest.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docker-compose.yml +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/AGENT_GUIDE.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/AGENT_UI_E2E.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/AGENT_UI_RECON.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/ASSET_TAGGING_RECON.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/CHARACTER.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/CHARACTER_RECON.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/CONFIGURATION.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/DATA_LAYER.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/DEMOS.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/INSTRUCTIONS.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_playwright_1.61.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.21.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.22.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.23.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.24.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.25.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.26.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.27.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.27.1.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.28.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.29.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.30.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.31.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.32.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.32.1.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.33.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.34.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.35.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.36.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.37.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.38.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.38.1.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.39.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.40.0-production-readiness.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.40.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.41.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.42.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.43.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.44.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.45.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.46.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.46.1.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.47.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.48.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.49.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.50.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.51.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.52.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.54.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.55.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.56.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.57.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.57.1.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.58.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.59.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/MCP.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/MEDIA_LIBRARY.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/MOVIE.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/PROJECT_STATUS.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/PROMPT_EXPANSION.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/REFERENCE_STRATEGIES.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/SECURITY.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/TOOLS.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/USAGE.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/USER_GUIDE.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/assets/demo-split-pf.gif +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/assets/example-run.gif +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/assets/examples.webp +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/medium_tutorial.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/schemas/movie-handoff.schema.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/sonar-cleanup-tracker.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-08-pr-triage-autopilot/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-09-camoufox-adoption/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-14-storyboarding-and-visual-curation/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-18-asset-tagging/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-19-live-verify/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-19-production-readiness-browser-lifecycle.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-19-production-readiness-driver-cdp-verification.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-19-production-readiness-public-truth.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-19-production-readiness-queue-safety.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-26-character-prompt-polishing/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-26-project-name-management/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-26-self-documenting-errors/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-27-overlay-banner-dismissal/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/SCENARIO.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-04-mcp-tasks/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-04-output-hardening/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-05-issue-317-intra-batch-references/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-05-issue-317-intra-batch-references/SCENARIO.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-05-issue-402-entity-provenance/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-05-issue-402-entity-provenance/SCENARIO.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-05-issue-451-duration-tab-drift/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-05-issue-451-duration-tab-drift/SCENARIO.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-06-driver-delay-jittering/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-06-driver-delay-jittering/SCENARIO.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-06-overlay-changelog-watermark/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-06-overlay-changelog-watermark/SCENARIO.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-06-ui-mode-policy/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-06-ui-mode-policy/SCENARIO.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-14-video-ui-mode-policy/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-14-video-ui-mode-policy/SCENARIO.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/research/2026-06-27-tool-abstraction-evaluation.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/specs/2026-06-29-issue-assessment-workflow-design.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/specs/2026-07-04-pr-triage-autopilot-design.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/specs/2026-07-18-asset-tagging-design.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/specs/2026-07-19-live-verify-design.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/specs/2026-07-19-production-readiness-hardening-design.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/spikes/2026-07-09-camoufox-waf-403.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/spikes/2026-07-12-ui-cohort-backend-config.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/spikes/2026-07-17-production-readiness-assessment.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/spikes/2026-08-01-mcp-2026-07-28-spec-impact.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/spikes/2026-08-14-video-model-capability-matrix.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/docs/superpowers/spikes/2026-08-15-picker-tile-alt-text.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/eval/pr_triage_eval.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/eval/pr_triage_fixtures.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/examples/README.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/examples/batch_from_config.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/examples/multi_prompt_t2i.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/examples/sample_config.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/examples/sample_prompts.txt +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/examples/single_image_t2i.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/examples/workflow_chain.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/index.html +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/llms.txt +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/samples/README.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/samples/captured/01_upload_image.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/samples/captured/04_archive_workflow.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/samples/captured/05_createProject.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/samples/captured/06_batchGenerateImages.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/samples/captured/12_create_scene.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/samples/captured/14_get_scene_workflows.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/autopilot/pr_triage_gate.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/ci/check_doc_links.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/ci/check_materiality.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/ci/check_release_artifacts.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/ci/check_test_count.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/ci/check_website_docs_pii.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/ci/generate_website_docs.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/debug_editor.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/debug_gen_settings.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/debug_settings.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/_recording_client.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/_spike_common.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/active_plan.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/capture_frames_mode_trigger_ligature.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/capture_locale_invariants.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/capture_lower_priority_model_cost.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/capture_project_listing.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/capture_r2v_ingredient_lifecycle.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/capture_sidebar_state_dom.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/capture_video_model_capability_matrix.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/character_create_spike.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/character_create_spike_v2.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/dump_character_selectors.js +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/incident_bundle_quality.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/live_verify_mcp_tasks.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/make_project.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/materiality_backtest.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/patch_character.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/skillopt/README.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/skillopt/harness.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/skillopt/tasks.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/sonar-local-scan.sh +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/sonar-pre-push-gate.sh +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_char_editor_dom.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_char_gen_capture.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_character_prompt_format.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_incident_live.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_issue313_agent_mode_controls.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_issue314_picker_filename_search.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_issue404_count_tabs_recon.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_mode_roundtrip.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_mode_switch_agentic_to_classic.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_movie_picker_select.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_movie_voice_list.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_omni_flash_i2v_ui_recon.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_patch_entity.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/dev/spike_patchright.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/diag/capture_flow_traffic.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/diag/memory_profile.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/diag/recaptcha_mint.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/diag/spike_387_openai_compat.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/e2e/capture_agent_toggle.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/record_demo.ps1 +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/smoke_image.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/smoke_video_editor.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/smoke_worker_style.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/spike_waf_camoufox.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/scripts/verify_chrome_auth_viability.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/skills/README.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/skills/changelog/SKILL.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/skills/check/SKILL.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/skills/doc-review/SKILL.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/skills/gflow-cli/SKILL.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/skills/issue-assessment/SKILL.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/skills/issue-resolve/SKILL.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/skills/known-issues/SKILL.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/skills/live-verify/SKILL.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/skills/llm-council/SKILL.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/skills/plan/SKILL.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/skills/pr-council-review/SKILL.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/skills/predict/SKILL.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/skills/release/SKILL.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/skills/scenario/SKILL.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/skills/sonar/SKILL.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/skills/status/SKILL.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/sonar-project.properties +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/__main__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/_cli_helpers.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/_engine.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/_retry.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/character.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/dto.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/image.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/image_upscale.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/recaptcha.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/routes.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/scene.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/drivers/agentic.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/drivers/base.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/drivers/classic.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/drivers/factory.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/mode_control.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/api/video.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/auth/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/auth/base.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/auth/cookies.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/auth/factory.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/auth/real_chrome.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/auth/strategies.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/auth/verification.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/browser_manager.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/chain.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/chain_manifest.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/cli.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/cli_character.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/cli_data.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/cli_doctor.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/cli_image.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/cli_instructions.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/cli_models.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/cli_movie.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/cli_project.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/cli_run.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/cli_scene.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/cli_tools.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/cli_video.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/composition.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/config.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/chain_repo.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/migrations/0007_queue.sql +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/migrations/0008_add_operation_expanded_prompt.sql +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/migrations/0009_queue_claims.sql +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/models.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/queries.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/recorder.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/redaction.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/repository.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/data/store.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/exceptions.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/file_integrity.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/image_batch.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/json_output.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/mcp/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/mcp/prompts.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/mcp/resources.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/mcp/server.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/mcp/setup.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/mcp/tasks_extension.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/mcp/tools.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/media.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/movie_manifest.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/observability.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/paths.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/profile_lease.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/profile_store.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/redaction.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/services/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/services/catalog_sync.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/services/character_create.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/services/doctor.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/services/mentions.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/storage.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/banned.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/builtin/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/builtin/creative-director.toml +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/builtin/reverse-engineer.toml +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/builtin/storyboard.toml +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/expander.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/invocation.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/loader.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/registry.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/runtime.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/spec.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/ui/app.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/ui/server.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/update_check.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/winsec.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/worker/codec.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/worker/daemon.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/src/gflow_cli/worker/queue.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tasks/lessons.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/test_assets/sample_batch.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/test_assets/sample_batch.tsv +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/test_assets/sample_batch_invalid.tsv +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/fixtures/character_gen_response.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/fixtures/patch_entity_response.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_aisandbox_auth_error.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_bearer_redaction.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_character.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_client.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_client_character.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_client_delete_characters.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_client_errors.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_client_generate_character.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_client_image.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_client_incidents.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_client_launch_kwargs.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_client_patch_entity.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_client_scene.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_client_upscale.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_concurrency.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_dto.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_engine.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_image.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_image_dto.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_image_upscale.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_recaptcha.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_retry.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_routes.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_routes_character.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_routes_scene.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_sapisidhash_helper.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_scene_models.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_video.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/test_video_request.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/conftest.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/drivers/test_agentic.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/drivers/test_classic.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/drivers/test_factory.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/drivers/test_ui_mode.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/test_agentic_cohort_detection.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/test_base.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/test_bearer.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/test_common.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/test_factory.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/test_fingerprint.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/test_mode_control.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/test_sapisidhash.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/test_selector_symmetry.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/test_transport_timeout.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/test_ui_automation_video.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/api/transports/test_ui_character_editor.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/auth/strategies/test_factory.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/auth/strategies/test_strategies.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/auth/test_cookies.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/auth/test_real_chrome.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/auth/test_verification.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/auth/test_windows_acl.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_auth_status.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_auth_list.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_character.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_character_create.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_data.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_data_errors.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_data_errors_retention.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_data_sync.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_doctor.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_image.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_image_selector_drift.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_image_upscale.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_image_uuid_ref_enrichment.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_instructions.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_models.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_movie.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_run.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_scene.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_tools.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_video.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_cli_video_chain.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_error_handling.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_failure_funnel.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_helpers.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_incident_output.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_movie_manifest.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_movie_manifest_style_variants.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_predictable_output.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_settings_validation.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/composition/test_character.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/composition/test_compose_prompt.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/composition/test_handoff.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/composition/test_style_variants.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/composition/test_style_variants_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/data/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/data/test_chain_repo.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/data/test_failure_recording.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/data/test_find_incomplete_character.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/data/test_models.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/data/test_packaging.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/data/test_recorder.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/data/test_recorder_character.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/data/test_redaction.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/data/test_repository.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/data/test_scene_persistence.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/data/test_settings_and_errors.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/data/test_store.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/data/test_store_migrations.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/dev/test_recording_client.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/conftest.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_agentic_count_enforcement_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_asset_tagging_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_cancellation_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_chain_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_character_create_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_classic_count_setter_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_crash_recovery_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_daemon_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_data_layer_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_data_sync_names_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_entity_provenance_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_entity_smuggling_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_i2v_flags_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_image_batch_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_image_uuid_ref_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_incident_quality_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_json_output_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_live_agentic_instructions.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_project_naming_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_refresh_on_miss_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_scene_compose_live.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_sidebar_recovery_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_tools_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_transports_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_video_r2v_uuid_name_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/asset_tagging.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/auth.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/auth_login.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/character_create.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/character_read.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/conftest.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/duration_tab_drift.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/entity_provenance.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/image.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/image_batch_references.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/image_upscale.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/incident_diagnostics.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/instructions.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/locale_picker_include.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/mcp_tasks.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/media_picker_tiers.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/output_hardening.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/test_asset_tagging_steps.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/test_auth_login_steps.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/test_auth_steps.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/test_character_create_steps.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/test_character_read_steps.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/test_image_steps.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/test_image_upscale_steps.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/test_incident_diagnostics_steps.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/test_instructions_steps.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/test_locale_picker_include_steps.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/test_mcp_tasks_steps.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/test_media_picker_tiers_steps.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/test_output_hardening_steps.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/test_step_collision_guard.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/test_video_agent_ui_steps.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/test_video_chain_steps.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/video_agent_ui.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/features/video_chain.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/fixtures/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/fixtures/doctor_env.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/fixtures/listing_payload.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/fixtures/seeded_catalog.py +0 -0
- {gflow_cli-0.59.0/tests/image_batch → gflow_cli-0.60.0/tests/flow_selectors}/__init__.py +0 -0
- {gflow_cli-0.59.0/tests/integration → gflow_cli-0.60.0/tests/image_batch}/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/image_batch/test_image_manifest.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/image_batch/test_jitter_config.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/image_batch/test_observability_events.py +0 -0
- {gflow_cli-0.59.0/tests/services → gflow_cli-0.60.0/tests/integration}/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/integration/conftest.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/integration/constants.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/integration/test_expander_gateway.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/integration/test_storage_gcs.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/integration/test_storage_s3.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/mcp/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/mcp/conftest.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/mcp/test_auth_status_tool.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/mcp/test_cli_parity.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/mcp/test_error_funnel.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/mcp/test_http_transport.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/mcp/test_known_issues_resource.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/mcp/test_no_spend.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/mcp/test_rate_limit_envelope.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/mcp/test_resources.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/mcp/test_server.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/mcp/test_setup.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/mcp/test_stdio_transport.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/mcp/test_tasks_extension.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/mcp/test_tools_helpers.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/mcp/test_tools_instructions.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/mcp/test_tools_wired.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/scripts/test_check_materiality.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/scripts/test_check_release_artifacts.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/scripts/test_check_test_count.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/scripts/test_check_website_docs_pii.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/scripts/test_codex_plugin.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/scripts/test_generate_website_docs.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/scripts/test_incident_bundle_quality.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/scripts/test_materiality_backtest.py +0 -0
- {gflow_cli-0.59.0/tests/smoke → gflow_cli-0.60.0/tests/services}/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/services/test_catalog_sync.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/services/test_character_create_redaction.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/services/test_character_create_saga.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/services/test_doctor.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/services/test_mentions_observability.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/services/test_mentions_parse.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/services/test_mentions_resolve.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/services/test_resolve_and_apply.py +0 -0
- {gflow_cli-0.59.0/tests/tools → gflow_cli-0.60.0/tests/smoke}/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/smoke/test_profile_account_smoke.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/smoke/test_real_flow.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_auth.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_browser_manager.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_chain.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_chain_manifest.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_cli_data.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_cli_project.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_config.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_conftest_isolation.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_data_queries.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_diagnostics_bundle.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_diagnostics_events.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_diagnostics_journal.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_diagnostics_recorder.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_diagnostics_retention.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_diagnostics_sanitize.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_documentation_gate.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_duration_tab_drift.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_entity_provenance.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_errors.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_image_batch_references.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_json_output.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_marker_registry.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_media.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_observability.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_overlay_banner_dismissal.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_paths.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_playwright_pin.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_profile_lease.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_profile_lease_subprocess.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_profile_store.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_smoke.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/test_update_check.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/tools/test_banned.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/tools/test_expander.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/tools/test_invocation.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/tools/test_loader.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/tools/test_registry.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/tools/test_runtime.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/tools/test_spec.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/ui/test_app.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/worker/test_codec.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/worker/test_daemon.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/worker/test_mcp_daemon_race.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/worker/test_queue.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/worker/test_queue_multiprocess.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/tests/worker/test_queue_reconciliation.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/CHARACTER.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/CONFIGURATION.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/DATA_LAYER.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/INSTRUCTIONS.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/KNOWN_ISSUES.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/MCP.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/MEDIA_LIBRARY.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/MOVIE.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/PROMPT_EXPANSION.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/SECURITY.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/TOOLS.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/USAGE.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/USER_GUIDE.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/agents.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/index.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/installation.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/onboarding-mockup.html +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/onboarding.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/docs/stylesheets/extra.css +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/mkdocs.yml +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.60.0}/website/requirements.in +0 -0
|
@@ -26,6 +26,7 @@ jobs:
|
|
|
26
26
|
steps:
|
|
27
27
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
28
28
|
with:
|
|
29
|
+
persist-credentials: false
|
|
29
30
|
fetch-depth: 0 # full history so gitleaks can diff against base
|
|
30
31
|
|
|
31
32
|
- name: Run gitleaks
|
|
@@ -39,8 +40,10 @@ jobs:
|
|
|
39
40
|
runs-on: ubuntu-latest
|
|
40
41
|
steps:
|
|
41
42
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
43
|
+
with:
|
|
44
|
+
persist-credentials: false
|
|
42
45
|
- name: Install uv
|
|
43
|
-
uses: astral-sh/setup-uv@
|
|
46
|
+
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
44
47
|
- name: Audit locked dependencies for known CVEs
|
|
45
48
|
# Fails the build on any known advisory. Accept later via: pip-audit --ignore-vuln <GHSA-id>
|
|
46
49
|
#
|
|
@@ -57,6 +60,42 @@ jobs:
|
|
|
57
60
|
# dependabot ecosystem — bump by hand when it drifts).
|
|
58
61
|
uvx pip-audit==2.10.1 -r requirements-audit.txt
|
|
59
62
|
|
|
63
|
+
# ── Security gate: static analysis of the workflows themselves ───────────
|
|
64
|
+
# Everything else in this file audits the Python we ship. Nothing audited the
|
|
65
|
+
# CI that ships it, and CI is a supply-chain surface in its own right: it
|
|
66
|
+
# holds a repository token, it publishes to PyPI, and its inputs (branch
|
|
67
|
+
# names, PR titles, fork content) are attacker-controllable text.
|
|
68
|
+
#
|
|
69
|
+
# zizmor is what turns that into a gate. It found real defects on its first
|
|
70
|
+
# run over this repo (#565): 12 checkouts persisting the job token into the
|
|
71
|
+
# workspace, and `${{ github.base_ref }}` interpolated straight into a
|
|
72
|
+
# governance-advisory shell script. Both are fixed; this job is what stops
|
|
73
|
+
# them coming back one copy-pasted step at a time.
|
|
74
|
+
workflow-audit:
|
|
75
|
+
name: Workflow audit (zizmor)
|
|
76
|
+
runs-on: ubuntu-latest
|
|
77
|
+
steps:
|
|
78
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
79
|
+
with:
|
|
80
|
+
persist-credentials: false
|
|
81
|
+
|
|
82
|
+
- name: Install uv
|
|
83
|
+
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
84
|
+
|
|
85
|
+
- name: Audit workflows (zizmor)
|
|
86
|
+
# --offline: the online audits need a GH token and reach the network, so
|
|
87
|
+
# they would make this gate non-deterministic and unrunnable on fork
|
|
88
|
+
# PRs. Action freshness/pinning is already covered by Dependabot plus
|
|
89
|
+
# Scorecard's Pinned-Dependencies check.
|
|
90
|
+
# --min-severity low: informational findings are advisory, not defects.
|
|
91
|
+
# The one open today is `superfluous-actions` on
|
|
92
|
+
# softprops/action-gh-release; rewriting the release publisher is not
|
|
93
|
+
# a hardening change and is deliberately declined (docs/GITHUB.md).
|
|
94
|
+
# Version pinned for a reproducible gate — uvx has no Dependabot
|
|
95
|
+
# ecosystem, so bump it by hand (the pin is asserted by
|
|
96
|
+
# tests/scripts/test_workflow_hardening.py, which fails if the two drift).
|
|
97
|
+
run: uvx zizmor==1.29.0 --offline --min-severity low .github/workflows/
|
|
98
|
+
|
|
60
99
|
# ── Supply-chain gate: resolve WITHOUT the lockfile ───────────────────────
|
|
61
100
|
# Every other job installs via `uv sync`, which honours uv.lock. That means CI
|
|
62
101
|
# never exercises the version RANGES in pyproject.toml — the exact blind spot
|
|
@@ -73,9 +112,11 @@ jobs:
|
|
|
73
112
|
runs-on: ubuntu-latest
|
|
74
113
|
steps:
|
|
75
114
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
115
|
+
with:
|
|
116
|
+
persist-credentials: false
|
|
76
117
|
|
|
77
118
|
- name: Install uv
|
|
78
|
-
uses: astral-sh/setup-uv@
|
|
119
|
+
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
79
120
|
|
|
80
121
|
- name: Set up Python
|
|
81
122
|
run: uv python install 3.13
|
|
@@ -127,18 +168,24 @@ jobs:
|
|
|
127
168
|
python-version: ["3.11", "3.12", "3.13"]
|
|
128
169
|
steps:
|
|
129
170
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
171
|
+
with:
|
|
172
|
+
persist-credentials: false
|
|
130
173
|
|
|
131
174
|
- name: Install uv
|
|
132
|
-
uses: astral-sh/setup-uv@
|
|
175
|
+
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
133
176
|
|
|
134
177
|
- name: Set up Python
|
|
135
178
|
run: uv python install ${{ matrix.python-version }}
|
|
136
179
|
|
|
180
|
+
# --frozen: install from the committed uv.lock without re-resolving it.
|
|
181
|
+
# Plain `uv sync` REWRITES uv.lock in place, which would silently repair
|
|
182
|
+
# the exact version drift the hygiene gate below exists to catch.
|
|
137
183
|
- name: Install deps
|
|
138
|
-
run: uv sync --extra dev
|
|
184
|
+
run: uv sync --frozen --extra dev
|
|
139
185
|
|
|
140
|
-
-
|
|
141
|
-
|
|
186
|
+
# --no-sync for the same reason: `uv run` re-locks before running.
|
|
187
|
+
- name: Repo hygiene (no artefacts, no hardcoded paths, version lockstep)
|
|
188
|
+
run: uv run --no-sync python scripts/ci/check_repo_hygiene.py
|
|
142
189
|
|
|
143
190
|
- name: Documentation links
|
|
144
191
|
run: uv run python scripts/ci/check_doc_links.py
|
|
@@ -196,9 +243,11 @@ jobs:
|
|
|
196
243
|
os: [windows-latest, macos-latest, ubuntu-latest]
|
|
197
244
|
steps:
|
|
198
245
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
246
|
+
with:
|
|
247
|
+
persist-credentials: false
|
|
199
248
|
|
|
200
249
|
- name: Install uv
|
|
201
|
-
uses: astral-sh/setup-uv@
|
|
250
|
+
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
202
251
|
|
|
203
252
|
- name: Set up Python
|
|
204
253
|
run: uv python install 3.13
|
|
@@ -237,6 +286,7 @@ jobs:
|
|
|
237
286
|
steps:
|
|
238
287
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
239
288
|
with:
|
|
289
|
+
persist-credentials: false
|
|
240
290
|
fetch-depth: 0 # shallow clones break blame / new-code detection
|
|
241
291
|
|
|
242
292
|
- name: Download coverage report
|
|
@@ -29,9 +29,11 @@ jobs:
|
|
|
29
29
|
runs-on: ubuntu-latest
|
|
30
30
|
steps:
|
|
31
31
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
32
|
+
with:
|
|
33
|
+
persist-credentials: false
|
|
32
34
|
|
|
33
35
|
- name: Install uv
|
|
34
|
-
uses: astral-sh/setup-uv@
|
|
36
|
+
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
35
37
|
|
|
36
38
|
- name: Set up Python
|
|
37
39
|
run: uv python install 3.13
|
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
name: External PR Triage
|
|
2
2
|
|
|
3
|
+
# `pull_request_target` is deliberate and is the reason this file is the
|
|
4
|
+
# highest-risk surface in the repo: labelling a fork's PR needs a token forks
|
|
5
|
+
# cannot be given, and `pull_request` does not have one. The trigger is only
|
|
6
|
+
# unsafe when the workflow CHECKS OUT or EXECUTES the untrusted head — this one
|
|
7
|
+
# never does: there is no `actions/checkout` step at all, every PR field is read
|
|
8
|
+
# from `context.payload` inside github-script, and permissions are scoped to
|
|
9
|
+
# `issues`/`pull-requests` write. Keep all three properties or drop the
|
|
10
|
+
# suppression with them.
|
|
3
11
|
on:
|
|
4
|
-
pull_request_target:
|
|
12
|
+
pull_request_target: # zizmor: ignore[dangerous-triggers]
|
|
5
13
|
types: [opened, reopened, synchronize, ready_for_review, edited]
|
|
6
14
|
|
|
7
15
|
permissions:
|
|
@@ -21,13 +21,21 @@ jobs:
|
|
|
21
21
|
steps:
|
|
22
22
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
23
23
|
with:
|
|
24
|
+
persist-credentials: false
|
|
24
25
|
fetch-depth: 0 # full history so `git diff origin/<base>..HEAD` resolves
|
|
25
26
|
|
|
26
27
|
- name: Install uv
|
|
27
|
-
uses: astral-sh/setup-uv@
|
|
28
|
+
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
28
29
|
|
|
29
30
|
- name: Classify touched paths (advisory, never blocks)
|
|
31
|
+
# BASE_REF arrives through `env:`, never interpolated into the script
|
|
32
|
+
# body: a branch name is attacker-supplied text, and `${{ ... }}` is
|
|
33
|
+
# substituted before the shell ever sees it (zizmor: template-injection).
|
|
34
|
+
# The fetch is belt-and-braces — `fetch-depth: 0` above already brings
|
|
35
|
+
# the base branch down — and needs no credential on a public repo.
|
|
36
|
+
env:
|
|
37
|
+
BASE_REF: ${{ github.base_ref }}
|
|
30
38
|
run: |
|
|
31
|
-
git fetch --no-tags origin "$
|
|
39
|
+
git fetch --no-tags origin "$BASE_REF" || true
|
|
32
40
|
uv run python scripts/ci/check_materiality.py \
|
|
33
|
-
--base "origin/$
|
|
41
|
+
--base "origin/$BASE_REF"
|
|
@@ -20,10 +20,11 @@ jobs:
|
|
|
20
20
|
steps:
|
|
21
21
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
22
22
|
with:
|
|
23
|
+
persist-credentials: false
|
|
23
24
|
fetch-depth: 0 # full history — the backtest replays every commit
|
|
24
25
|
|
|
25
26
|
- name: Install uv
|
|
26
|
-
uses: astral-sh/setup-uv@
|
|
27
|
+
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
27
28
|
|
|
28
29
|
- name: Run backtest (advisory; writes to job summary)
|
|
29
30
|
run: uv run python scripts/dev/materiality_backtest.py >> "$GITHUB_STEP_SUMMARY"
|
|
@@ -27,6 +27,8 @@ jobs:
|
|
|
27
27
|
runs-on: ubuntu-latest
|
|
28
28
|
steps:
|
|
29
29
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
30
|
+
with:
|
|
31
|
+
persist-credentials: false
|
|
30
32
|
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
|
|
31
33
|
with:
|
|
32
34
|
python-version: "3.12"
|
|
@@ -25,10 +25,17 @@ jobs:
|
|
|
25
25
|
steps:
|
|
26
26
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
27
27
|
with:
|
|
28
|
+
persist-credentials: false
|
|
28
29
|
fetch-depth: 0
|
|
29
30
|
|
|
30
31
|
- name: Install uv
|
|
31
|
-
uses: astral-sh/setup-uv@
|
|
32
|
+
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
33
|
+
with:
|
|
34
|
+
# This is the one workflow that publishes artefacts (PyPI + GitHub
|
|
35
|
+
# Release), so it must not restore a cache any other workflow can
|
|
36
|
+
# write: a poisoned entry would reach a signed release. Releases are
|
|
37
|
+
# rare; the cold resolve costs seconds (zizmor: cache-poisoning).
|
|
38
|
+
enable-cache: false
|
|
32
39
|
|
|
33
40
|
- name: Set up Python
|
|
34
41
|
run: uv python install 3.12
|
|
@@ -47,6 +47,6 @@ jobs:
|
|
|
47
47
|
retention-days: 5
|
|
48
48
|
|
|
49
49
|
- name: Upload to code-scanning
|
|
50
|
-
uses: github/codeql-action/upload-sarif@
|
|
50
|
+
uses: github/codeql-action/upload-sarif@db488ddef3bf6cb639b32c2e9a7c0a7ea8271d28 # v4
|
|
51
51
|
with:
|
|
52
52
|
sarif_file: results.sarif
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
name: Selector drift probe
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
schedule:
|
|
5
|
+
- cron: "0 5 * * *"
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
probe:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
timeout-minutes: 15
|
|
15
|
+
if: github.repository == 'ffroliva/gflow-cli'
|
|
16
|
+
steps:
|
|
17
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
18
|
+
with: { persist-credentials: false }
|
|
19
|
+
- uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
20
|
+
- run: uv sync --frozen
|
|
21
|
+
- run: uv run playwright install chromium --with-deps
|
|
22
|
+
- name: Probe
|
|
23
|
+
env:
|
|
24
|
+
GFLOW_CI_SESSION_TOKEN: ${{ secrets.GFLOW_CI_SESSION_TOKEN }}
|
|
25
|
+
GFLOW_CI_PROJECT_ID: ${{ secrets.GFLOW_CI_PROJECT_ID }}
|
|
26
|
+
run: uv run python scripts/probe/run_probe.py --surface editor
|
|
@@ -7,6 +7,88 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.60.0] — 2026-08-25
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **Selector registry + nightly CI drift probe
|
|
15
|
+
([#404](https://github.com/ffroliva/gflow-cli/issues/404),
|
|
16
|
+
[#493](https://github.com/ffroliva/gflow-cli/issues/493),
|
|
17
|
+
[#313](https://github.com/ffroliva/gflow-cli/issues/313)).** New
|
|
18
|
+
`gflow_cli.flow_selectors` package: a structured, enumerable inventory of the
|
|
19
|
+
Flow DOM selectors gflow depends on (`Surface`, `Selector`) plus a pure
|
|
20
|
+
grader (`HIT` / `FALLBACK` / `AMBIGUOUS` / `MISS` / `EXPECTED_ABSENT`), so
|
|
21
|
+
selector drift is *named* rather than inferred from a failing test. A $0
|
|
22
|
+
probe (`scripts/probe/run_probe.py`, driven by the `selector-probe` workflow
|
|
23
|
+
on `schedule` + `workflow_dispatch` only) walks the registry against a live
|
|
24
|
+
editor: navigate and read only, never generates. Exit 0 clean / 1 drift /
|
|
25
|
+
2 inconclusive — an expired token or dead project is never published as
|
|
26
|
+
drift.
|
|
27
|
+
|
|
28
|
+
- **Incident bundles record what was submitted
|
|
29
|
+
([#528](https://github.com/ffroliva/gflow-cli/issues/528)).**
|
|
30
|
+
`network.json` gains a `generation_requests` array carrying a counts-only
|
|
31
|
+
summary of each outgoing generation submit (body size, reference-entity
|
|
32
|
+
count, reference-field count). The reference shape that triggers a policy 400
|
|
33
|
+
was previously visible only in the stderr stream, so bundles attached to an
|
|
34
|
+
issue could not be diagnosed. Counts and booleans only — no key names, field
|
|
35
|
+
values, or prompt text — matching the existing §5.3 retention boundary.
|
|
36
|
+
|
|
37
|
+
### Changed
|
|
38
|
+
|
|
39
|
+
- **All labs.google requests now carry `origin`/`referer`
|
|
40
|
+
([#578](https://github.com/ffroliva/gflow-cli/pull/578)).** Header
|
|
41
|
+
construction moved into a single `_request_headers()` shared by
|
|
42
|
+
`_post_json`/`_patch_json`/`_get_json`, which previously assembled headers
|
|
43
|
+
inline three times and could diverge per verb. The labs lane now sends the
|
|
44
|
+
same `origin`/`referer` every other lane already sent. A live A/B against
|
|
45
|
+
`project.createProject` showed these headers are **not** required — an
|
|
46
|
+
origin-less mutation still returns 200 — so this is consistency and
|
|
47
|
+
defence-in-depth, not a fix for any observed failure.
|
|
48
|
+
|
|
49
|
+
### Fixed
|
|
50
|
+
|
|
51
|
+
- **Content-policy 400s are no longer misclassified as `WireFormatError`
|
|
52
|
+
([#528](https://github.com/ffroliva/gflow-cli/issues/528)).** An HTTP 400 from
|
|
53
|
+
`flowMedia:batchGenerateImages` or `batchAsyncGenerateVideo*` now raises
|
|
54
|
+
`ContentPolicyError` with remediation that names the levers that actually
|
|
55
|
+
work — reduce to a single face-bearing reference, replace age-explicit person
|
|
56
|
+
descriptors with relational or role nouns — and states outright that
|
|
57
|
+
shortening the prompt does not help. Previously these surfaced as "the
|
|
58
|
+
request was rejected as malformed… retry with a simpler prompt text", which
|
|
59
|
+
sends operators down a path that cannot succeed. Same defect shape as
|
|
60
|
+
[#379](https://github.com/ffroliva/gflow-cli/issues/379) (429), one status
|
|
61
|
+
over, and the self-documenting-errors goal of
|
|
62
|
+
[#380](https://github.com/ffroliva/gflow-cli/issues/380).
|
|
63
|
+
- **Video generation gained the 429 branch the image path got in #379.** A
|
|
64
|
+
quota hit on `batchAsyncGenerateVideo*` raised `WireFormatError` instead of
|
|
65
|
+
`RateLimitError`, losing `Retry-After` and the retryable classification.
|
|
66
|
+
- **`generate_images_batch` no longer reports a bare, remediation-free
|
|
67
|
+
`GFlowError`** when every response failed — it classifies the first error the
|
|
68
|
+
same way the single-prompt path does.
|
|
69
|
+
|
|
70
|
+
### Security
|
|
71
|
+
|
|
72
|
+
- **CI/CD supply-chain hardening
|
|
73
|
+
([#565](https://github.com/ffroliva/gflow-cli/issues/565)).** Every
|
|
74
|
+
`actions/checkout` step now sets `persist-credentials: false` (12 existing
|
|
75
|
+
steps fixed across `ci.yml`, `deps-watch.yml`, `governance-advisory.yml`,
|
|
76
|
+
`governance-benchmark.yml`, `main-base-guard.yml`, `pages.yml` and
|
|
77
|
+
`release.yml`); the default leaves the job token in `.git/config` for the rest
|
|
78
|
+
of the job. No workflow needed it — releases publish over PyPI Trusted
|
|
79
|
+
Publishing (OIDC) and Pages deploys over `actions/deploy-pages`. A new
|
|
80
|
+
`workflow-audit` job runs [zizmor](https://github.com/zizmorcore/zizmor)
|
|
81
|
+
(pinned, `--offline`) over `.github/workflows/` on every push and PR, so the
|
|
82
|
+
class cannot come back. Its first run also caught two defects the manual pass
|
|
83
|
+
missed: `${{ github.base_ref }}` interpolated directly into a
|
|
84
|
+
`governance-advisory.yml` shell script (template injection — the value now
|
|
85
|
+
arrives through `env:`), and a shared uv cache restored by the publishing
|
|
86
|
+
release job (cache poisoning — caching is now off there). The
|
|
87
|
+
`pull_request_target` trigger in `external-pr-triage.yml` is suppressed inline
|
|
88
|
+
with its rationale, and a changelog-guard workflow was evaluated and declined
|
|
89
|
+
— both decisions recorded in
|
|
90
|
+
[docs/GITHUB.md § Workflow Security Gates](docs/GITHUB.md#workflow-security-gates).
|
|
91
|
+
|
|
10
92
|
## [0.59.0] — 2026-08-16
|
|
11
93
|
|
|
12
94
|
### Added
|
|
@@ -3073,7 +3155,8 @@ shell-script template that branches on these codes.
|
|
|
3073
3155
|
|
|
3074
3156
|
First skeleton. Not functional end-to-end yet.
|
|
3075
3157
|
|
|
3076
|
-
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.
|
|
3158
|
+
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.60.0...HEAD
|
|
3159
|
+
[0.60.0]: https://github.com/ffroliva/gflow-cli/compare/v0.59.0...v0.60.0
|
|
3077
3160
|
[0.59.0]: https://github.com/ffroliva/gflow-cli/compare/v0.58.0...v0.59.0
|
|
3078
3161
|
[0.58.0]: https://github.com/ffroliva/gflow-cli/compare/v0.57.1...v0.58.0
|
|
3079
3162
|
[0.57.1]: https://github.com/ffroliva/gflow-cli/compare/v0.57.0...v0.57.1
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: gflow-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.60.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
|
|
@@ -58,7 +58,7 @@ Requires-Dist: numpy>=1.24; extra == 'dev'
|
|
|
58
58
|
Requires-Dist: pyright>=1.1.0; extra == 'dev'
|
|
59
59
|
Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
|
|
60
60
|
Requires-Dist: pytest>=8.0.0; extra == 'dev'
|
|
61
|
-
Requires-Dist: ruff==0.16.
|
|
61
|
+
Requires-Dist: ruff==0.16.4; extra == 'dev'
|
|
62
62
|
Provides-Extra: gcs
|
|
63
63
|
Requires-Dist: gcsfs>=2024.2.0; extra == 'gcs'
|
|
64
64
|
Requires-Dist: universal-pathlib>=0.2.5; extra == 'gcs'
|
|
@@ -16,6 +16,8 @@ The autopilot orchestrator (`scripts/autopilot/pr_triage_autopilot.py`) runs as
|
|
|
16
16
|
| `TELEGRAM_USER_ID` | Autopilot orchestrator (host) | The chat ID to receive triage alert messages. |
|
|
17
17
|
| `PR_TRIAGE_ENGINE` | Autopilot orchestrator (host), optional | Review engine selector. Default `council-claude`; any other value exits at startup (`council-multi-cli` is reserved backlog). |
|
|
18
18
|
| `HERMES_OPS_DIR` | Autopilot orchestrator (host), optional | Location of the hermes-ops checkout hosting the Resend email notifier. Default `/opt/hermes-ops`. |
|
|
19
|
+
| `GH_SANDBOX_TOKEN` | Review **container** | Fine-grained **read-only** PAT for the repo under review. The container only reads the PR; the host posts the comment. If unset the orchestrator falls back and raises an alert rather than degrading silently. Stored in the SOPS secret store. |
|
|
20
|
+
| `GFLOW_TRIAGE_MEMORY_DIR` | Autopilot orchestrator (host), optional | Council memory directory mounted read-only for D5. Set it only to override the XDG default (`$XDG_DATA_HOME/gflow-cli/memory`, i.e. `~/.local/share/gflow-cli/memory`). **Never put a machine-specific path in the cron line** — see §2. |
|
|
19
21
|
| `RESEND_API_KEY` | Email notifier (hermes-ops) | Resend API key consumed by `$HERMES_OPS_DIR/scripts/notify/email_notify.py`. |
|
|
20
22
|
| `HERMES_NOTIFY_EMAIL_TO` | Email notifier (hermes-ops) | Recipient address for high-signal triage emails. |
|
|
21
23
|
| `HERMES_NOTIFY_EMAIL_FROM` | Email notifier (hermes-ops) | Verified sender address for the Resend account. |
|
|
@@ -28,8 +30,19 @@ The autopilot orchestrator (`scripts/autopilot/pr_triage_autopilot.py`) runs as
|
|
|
28
30
|
|
|
29
31
|
Deploy the following layout on the VPS:
|
|
30
32
|
- `/opt/gflow-cli`: Dedicated git repository checkout representing the active branch.
|
|
31
|
-
-
|
|
32
|
-
|
|
33
|
+
- `~hermes/.local/share/gflow-cli/memory`: Council memory namespace, mounted read-only into the sandbox for dimension D5.
|
|
34
|
+
|
|
35
|
+
Create the memory directory once, as the user the cron runs under:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
sudo -u hermes mkdir -p ~hermes/.local/share/gflow-cli/memory
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
An **empty** directory is a valid deployment — D5 then reports that no memory is available, and the other 13 dimensions run normally. Populate it only if you want the council to consult durable project memory.
|
|
42
|
+
|
|
43
|
+
> **The memory path is resolved by the orchestrator, never hardcoded.** Precedence is `--memory-dir` > `$GFLOW_TRIAGE_MEMORY_DIR` > `$XDG_DATA_HOME/gflow-cli/memory` (XDG default, falling back to `~/.local/share`). `XDG_DATA_HOME` is the correct slot per the XDG Base Directory Specification: council memory is durable knowledge that should be backed up, not regenerable cache or throwaway state.
|
|
44
|
+
>
|
|
45
|
+
> The orchestrator validates the resolved path on the host and refuses to start with an actionable error if it is missing, rather than failing later inside the container.
|
|
33
46
|
|
|
34
47
|
---
|
|
35
48
|
|
|
@@ -51,7 +64,7 @@ Ensure `iptables` is installed on the host VPS. If `iptables` permissions are wi
|
|
|
51
64
|
Configure a cron job checking every hour on the hour under the `hermes` system user:
|
|
52
65
|
|
|
53
66
|
```cron
|
|
54
|
-
0 * * * * set -a; . /opt/hermes/.env 2>/dev/null; set +a; cd /opt/gflow-cli && uv run python scripts/autopilot/pr_triage_autopilot.py --repo-dir /opt/gflow-cli
|
|
67
|
+
0 * * * * set -a; . /opt/hermes/.env 2>/dev/null; set +a; cd /opt/gflow-cli && uv run python scripts/autopilot/pr_triage_autopilot.py --repo-dir /opt/gflow-cli >> /var/log/hermes/pr_triage.log 2>&1
|
|
55
68
|
```
|
|
56
69
|
|
|
57
70
|
Sourcing `/opt/hermes/.env` first (`set -a` exports everything it defines) is what delivers `GH_COMMENT_TOKEN`, `TELEGRAM_*`, and the `RESEND_API_KEY` / `HERMES_NOTIFY_EMAIL_*` vars to the process. Without it the email channel silently disables itself, and without `GH_COMMENT_TOKEN` the run exits 1.
|
|
@@ -83,6 +96,17 @@ Do **NOT** register the orchestrator directly via `hermes cron create --script p
|
|
|
83
96
|
- **(a) Plain crontab** — the line above, under the `hermes` system user.
|
|
84
97
|
- **(b) Thin shim in `HERMES_HOME/scripts/`** — a script that does `cd /opt/gflow-cli && exec uv run python scripts/autopilot/pr_triage_autopilot.py "$@"` (mirrors the existing EV ops-health shim pattern), registered with `hermes cron create "1h" --no-agent --script <shim> --deliver telegram`.
|
|
85
98
|
|
|
99
|
+
### Log rotation
|
|
100
|
+
|
|
101
|
+
`pr_triage.log` grows without bound otherwise. Install once, as root:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
install -m 644 /opt/gflow-cli/deploy/logrotate-pr-triage /etc/logrotate.d/pr-triage
|
|
105
|
+
logrotate --debug /etc/logrotate.d/pr-triage # dry-run
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Scoped to `pr_triage.log` alone — the rest of `/var/log/hermes/` belongs to hermes-ops, and two packages rotating one glob is how logs get silently truncated.
|
|
109
|
+
|
|
86
110
|
### Check Logs & Status
|
|
87
111
|
- **Log Location**: `/var/log/hermes/pr_triage.log`
|
|
88
112
|
- **Triage Ledger**: `/opt/gflow-cli/pr_triage_ledger.jsonl` tracks verdicts and failure states.
|
|
@@ -110,5 +134,5 @@ If a PR enters the `FAILED_PERMANENT` state in `pr_triage_ledger.jsonl` due to 3
|
|
|
110
134
|
2. Fix the underlying environmental or syntax issue.
|
|
111
135
|
3. To trigger a re-review, delete or edit the `FAILED_PERMANENT` entries for that PR number/SHA in `pr_triage_ledger.jsonl`, then run the script manually:
|
|
112
136
|
```bash
|
|
113
|
-
uv run python scripts/autopilot/pr_triage_autopilot.py --repo-dir /opt/gflow-cli
|
|
137
|
+
uv run python scripts/autopilot/pr_triage_autopilot.py --repo-dir /opt/gflow-cli
|
|
114
138
|
```
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# logrotate config for the PR-Triage Autopilot log.
|
|
2
|
+
#
|
|
3
|
+
# Install on the VPS as root:
|
|
4
|
+
# install -m 644 /opt/gflow-cli/deploy/logrotate-pr-triage /etc/logrotate.d/pr-triage
|
|
5
|
+
# logrotate --debug /etc/logrotate.d/pr-triage # dry-run to verify
|
|
6
|
+
#
|
|
7
|
+
# Scoped to pr_triage.log alone, not /var/log/hermes/*.log: the rest of that
|
|
8
|
+
# directory belongs to hermes-ops, and two packages rotating the same glob is
|
|
9
|
+
# how you get silently truncated logs.
|
|
10
|
+
/var/log/hermes/pr_triage.log {
|
|
11
|
+
weekly
|
|
12
|
+
rotate 8
|
|
13
|
+
compress
|
|
14
|
+
delaycompress
|
|
15
|
+
missingok
|
|
16
|
+
notifempty
|
|
17
|
+
# The hourly cron reopens the file on each tick, but copytruncate keeps
|
|
18
|
+
# rotation safe if the orchestrator is ever run as a long-lived process.
|
|
19
|
+
copytruncate
|
|
20
|
+
su hermes hermes
|
|
21
|
+
}
|
|
@@ -149,6 +149,165 @@ See [DEVELOPMENT.md § E2e gate](DEVELOPMENT.md#e2e-gate-before-merging-develop-
|
|
|
149
149
|
|
|
150
150
|
---
|
|
151
151
|
|
|
152
|
+
## Nightly canary (#502)
|
|
153
|
+
|
|
154
|
+
Between releases the live tiers are invisible, so Flow-side drift (cohort flaps,
|
|
155
|
+
selector renames, auth rot) surfaces ad-hoc during feature work instead of on a
|
|
156
|
+
schedule. The canary closes that gap.
|
|
157
|
+
|
|
158
|
+
It runs **locally, not in hosted CI** — the live tiers need a real authenticated
|
|
159
|
+
Chrome profile, and Google bot-detection plus reCAPTCHA make hosted auth
|
|
160
|
+
infeasible. Results are published to a single **rolling issue**; the canary never
|
|
161
|
+
opens new ones (issue spam trains red-blindness) and **gates nothing** (a gate on
|
|
162
|
+
a machine that might be off is self-DoS).
|
|
163
|
+
|
|
164
|
+
### Four states
|
|
165
|
+
|
|
166
|
+
| State | Meaning | Action |
|
|
167
|
+
|---|---|---|
|
|
168
|
+
| `GREEN` | every selected $0 tier passed | none |
|
|
169
|
+
| `RED` | auth healthy, a $0 tier failed | **real drift or regression** — triage |
|
|
170
|
+
| `AUTH-EXPIRED` | session rot (expected) | `gflow auth login` |
|
|
171
|
+
| `DEFERRED` | nothing conclusive ran | fix the profile / config — says nothing about Flow |
|
|
172
|
+
|
|
173
|
+
Splitting the last two out of `RED` is the point: `RED` must always mean "code or
|
|
174
|
+
Flow drifted", never "please re-login" or "you had Chrome open". The classifier is
|
|
175
|
+
a pure function with all four states covered in
|
|
176
|
+
`tests/scripts/test_canary_classify.py`.
|
|
177
|
+
|
|
178
|
+
**Rot vs. drift is decided by a second probe, not by error names.** When a tier
|
|
179
|
+
fails for a reason other than a profile precondition, the canary re-runs
|
|
180
|
+
`gflow auth status`. Session still valid ⇒ the failure is
|
|
181
|
+
drift (`RED`); session now dead ⇒ genuine rot (`AUTH-EXPIRED`). The first live run
|
|
182
|
+
proved why this matters: an `AuthExpiredError` on `project.createProject`
|
|
183
|
+
*looked* exactly like session rot, but the session verified clean seconds later —
|
|
184
|
+
so it was a real divergence between two auth surfaces, and a name-matching
|
|
185
|
+
classifier would have buried it. The extra probe costs ~45s and only runs after a
|
|
186
|
+
failure.
|
|
187
|
+
|
|
188
|
+
> The route is `labs.google/fx/api/trpc/project.createProject` — the NextAuth
|
|
189
|
+
> **cookie** surface — not the aisandbox Bearer path. #561 originally recorded it
|
|
190
|
+
> as an `uploadImage` failure because the failing test is named for an upload;
|
|
191
|
+
> the traceback dies one line earlier, on the project-creation call. Corrected
|
|
192
|
+
> here so the next reader does not re-investigate the wrong host.
|
|
193
|
+
|
|
194
|
+
`DEFERRED` covers every run that **exercised nothing**: a held `ProfileLease`, a
|
|
195
|
+
`ProfileEngineDowngradeError` (profile written by a newer Chromium than the bundled
|
|
196
|
+
engine), a refused `--pull`, or a run where every selected test skipped. All fail
|
|
197
|
+
before reaching Flow, so none can evidence drift.
|
|
198
|
+
|
|
199
|
+
Two subtleties, both found by council review and both regression-tested:
|
|
200
|
+
|
|
201
|
+
- **A precondition is matched on the raised exception, never a substring.** Two
|
|
202
|
+
`e2e_auth` tests mention `ProfileLockedError` in ordinary source — one in an
|
|
203
|
+
assertion message, one in a comment — and pytest echoes the failing function's
|
|
204
|
+
source into its traceback. Substring matching therefore published a genuine
|
|
205
|
+
regression in those tests as `DEFERRED`, the one label that says "ignore me".
|
|
206
|
+
- **A green run that executed nothing is not green.** pytest exits 0 when every
|
|
207
|
+
test skips, and every e2e test skips on a missing profile directory. `GREEN`
|
|
208
|
+
requires `passed > 0`.
|
|
209
|
+
|
|
210
|
+
Because the issue carries a last-updated timestamp, a machine that was off is
|
|
211
|
+
*visibly stale* — unlike a lingering green commit status, which lies.
|
|
212
|
+
|
|
213
|
+
**A RED preserves its own evidence, logs included.** The run's JUnit is copied to
|
|
214
|
+
`tmp/canary-red-<stamp>.xml` (the live one is overwritten nightly), and pytest runs
|
|
215
|
+
with `-o junit_logging=all` so that copy carries the captured structlog output, not
|
|
216
|
+
just a traceback. This is not optional detail: the canary's failures reproduce only
|
|
217
|
+
unattended, so whatever the run does not record cannot be recovered afterwards. For
|
|
218
|
+
an auth 401 the deciding line is `client.context_cookie_state` — the #222
|
|
219
|
+
diagnostic, which reports whether the launched browser context actually loaded the
|
|
220
|
+
Flow session cookie. That single boolean separates "the browser never got the
|
|
221
|
+
cookie" from "the session was genuinely refused"; without it a 401 traceback is the
|
|
222
|
+
same shape either way. The copy stays **local** — it carries raw tracebacks and
|
|
223
|
+
profile paths, which the sanitization contract keeps off the public issue.
|
|
224
|
+
|
|
225
|
+
### Scope
|
|
226
|
+
|
|
227
|
+
`-m e2e_auth` only ($0, no reCAPTCHA); fast-follow adds `e2e_scene` ($0). Credit
|
|
228
|
+
tiers (`e2e_image` / `e2e_video` / `smoke`) stay **strictly manual** via
|
|
229
|
+
`/gflow:live-verify` — no unattended credit spend on a personal account.
|
|
230
|
+
|
|
231
|
+
### Run it
|
|
232
|
+
|
|
233
|
+
```bash
|
|
234
|
+
# dry run — executes for real, prints the payload, touches nothing on GitHub
|
|
235
|
+
uv run python scripts/canary/run_canary.py --profile <name> --dry-run
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
Credit-spending markers (`e2e_image`, `e2e_video`, `e2e_batch`, `e2e_character`,
|
|
239
|
+
`smoke`) are **refused outright** — the canary never spends credits unattended.
|
|
240
|
+
Run those manually via `/gflow:live-verify`.
|
|
241
|
+
|
|
242
|
+
### Schedule it
|
|
243
|
+
|
|
244
|
+
```powershell
|
|
245
|
+
.\scripts\canary\register_task.ps1 -Profile <name> -Issue <n> `
|
|
246
|
+
-RepoRoot C:\path\to\dedicated\clone
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
Point `-RepoRoot` at a **dedicated clone**, never your working tree: the runner's
|
|
250
|
+
`--pull` refuses a dirty checkout rather than resetting over uncommitted work, and
|
|
251
|
+
reports that refusal as `DEFERRED` rather than exiting silently. `--pull` also
|
|
252
|
+
re-syncs dependencies, so a lockfile bump on `develop` cannot masquerade as a
|
|
253
|
+
`RED` import error.
|
|
254
|
+
|
|
255
|
+
Publishing uses your already-authenticated local `gh` — **no new secrets or
|
|
256
|
+
tokens**. Published content is sanitized for a public repo: SHA, pass/fail
|
|
257
|
+
counts, duration, failure class, and failing test *names* only — never raw logs,
|
|
258
|
+
profile paths, prompts, or signed URLs.
|
|
259
|
+
|
|
260
|
+
## Selector drift probe (#563)
|
|
261
|
+
|
|
262
|
+
The canary answers *"does gflow still work on the maintainer's cohort?"*; the
|
|
263
|
+
probe answers *"which Flow DOM selector moved?"* — from hosted CI, with no
|
|
264
|
+
maintainer machine involved. It walks the structured selector inventory in
|
|
265
|
+
`gflow_cli.flow_selectors` (the incident families from #404/#493/#313) against
|
|
266
|
+
a live editor at the pinned 1920×1080 viewport: navigate and read only, **$0**,
|
|
267
|
+
never submits.
|
|
268
|
+
|
|
269
|
+
Runs via `.github/workflows/selector-probe.yml` on `schedule` (05:00 UTC daily)
|
|
270
|
+
plus `workflow_dispatch`. **Never add a `pull_request` trigger**: same-repo
|
|
271
|
+
branch PRs receive repository secrets while running attacker-editable probe
|
|
272
|
+
code (fork PRs are safe — GitHub withholds secrets — but the same-repo case is
|
|
273
|
+
not).
|
|
274
|
+
|
|
275
|
+
### Exit contract
|
|
276
|
+
|
|
277
|
+
| Exit | Meaning | Action |
|
|
278
|
+
|---|---|---|
|
|
279
|
+
| `0` | every registered selector resolved (`ok` / `FALLBACK[n]` / `n/a`) | none |
|
|
280
|
+
| `1` | **drift** — a selector graded MISS or AMBIGUOUS; the report names its key | re-derive that selector, ship a registry edit |
|
|
281
|
+
| `2` | **inconclusive** — expired token, dead project, known alternate UI state, or no recognizable editor arm | fix the credential/project; says nothing about Flow |
|
|
282
|
+
|
|
283
|
+
Keeping `1` and `2` apart is the whole design: an expired credential must never
|
|
284
|
+
be published as "Google changed the page". The deciding gate is a poll on
|
|
285
|
+
production's own arm indicators (the six `crop_*` variants ⇒ classic, the
|
|
286
|
+
agentic ligatures ⇒ agentic); a page showing neither within 25 s — a sign-in
|
|
287
|
+
wall renders neither — is inconclusive, not drift. Mode-scoped selectors absent
|
|
288
|
+
on the observed arm grade `n/a` (`EXPECTED_ABSENT`), never drift — the probe's
|
|
289
|
+
first two live runs landed on opposite arms (classic locally, agentic on the
|
|
290
|
+
runner) and both graded clean.
|
|
291
|
+
|
|
292
|
+
### Secrets and token care
|
|
293
|
+
|
|
294
|
+
Two repository secrets, from a **dedicated throwaway Google account**, never
|
|
295
|
+
the maintainer's: `GFLOW_CI_SESSION_TOKEN` (the
|
|
296
|
+
`__Secure-next-auth.session-token` cookie) and `GFLOW_CI_PROJECT_ID` (any
|
|
297
|
+
project that account owns — a deleted id renders an error shell the probe
|
|
298
|
+
reports as exit 2).
|
|
299
|
+
|
|
300
|
+
The token **re-issues on every profile open** (observed live 2026-08-21: three
|
|
301
|
+
values in 15 minutes; the first CI dispatch failed exit 2 on a superseded
|
|
302
|
+
snapshot). Harvest accordingly: open the throwaway profile once, read the
|
|
303
|
+
cookie, close the browser, `gh secret set GFLOW_CI_SESSION_TOKEN` from stdin —
|
|
304
|
+
and never reopen that profile without re-syncing the secret afterwards. The
|
|
305
|
+
value also hard-dies at day 30 with no warning. Either way an aged token shows
|
|
306
|
+
as a red exit-2 run, never as drift, and the nightly schedule itself is the
|
|
307
|
+
aging test.
|
|
308
|
+
|
|
309
|
+
---
|
|
310
|
+
|
|
152
311
|
## File map
|
|
153
312
|
|
|
154
313
|
```
|