Flag token_endpoint_auth_signing_alg = "none" as a direct SpecViolation
The atproto OAuth profile
(<https://atproto.com/specs/oauth#client-metadata>) states
explicitly: "`none` is never allowed here". Previously this condition
was only caught incidentally by the JWKS stage's
`has_key_for_signing_alg` (no JWK can match `alg="none"`), producing a
misleading diagnostic that cited the JWKS rather than the underlying
metadata-level rule.
Add a new metadata-stage check `token_endpoint_auth_signing_alg_valid`.
Semantics:
- Field absent → `Skipped` with reason
"`token_endpoint_auth_signing_alg` not declared" (the field is
OPTIONAL overall).
- Field equal to `"none"` → `SpecViolation` with a pointed
diagnostic.
- Any other declared value → `Pass` (whether that value is actually
usable against the JWKS remains the responsibility of the
JWKS-stage `has_key_for_signing_alg` check).
Regression coverage: new `signing_alg_none/` metadata fixture and
integration test. All 326 tests pass; all 16 real-world atproto
OAuth clients still pass.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>