Find out what's actually here
Discovery first. SPN work without knowing the identities is guessing.
Before SqlSpnManager registers anything, it asks the box
what SQL services it's running and what identities they use.
One command, one table: Get-SqlSpnDiscoveryEngine.
If the table doesn't match what you expected, stop and find out why before you register a single SPN. Wrong identity = wrong SPN = the same Kerberos error in a different costume.
What the call actually returns
PS> Get-SqlSpnDiscoveryEngine
ServiceName AccountName Instance Port Status
----------- ----------- -------- ---- ------
MSSQLSERVER svc_sql_prod MSSQLSERVER 1433 Running
MSSQL$ARCH svc_sql_arch ARCH 1450 Running
MSSQL$REPORTS svc_sql_rep REPORTS 1500 Stopped
One row per local SQL service. Source: Win32_Service + the registry. No AD calls in this step.