Coverage for node / src / stigmem_node / plugins / hooks.py: 100%
46 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-05-25 01:49 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-05-25 01:49 +0000
1"""Stable PR 4-INF.1 hook definitions."""
3from __future__ import annotations
5from dataclasses import dataclass
6from enum import StrEnum
8from .bands import Band
11class HookSemantic(StrEnum):
12 VOTING = "voting"
13 FILTER_CHAIN = "filter_chain"
14 SCORE_DELTA = "score_delta"
15 FIRE_AND_FORGET = "fire_and_forget"
18class HookOrdering(StrEnum):
19 CORE_FIRST = "core_first"
20 PLUGINS_FIRST = "plugins_first"
21 CORE_ONLY_DEFAULT = "core_only_default"
22 PLUGIN_ONLY = "plugin_only"
25class HookName(StrEnum):
26 PRE_ASSERT_AUTHORIZE = "pre_assert_authorize"
27 PRE_ASSERT_VALIDATE = "pre_assert_validate"
28 PRE_ASSERT_TRANSFORM = "pre_assert_transform"
29 POST_ASSERT_PERSIST = "post_assert_persist"
30 POST_ASSERT_PROPAGATE = "post_assert_propagate"
31 POST_ASSERT_AUDIT = "post_assert_audit"
32 PRE_RECALL_AUTHORIZE = "pre_recall_authorize"
33 PRE_RECALL_REWRITE = "pre_recall_rewrite"
34 RECALL_FILTER = "recall_filter"
35 RECALL_RANK = "recall_rank"
36 POST_RECALL_AUDIT = "post_recall_audit"
37 FEDERATION_PEER_AUTHENTICATE = "federation_peer_authenticate"
38 FEDERATION_INBOUND_VALIDATE = "federation_inbound_validate"
39 FEDERATION_INBOUND_FILTER = "federation_inbound_filter"
40 FEDERATION_OUTBOUND_FILTER = "federation_outbound_filter"
41 FEDERATION_OUTBOUND_SIGN = "federation_outbound_sign"
42 IDENTITY_RESOLVE = "identity_resolve"
43 TENANT_RESOLVE = "tenant_resolve"
44 CAPABILITY_CHECK = "capability_check"
45 MIGRATION_REGISTER = "migration_register"
46 AUDIT_EMIT = "audit_emit"
47 CONFIG_VALIDATE = "config_validate"
50@dataclass(frozen=True, slots=True)
51class HookSpec:
52 name: HookName
53 band: Band
54 semantic: HookSemantic
55 ordering: HookOrdering
56 strict_audit: bool = False
59HOOK_SPECS: dict[str, HookSpec] = {
60 HookName.PRE_ASSERT_AUTHORIZE.value: HookSpec(
61 HookName.PRE_ASSERT_AUTHORIZE,
62 Band.AUTHZ,
63 HookSemantic.VOTING,
64 HookOrdering.CORE_FIRST,
65 ),
66 HookName.PRE_ASSERT_VALIDATE.value: HookSpec(
67 HookName.PRE_ASSERT_VALIDATE,
68 Band.VALIDATE,
69 HookSemantic.VOTING,
70 HookOrdering.CORE_FIRST,
71 ),
72 HookName.PRE_ASSERT_TRANSFORM.value: HookSpec(
73 HookName.PRE_ASSERT_TRANSFORM,
74 Band.TRANSFORM,
75 HookSemantic.FILTER_CHAIN,
76 HookOrdering.PLUGINS_FIRST,
77 ),
78 HookName.POST_ASSERT_PERSIST.value: HookSpec(
79 HookName.POST_ASSERT_PERSIST,
80 Band.PERSIST,
81 HookSemantic.FIRE_AND_FORGET,
82 HookOrdering.PLUGIN_ONLY,
83 ),
84 HookName.POST_ASSERT_PROPAGATE.value: HookSpec(
85 HookName.POST_ASSERT_PROPAGATE,
86 Band.PERSIST,
87 HookSemantic.FIRE_AND_FORGET,
88 HookOrdering.PLUGIN_ONLY,
89 ),
90 HookName.POST_ASSERT_AUDIT.value: HookSpec(
91 HookName.POST_ASSERT_AUDIT,
92 Band.AUDIT,
93 HookSemantic.FIRE_AND_FORGET,
94 HookOrdering.CORE_ONLY_DEFAULT,
95 strict_audit=True,
96 ),
97 HookName.PRE_RECALL_AUTHORIZE.value: HookSpec(
98 HookName.PRE_RECALL_AUTHORIZE,
99 Band.AUTHZ,
100 HookSemantic.VOTING,
101 HookOrdering.CORE_FIRST,
102 ),
103 HookName.PRE_RECALL_REWRITE.value: HookSpec(
104 HookName.PRE_RECALL_REWRITE,
105 Band.TRANSFORM,
106 HookSemantic.FILTER_CHAIN,
107 HookOrdering.PLUGINS_FIRST,
108 ),
109 HookName.RECALL_FILTER.value: HookSpec(
110 HookName.RECALL_FILTER,
111 Band.FILTER,
112 HookSemantic.FILTER_CHAIN,
113 HookOrdering.PLUGINS_FIRST,
114 ),
115 HookName.RECALL_RANK.value: HookSpec(
116 HookName.RECALL_RANK,
117 Band.RANK,
118 HookSemantic.SCORE_DELTA,
119 HookOrdering.PLUGINS_FIRST,
120 ),
121 HookName.POST_RECALL_AUDIT.value: HookSpec(
122 HookName.POST_RECALL_AUDIT,
123 Band.AUDIT,
124 HookSemantic.FIRE_AND_FORGET,
125 HookOrdering.CORE_ONLY_DEFAULT,
126 strict_audit=True,
127 ),
128 HookName.FEDERATION_PEER_AUTHENTICATE.value: HookSpec(
129 HookName.FEDERATION_PEER_AUTHENTICATE,
130 Band.AUTHN,
131 HookSemantic.VOTING,
132 HookOrdering.CORE_FIRST,
133 ),
134 HookName.FEDERATION_INBOUND_VALIDATE.value: HookSpec(
135 HookName.FEDERATION_INBOUND_VALIDATE,
136 Band.VALIDATE,
137 HookSemantic.VOTING,
138 HookOrdering.CORE_FIRST,
139 ),
140 HookName.FEDERATION_INBOUND_FILTER.value: HookSpec(
141 HookName.FEDERATION_INBOUND_FILTER,
142 Band.FILTER,
143 HookSemantic.FILTER_CHAIN,
144 HookOrdering.PLUGINS_FIRST,
145 ),
146 HookName.FEDERATION_OUTBOUND_FILTER.value: HookSpec(
147 HookName.FEDERATION_OUTBOUND_FILTER,
148 Band.FILTER,
149 HookSemantic.FILTER_CHAIN,
150 HookOrdering.PLUGINS_FIRST,
151 ),
152 HookName.FEDERATION_OUTBOUND_SIGN.value: HookSpec(
153 HookName.FEDERATION_OUTBOUND_SIGN,
154 Band.TRANSFORM,
155 HookSemantic.FILTER_CHAIN,
156 HookOrdering.PLUGINS_FIRST,
157 ),
158 HookName.IDENTITY_RESOLVE.value: HookSpec(
159 HookName.IDENTITY_RESOLVE,
160 Band.AUTHN,
161 HookSemantic.FILTER_CHAIN,
162 HookOrdering.CORE_FIRST,
163 ),
164 HookName.TENANT_RESOLVE.value: HookSpec(
165 HookName.TENANT_RESOLVE,
166 Band.AUTHN,
167 HookSemantic.FILTER_CHAIN,
168 HookOrdering.CORE_FIRST,
169 ),
170 HookName.CAPABILITY_CHECK.value: HookSpec(
171 HookName.CAPABILITY_CHECK,
172 Band.AUTHZ,
173 HookSemantic.VOTING,
174 HookOrdering.CORE_FIRST,
175 ),
176 HookName.MIGRATION_REGISTER.value: HookSpec(
177 HookName.MIGRATION_REGISTER,
178 Band.TRANSFORM,
179 HookSemantic.FILTER_CHAIN,
180 HookOrdering.CORE_ONLY_DEFAULT,
181 ),
182 HookName.AUDIT_EMIT.value: HookSpec(
183 HookName.AUDIT_EMIT,
184 Band.AUDIT,
185 HookSemantic.FIRE_AND_FORGET,
186 HookOrdering.CORE_ONLY_DEFAULT,
187 strict_audit=True,
188 ),
189 HookName.CONFIG_VALIDATE.value: HookSpec(
190 HookName.CONFIG_VALIDATE,
191 Band.VALIDATE,
192 HookSemantic.VOTING,
193 HookOrdering.CORE_FIRST,
194 ),
195}
197KNOWN_HOOKS = frozenset(HOOK_SPECS)