Keep both the level and the log
Storing only stock_movements is the pure answer — the quantity is a sum — but it makes every product listing a running total over a table that grows forever. Storing only stock_levels makes the screens fast and leaves no way to explain how a number got there. Keeping both means a write touches two places in one transaction, and inventory_audits is the mechanism that catches the moment they disagree.