'brew services start postgresql@16' generates a launchd property list under ~/Library/LaunchAgents and loads it. Because it is a LaunchAgent in the user domain, it runs when that user has a graphical login session and stops when they log out. It is not a system daemon, so it will not survive a reboot into the login window and will not run for a user connected only over SSH.
Running 'sudo brew services start' installs the plist under /Library/LaunchDaemons instead, which does run at boot independently of login. Homebrew supports this but the service then runs as root unless the formula specifies otherwise, and the two locations are tracked separately, so a service can appear stopped under your user while running as a daemon.
'brew services list' shows name, status, user and plist path, which is the fastest way to see which domain a service landed in. When a service reports 'error', the underlying cause is in the log paths named by the plist, not in Homebrew's output. Removing the formula does not always unload the plist; run 'brew services stop' before uninstalling.