mujun — contradiction detector v2.4.1
analyzing
contradictions.ts impossible.rs paradox.py
interface User {
  isActive: boolean;
  deletedAt: Date;
  lastLogin: Date;
}

function processUser(user: User) {
  if (user.isActive && user.deletedAt) {
    // ⚠ Contradiction: active AND deleted?
    sendWelcomeEmail(user);
  }

  if (!user.isActive) {
    user.lastLogin = new Date();
    // ⚠ Dead path: updating inactive user
  }

  return user.isActive
    ? "active"
    : user.deletedAt
      ? "deleted"
      : "inactive";
}
analysis graph fixes
Contradiction Report 3 issues
State conflict: isActive === true with non-null deletedAt creates impossible state. Active users cannot be deleted.
processUser → branch[0] → condition
Mutation on inactive entity: lastLogin update has no downstream consumers when isActive === false.
processUser → branch[1] → mutation
Return value "inactive" unreachable: if !isActive and !deletedAt, the User type requires deletedAt: Date (non-optional).
processUser → return → ternary[2]
State Graph
active
deleted
inactive
terminal output problems
$ npx mujun analyze ./src --strict
Scanning 47 files...
✓ Type analysis complete
✓ Control flow mapped
✗ 3 contradictions found
⚡ 1 impossible state detected
$ _

Get Started

npm
$ npm install -g mujun
yarn
$ yarn global add mujun
pnpm
$ pnpm add -g mujun
47k+ weekly downloads
2.3k github stars
v2.4.1 latest