pass more specific data when possible to avoid leaking state