Regression prevention checklist for bug fixes. Ensures API compatibility, behavior preservation, and no unintended side effects.
From accnpx claudepluginhub dykyi-roman/awesome-claude-code --plugin accThis skill uses the workspace's default tool permissions.
Systematic checklist to ensure bug fixes don't introduce new problems.
// BEFORE
public function process(Order $order): OrderResult
// AFTER - Must maintain compatibility
public function process(Order $order): OrderResult // ✓ Same signature
public function process(Order $order): Result // ✗ Return type changed
public function process(Order $order, bool $flag): OrderResult // ✗ New required param
public function process(Order $order, bool $flag = false): OrderResult // ✓ Optional param OK
Checklist:
// BEFORE - throws ValidationException
public function validate(Data $data): void
// AFTER - Must throw same or subtype
public function validate(Data $data): void // throws ValidationException ✓
public function validate(Data $data): void // throws DataValidationException extends ValidationException ✓
public function validate(Data $data): void // throws RuntimeException ✗ Different hierarchy
Checklist:
// BEFORE
public function findUser(UserId $id): ?User
// Returns null for non-existent user
// AFTER - Preserve null semantics
public function findUser(UserId $id): ?User
// Must still return null for non-existent user
// NOT throw NotFoundException (behavior change)
Checklist:
// BEFORE - Has side effects
public function completeOrder(Order $order): void
{
$order->complete(); // 1. State change
$this->repository->save($order); // 2. Database write
$this->events->publish($event); // 3. Event published
}
// AFTER - Must preserve all side effects
// Unless the bug IS one of these side effects
Checklist:
// BEFORE - stored as "2024-01-15"
// AFTER - must stay "2024-01-15"
// NOT "2024-01-15T00:00:00Z" (format change)
Checklist:
/**
* This test reproduces the original bug.
* It MUST fail before the fix and pass after.
*/
#[Test]
public function testBugReproduction(): void
{
// Arrange: Set up conditions that trigger the bug
$order = OrderBuilder::create()
->withItem(null) // The bug trigger
->build();
// Act & Assert: Verify bug is fixed
$result = $this->service->calculateTotal($order);
// Before fix: throws NullPointerException
// After fix: returns Money::zero()
$this->assertEquals(Money::zero('USD'), $result);
}
#[Test]
public function testEdgeCases(): void
{
// Test boundary conditions around the fix
$this->assertEquals($expected, $this->service->process($emptyInput));
$this->assertEquals($expected, $this->service->process($maxInput));
$this->assertEquals($expected, $this->service->process($nullableInput));
}
#[Test]
public function testExistingBehaviorPreserved(): void
{
// Test that normal cases still work
$normalOrder = OrderBuilder::create()
->withItem($validItem)
->build();
$result = $this->service->calculateTotal($normalOrder);
$this->assertEquals($expectedTotal, $result);
}
| Scenario | Before Fix | After Fix | Test Required |
|---|---|---|---|
| Bug trigger case | Fails/crashes | Works correctly | ✓ Reproduction |
| Normal case | Works | Must still work | ✓ Regression |
| Edge cases | May vary | Defined behavior | ✓ Edge case |
| Related features | Work | Must still work | ✓ Integration |
// Bug: Null pointer when item is null
// WRONG: Remove null items entirely (behavior change)
$items = array_filter($items, fn($i) => $i !== null);
// CORRECT: Handle null gracefully
foreach ($items as $item) {
if ($item === null) {
continue; // Skip null, preserve others
}
// ... process item
}
// Bug: Method should return early for invalid state
// WRONG: Change return type
public function process(): void // Was: ?Result
// CORRECT: Return null for invalid state (preserve contract)
public function process(): ?Result
{
if (!$this->isValid()) {
return null;
}
// ...
}
// Bug: Exception crashes application
// WRONG: Swallow exception
try {
$this->service->process($data);
} catch (Exception $e) {
// Silent failure - bug hidden
}
// CORRECT: Handle specific exception appropriately
try {
$this->service->process($data);
} catch (ValidationException $e) {
return Result::invalid($e->getErrors());
}
// Bug: Missing validation
// WRONG: Add validation that queries database in loop
foreach ($items as $item) {
if (!$this->repository->exists($item->getId())) { // N+1 query!
throw new NotFoundException();
}
}
// CORRECT: Batch validation
$ids = array_map(fn($i) => $i->getId(), $items);
$existing = $this->repository->findByIds($ids);
if (count($existing) !== count($items)) {
throw new NotFoundException();
}
git tag pre-fix-{issue-id}git revert {commit-hash}## Pre-Fix
- [ ] Bug reproduced
- [ ] Impact assessed
- [ ] Existing tests identified
## Fix Applied
- [ ] API compatible
- [ ] Behavior preserved
- [ ] Side effects intact
- [ ] Data integrity maintained
## Tests Added
- [ ] Reproduction test
- [ ] Edge case tests
- [ ] Regression tests
## Post-Fix
- [ ] All tests pass
- [ ] Code reviewed
- [ ] Documentation updated
- [ ] Monitoring ready
Provides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.