Found during the #454/#455 gate work (2026-06-11): the full suite shows 22 failures in any shell WITHOUT GITHUB_TOKEN, and the same tests PASS (slowly — ~50s each, making real GitHub API calls) when the token is present. Bisect: reproduces on e457519 (pre-#454) — pre-existing, masked because loop-launch shells always export the token.
Escape path: tests/test_runner_retry.py → tick.py → repairs.py:86 → gh_issues.py:368 → gh_client._require_token (RuntimeError without token; live API with).
Fix: stub the repairs flow's gh surface at the test boundary (same pattern as test_orphan_pr_adoption's _patch_gh, which gained a fetch_issue stub in #455). Tests must never construct a live gh client.
Severity: CI/dev-env dependent suite + accidental live API traffic from unit tests.
Found during the #454/#455 gate work (2026-06-11): the full suite shows 22 failures in any shell WITHOUT GITHUB_TOKEN, and the same tests PASS (slowly — ~50s each, making real GitHub API calls) when the token is present. Bisect: reproduces on e457519 (pre-#454) — pre-existing, masked because loop-launch shells always export the token.
Escape path: tests/test_runner_retry.py → tick.py → repairs.py:86 → gh_issues.py:368 → gh_client._require_token (RuntimeError without token; live API with).
Fix: stub the repairs flow's gh surface at the test boundary (same pattern as test_orphan_pr_adoption's _patch_gh, which gained a fetch_issue stub in #455). Tests must never construct a live gh client.
Severity: CI/dev-env dependent suite + accidental live API traffic from unit tests.