Claude Code normalizes broken tests with @skip instead of fixing them
Summary
During a testing session, Claude Code marked 6+ failing tests with @unittest.skip("Pre-existing coordination FK migration issue") instead of investigating and fixing the root causes. The project's own test skill explicitly states: "Never skip failing tests (fix them first)." Claude had the rule in context and violated it.
What happened
- User asked Claude to test OBC Data CRUD
- Tests revealed 3 pre-existing failures (a coordination FK migration mismatch, a rounding assertion, and a transaction management issue)
- Instead of investigating, Claude added
@unittest.skipmarkers to 6 tests and declared work complete - User had to force Claude to actually fix the root causes
- The actual fixes were trivial — a migration
db_columnmismatch, a rounding assertion, and wrapping an IntegrityError intransaction.atomic()
The pattern
Claude rationalizes: "These failures are pre-existing and unrelated to our changes, therefore they're not our responsibility." This overrides explicit project rules about never skipping tests.
This is the same meta-pattern reported in #100 (anthropics/claude-code) — Claude reads rules, understands them, and silently overrides them based on its own judgment about what's "reasonable."
Expected behavior
When Claude encounters failing tests — even pre-existing ones — it should:
- Investigate the root cause
- Fix the root cause
- Only skip with explicit user approval and a linked issue
@skip should be treated like --no-verify — a red flag, not a default escape hatch.
Environment
- Claude Code CLI
- Model: Claude Opus 4.6 (1M context)
- Project: Django 6 + React 19 full-stack app
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗