<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: impactcheck</title>
    <description>The latest articles on DEV Community by impactcheck (@impactcheck).</description>
    <link>https://dev.to/impactcheck</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4103853%2F87fa18b6-cf24-4eb5-9fbd-ef6b5a866eb8.png</url>
      <title>DEV Community: impactcheck</title>
      <link>https://dev.to/impactcheck</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/impactcheck"/>
    <language>en</language>
    <item>
      <title>We Got Paged at 2am Because Someone Removed a Method</title>
      <dc:creator>impactcheck</dc:creator>
      <pubDate>Tue, 01 Sep 2026 07:34:07 +0000</pubDate>
      <link>https://dev.to/impactcheck/we-got-paged-at-2am-because-someone-removed-a-method-4fnj</link>
      <guid>https://dev.to/impactcheck/we-got-paged-at-2am-because-someone-removed-a-method-4fnj</guid>
      <description>&lt;p&gt;It was a Tuesday.&lt;/p&gt;

&lt;p&gt;A developer on our team cleaned up some old code and removed a method that looked unused.&lt;/p&gt;

&lt;p&gt;The tests passed.&lt;br&gt;
The PR was approved.&lt;br&gt;
It was merged.&lt;/p&gt;

&lt;p&gt;Six hours later — at 2am — POST /caption/assign started returning 500 errors in production.&lt;/p&gt;

&lt;p&gt;The method wasn't unused.&lt;/p&gt;

&lt;p&gt;DriversController.assignDriver was calling it. The controller handled a live endpoint. The endpoint was in production. Our tests simply didn't cover that path.&lt;/p&gt;

&lt;p&gt;That's the kind of incident that ruins your week — and makes you question everything.&lt;/p&gt;

&lt;p&gt;Breaking changes are rarely obvious&lt;/p&gt;

&lt;p&gt;If they were obvious, developers wouldn't make them.&lt;/p&gt;

&lt;p&gt;The dangerous ones are often structural:&lt;/p&gt;

&lt;p&gt;A method gets removed.&lt;br&gt;
A signature changes.&lt;br&gt;
An endpoint disappears.&lt;br&gt;
A caller still depends on the old contract.&lt;/p&gt;

&lt;p&gt;The code looks fine locally.&lt;br&gt;
The tests pass.&lt;br&gt;
The linter is happy.&lt;/p&gt;

&lt;p&gt;Nothing tells you that three other parts of the system just broke.&lt;/p&gt;

&lt;p&gt;You usually find out in production.&lt;/p&gt;

&lt;p&gt;And sometimes, it's at 2am.&lt;/p&gt;

&lt;p&gt;So we built ImpactGuard&lt;/p&gt;

&lt;p&gt;ImpactGuard is a CLI that detects structural change impact before your PR gets merged.&lt;/p&gt;

&lt;p&gt;Two commands:&lt;/p&gt;

&lt;p&gt;npx impactcheck-cli init&lt;br&gt;
npx impactcheck-cli check&lt;/p&gt;

&lt;p&gt;Run init once. Run check after your changes.&lt;/p&gt;

&lt;p&gt;When we simulated the incident above, ImpactGuard reported:&lt;/p&gt;

&lt;p&gt;⚡ ImpactGuard — checking impact&lt;/p&gt;

&lt;p&gt;⛔ 1 BREAKING  — push blocked&lt;/p&gt;

&lt;p&gt;⛔ Method Removed [95%]&lt;br&gt;
     DriversService.assignNearestDriver&lt;br&gt;
     callers : DriversController.assignDriver&lt;br&gt;
     api     : POST /caption/assign&lt;br&gt;
     ────────────────────────────────────────────&lt;/p&gt;

&lt;p&gt;Not checked: logic changes · feature flags · DB migrations&lt;br&gt;
  dynamic calls · polymorphism · cross-service (Phase 3)&lt;/p&gt;

&lt;p&gt;One removed method.&lt;br&gt;
One real caller.&lt;br&gt;
One production endpoint.&lt;/p&gt;

&lt;p&gt;Caught in three seconds — before the PR was raised.&lt;/p&gt;

&lt;p&gt;That 2am incident would never have happened.&lt;/p&gt;

&lt;p&gt;How it works&lt;/p&gt;

&lt;p&gt;ImpactGuard scans your source code locally and builds a call graph: a map of which methods depend on which other methods, and which API endpoints ultimately reach those handlers.&lt;/p&gt;

&lt;p&gt;When you run check, it compares the current code against the baseline and traces the impact of structural changes.&lt;/p&gt;

&lt;p&gt;Your code change&lt;br&gt;
      ↓&lt;br&gt;
Methods changed or removed&lt;br&gt;
      ↓&lt;br&gt;
Callers that depend on them&lt;br&gt;
      ↓&lt;br&gt;
API endpoints those callers belong to&lt;br&gt;
      ↓&lt;br&gt;
Impact report with evidence&lt;/p&gt;

&lt;p&gt;Nothing is sent anywhere.&lt;/p&gt;

&lt;p&gt;No server.&lt;br&gt;
No account.&lt;br&gt;
No environment variables.&lt;/p&gt;

&lt;p&gt;It reads your source files directly.&lt;/p&gt;

&lt;p&gt;The rule that matters: warn only when there is a consumer&lt;/p&gt;

&lt;p&gt;This was one of our most important design decisions.&lt;/p&gt;

&lt;p&gt;Remove a method that nothing calls?&lt;/p&gt;

&lt;p&gt;Silence.&lt;/p&gt;

&lt;p&gt;Change a signature that has no consumers?&lt;/p&gt;

&lt;p&gt;Silence.&lt;/p&gt;

&lt;p&gt;Only warn when something actually depends on what changed.&lt;/p&gt;

&lt;p&gt;And every warning includes evidence: the affected callers, API endpoints, reason for the warning, and a confidence score.&lt;/p&gt;

&lt;p&gt;We believe developers stop ignoring warnings when they can trust them.&lt;/p&gt;

&lt;p&gt;What it doesn't catch&lt;/p&gt;

&lt;p&gt;We don't want to pretend static analysis is magic.&lt;/p&gt;

&lt;p&gt;ImpactGuard is a static call-graph analyser, not a runtime oracle.&lt;/p&gt;

&lt;p&gt;It currently does not catch:&lt;/p&gt;

&lt;p&gt;Logic changes inside methods&lt;br&gt;
Feature-flag behaviour&lt;br&gt;
Database migrations&lt;br&gt;
Dynamic calls such as service&lt;a href=""&gt;method&lt;/a&gt;&lt;br&gt;
Cross-service dependencies (coming in Phase 3)&lt;/p&gt;

&lt;p&gt;We show these limitations in every report.&lt;/p&gt;

&lt;p&gt;The goal isn't to claim we catch everything.&lt;/p&gt;

&lt;p&gt;The goal is to catch the structural changes that can cause immediate runtime failures — before they become production incidents.&lt;/p&gt;

&lt;p&gt;Try it on your project&lt;/p&gt;

&lt;h1&gt;
  
  
  In your project
&lt;/h1&gt;

&lt;p&gt;npx impactcheck-cli init&lt;/p&gt;

&lt;h1&gt;
  
  
  After making changes
&lt;/h1&gt;

&lt;p&gt;npx impactcheck-cli check&lt;/p&gt;

&lt;p&gt;It works with Node.js, NestJS, Express, Fastify, Spring Boot, FastAPI, and Flask.&lt;/p&gt;

&lt;p&gt;No account.&lt;br&gt;
No signup.&lt;br&gt;
No server.&lt;/p&gt;

&lt;p&gt;Just two commands.&lt;/p&gt;

&lt;p&gt;We want to test it against real code&lt;/p&gt;

&lt;p&gt;If you try ImpactGuard, we'd love to know:&lt;/p&gt;

&lt;p&gt;Did it catch something you wouldn't have noticed before raising your PR?&lt;br&gt;
Did it miss something you expected it to catch?&lt;br&gt;
Did it flag anything incorrectly or unhelpfully?&lt;/p&gt;

&lt;p&gt;Open an issue at github.com/impactcheckcli/impactguard-cli or reply here.&lt;/p&gt;

&lt;p&gt;We built ImpactGuard because we got tired of discovering breaking changes in production.&lt;/p&gt;

&lt;p&gt;The 2am page isn't a rite of passage.&lt;/p&gt;

&lt;p&gt;It's a process failure.&lt;/p&gt;

&lt;p&gt;ImpactGuard is our attempt to fix that process — one PR at a time.&lt;/p&gt;

</description>
      <category>devtools</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>testing</category>
    </item>
  </channel>
</rss>
