# test\(lint\): ban per-test timeouts and unreasoned skips · PR \#22560 · pingdotgg/t3code

[View on GitCafe](https://git.cafe/pingdotgg/t3code/pull/22560)

Repository: [pingdotgg/t3code](https://git.cafe/pingdotgg/t3code)

Visibility: public

State: merged

Source repository: pingdotgg/t3code

Source branch: tests/guardrails-base

Target branch: main

Head commit: c925428cd27cae9711e90562e6094bc9b6401a6b

[Discussion and reviews](https://git.cafe/pingdotgg/t3code/pull/22560)

[Commits](https://git.cafe/pingdotgg/t3code/pull/22560/commits?format=markdown)

[Files changed](https://git.cafe/pingdotgg/t3code/pull/22560/diffs?format=markdown)

## Description

---

## Problem
Tests bumped their own timeout (`it(name, fn, 60_000)`) or were skipped with no tracking issue. Both hide waits that should be event-driven, and a skip with no owner never comes back.

## Fix
- New rule `t3code/no-test-timeout-or-unreasoned-skip`: flags a numeric or `{timeout, retry}` argument on `it`/`test`/`describe`/hooks, `vi.setConfig({testTimeout})`, and `.skip`/`.only`/`.todo` without a leading `// quarantine: #issue` comment. `skipIf`/`runIf` platform gates stay allowed. `*.live.test.*` provider probes keep their timeouts (they run real agents for minutes behind env gates).
- Removed 58 overrides across 17 files; one suppression on the env-gated recovery benchmark.
- Root vitest config: `allowOnly: !CI`, explicit `retry: 0`, full `fakeTimers.toFake` set.
- AGENTS.md Verifying section lists the concrete rules and names the five lint rules that enforce them.

Part of the anti-flake stack (#22563). Context: main was red in ~600 of ~2,900 runs since September; the genuinely flaky tests all waited on real time, scheduler budgets, or renderer frames. These rules make those tests fail lint instead of CI.

Made with Claude Opus 5.5 and Claude Fable 5.1 in Claude Code (T3 Code).

🤖 Generated with [Claude Code](https://claude.com/claude-code)
