uv sync makes the environment match the lockfile exactly. Anything present in .venv that the lock does not list is uninstalled, including packages you added by hand with uv pip install or pip install a minute earlier. There is no prompt and no warning naming what was removed unless you pass -v.
The behaviour is intentional, because an exact sync is the only way for a lockfile to describe an environment rather than merely constrain it. It surprises people whose workflow was to install a debugging tool like ipdb into the project venv, since the next uv run or uv sync removes it.
--inexact leaves extraneous packages alone. The better habit is to put the debugging tools in a dependency group so they are part of the lock, with uv add --dev ipdb, or to run them without installing at all via uvx ipdb. For a production install, uv sync --frozen --no-dev is the pairing that gives a reproducible runtime environment with no development extras.