1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
//! Verified claim payload returned by the JWT engine after `verify`.
//!
//! Surface discipline (Phase 2 Decision 1, extended Phase 4):
//!
//! - **Hidden** — claims the engine fully resolves with no caller
//! participation:
//! - `aud` (M20-M22 validates against `cfg.audience`)
//! - `cat` (M29 validates against `cfg.expected_cat`)
//! - `dlg_depth` (M43 validates ≤ 4)
//! - `sv` (Phase 5 cache compares against `sv:{sub}`)
//! - **Surfaced** — claims callers legitimately need post-verify:
//! - `client_id` (M28a — audit logs, per-client rate limits)
//! - `account_type` (M40 — admin gate code reads it)
//! - `caps`, `scopes` (M41/M42 — capability check is post-verify)
//! - `delegator` (Token Exchange audit logs)
//! - `cid` (forensic / selective-session-kill)
//! - `active_ppnum` (UI display)
//! - `admin` (admin RPC handlers gate on it)
//!
//! Surfacing wrongly is a forward-compat tax (every caller must handle
//! the new field). Hiding wrongly leaves callers without info they need.
//! When in doubt, hide — adding later is cheap; removing later is a
//! breaking change.