Files
omp-pygienium/tasks/11-check-defensive-guards.md

1.7 KiB

11. Redundant defensive guarding check

meta: id: pygienium-11 feature: pygienium priority: P2 depends_on: [pygienium-06] tags: [check]

objective:

  • Implement the redundant-defensive-guarding check: remove excessive null checks, unnecessary try/catch, fallback paths that mask bugs, defensive code guarding invariants the type system already guarantees.

deliverables:

  • src/checks/defensive-guards.ts: CheckDefinition with scan + fix tasks
  • Rubric: redundant null/undefined checks where types are non-nullable, try/catch that only rethrows or swallows, fallback values that hide errors, defensive guards on already-validated input, compatibility fallbacks (engineering rule: remove, don't layer)
  • /pygienium-defensive-guards runs E2E

steps:

  • Author buildScanTask: agent identifies defensive smells, writes pygienium/checks/defensive-guards/findings.md
  • Author buildFixTask: remove redundant guards; preserve guards that protect real external boundaries (user input, IO, parsing); write changes.md distinguishing removed vs kept-with-reason
  • Register the check

tests:

  • Integration: temp file with a null check on a typed-non-null param + a try/catch that swallows; run --fix; assert removed; assert a JSON.parse guard is preserved

acceptance_criteria:

  • findings.md separates redundant guards from legitimate boundary guards
  • --fix removes redundant guards and keeps boundary guards (IO, parsing, untrusted input)

validation:

  • Inspect pygienium/checks/defensive-guards/{findings.md,changes.md}

notes:

  • Key judgment: guarding external boundaries (IO, untrusted input, parsing) is correct; guarding internal invariants the type system guarantees is noise
  • Engineering rule: no compatibility layers or fallbacks meant to be replaced later