If you look at the error message from your “kv get” command you’ll see it’s complaining about secret/data/public. The kv-v2 secret engine mounted at secret has a subpath secret/data for reads and writes, and secret/metadata for metadata, and one called secret/config for configuration.
To read, you need access to secret/data/public; there’s nothing at secret/public. The vault kv command takes care of accessing the right path depending on the type of the mount, but the policy needs to specify the complete path.