al-sem
Whole-program static analysis for AL: reads your workspace and every extension in .alpackages as one program, then finds the performance and transaction bugs customers report and answers "what breaks if I change this?" across app boundaries.
Overview
A static analysis engine for Business Central AL that resolves the full call graph across your workspace and its dependencies, then runs its checks against that graph instead of one file at a time. That is how it catches the bugs a per-file linter can’t see: a Modify in a helper that only runs inside a FindSet loop two procedures up, a Commit reachable from an event subscriber, a FlowField read without CalcFields, a TryFunction whose result nobody looks at. Every finding comes with the routine, file and line, a confidence level and a concrete fix.
alsem analyze is the checker. alsem query, digest, prove, diff and events do impact analysis: which code writes to this table anywhere in the call chain, what the change you just made actually touches, and whether a release changed an event or table another extension depends on. Baselines let you adopt it on an old codebase without fixing 500 findings first, and --require-dependencies fails the build instead of quietly analyzing less code when a dependency is missing.
It started life as al-call-hierarchy, an LSP server for “who calls this?” in AL. That server still ships as the al-call-hierarchy binary and is the call hierarchy backend for AL LSP for Agents.