Filed by the SaaS launch review. Priority P3.6 — severity low, category test-trust.
Problem
The green CI badge is the launch gate, and several checks cannot fail. ~1,050 lines of skipped tests inflate the apparent suite size while covering nothing: test_websocket_integration.py (877 lines, removed v1 protocol), test_dashboard_access.py (skipped with the factually false reason 'serve command is stub in v2'), and test_blocker_expiration_minimal.py which imports no product code and re-runs SQL copied from a method that no longer exists. Spec-less mocks mean a renamed GitHubIntegration method ships green and breaks cf pr merge; the ws_url fixture builds a ?token= URL the server rejects; and assertions like exit_code in (0, 1), 'merged appears in output' and a tautological hash-uniqueness test cannot detect the regressions they name.
Evidence
tests/ui/test_websocket_integration.py:35
tests/integration/test_dashboard_access.py:18
tests/blockers/test_blocker_expiration_minimal.py:80
tests/cli/test_pr_commands.py:56
tests/ui/conftest.py:265
tests/cli/test_v2_cli_integration.py:208
Acceptance criteria
Dependencies
Atomic by construction: one developer, one focused session.
Problem
The green CI badge is the launch gate, and several checks cannot fail. ~1,050 lines of skipped tests inflate the apparent suite size while covering nothing: test_websocket_integration.py (877 lines, removed v1 protocol), test_dashboard_access.py (skipped with the factually false reason 'serve command is stub in v2'), and test_blocker_expiration_minimal.py which imports no product code and re-runs SQL copied from a method that no longer exists. Spec-less mocks mean a renamed GitHubIntegration method ships green and breaks
cf pr merge; the ws_url fixture builds a ?token= URL the server rejects; and assertions likeexit_code in (0, 1), 'merged appears in output' and a tautological hash-uniqueness test cannot detect the regressions they name.Evidence
tests/ui/test_websocket_integration.py:35tests/integration/test_dashboard_access.py:18tests/blockers/test_blocker_expiration_minimal.py:80tests/cli/test_pr_commands.py:56tests/ui/conftest.py:265tests/cli/test_v2_cli_integration.py:208Acceptance criteria
exit_code in (0, 1)or loneassert result is not Nonein tests/cli and tests/ui; test_merge_pr_already_merged asserts merge_pull_request was not called; the rate-limit test asserts a 429 or is deletedDependencies
Atomic by construction: one developer, one focused session.