Skip to main content

khive_gate/
operation.rs

1//! Reviewed caller-requested effects for the built-in write restriction.
2//!
3//! Read permits existing incidental audit/cache/maintenance effects; it is not
4//! a storage-level read-only right. See `docs/api/operation-access.md`.
5
6/// Revision of the reviewed classification contract, included in policy identity.
7/// Bump whenever a classification or the allowed-read contract changes.
8pub const OPERATION_CLASSIFIER_VERSION: &str = "domain-effects-v19";
9
10/// Strongest caller-requested effect of a reviewed operation.
11#[derive(Clone, Copy, Debug, PartialEq, Eq)]
12pub enum OperationAccess {
13    /// Retrieval or calculation with existing incidental effects.
14    Read,
15    /// Domain mutation, control change, explicit maintenance, or external effect.
16    Write,
17}
18
19/// Exact reviewed names, including internal handlers and runtime pseudo-verbs.
20/// Sorted for lookup; unknown names must remain distinguishable from Write so
21/// the production registry census fails when a new handler needs review.
22pub const CLASSIFIED_OPERATIONS: &[(&str, OperationAccess)] = &[
23    ("agent.kill", OperationAccess::Write),
24    ("agent.observe", OperationAccess::Read),
25    ("agent.resume", OperationAccess::Write),
26    ("agent.spawn", OperationAccess::Write),
27    ("agent.suspend", OperationAccess::Write),
28    ("apply_changeset", OperationAccess::Write),
29    ("authorize", OperationAccess::Write),
30    ("authorize.visible", OperationAccess::Read),
31    ("blob.abort", OperationAccess::Write),
32    ("blob.begin", OperationAccess::Write),
33    ("blob.commit", OperationAccess::Write),
34    ("blob.export", OperationAccess::Write),
35    ("blob.get", OperationAccess::Read),
36    ("blob.import", OperationAccess::Write),
37    ("blob.put", OperationAccess::Write),
38    ("blob.put_part", OperationAccess::Write),
39    ("blob.stat", OperationAccess::Read),
40    ("brain.activate", OperationAccess::Write),
41    ("brain.archive", OperationAccess::Write),
42    ("brain.auto_feedback", OperationAccess::Write),
43    ("brain.bind", OperationAccess::Write),
44    ("brain.bindings", OperationAccess::Read),
45    ("brain.config", OperationAccess::Read),
46    ("brain.create_profile", OperationAccess::Write),
47    ("brain.deactivate", OperationAccess::Write),
48    ("brain.emit", OperationAccess::Write),
49    ("brain.event_counts", OperationAccess::Read),
50    ("brain.event_page", OperationAccess::Read),
51    ("brain.events", OperationAccess::Read),
52    ("brain.feedback", OperationAccess::Write),
53    ("brain.mark_turn", OperationAccess::Write),
54    ("brain.profile", OperationAccess::Read),
55    ("brain.profiles", OperationAccess::Read),
56    ("brain.record_serve", OperationAccess::Write),
57    ("brain.register_adapter", OperationAccess::Write),
58    ("brain.reset", OperationAccess::Write),
59    ("brain.resolve", OperationAccess::Read),
60    ("brain.state", OperationAccess::Read),
61    ("brain.unbind", OperationAccess::Write),
62    ("code.deps", OperationAccess::Read),
63    ("code.ingest", OperationAccess::Write),
64    ("code.list", OperationAccess::Read),
65    ("code.search", OperationAccess::Read),
66    ("comm.cleanup_expired_quarantine", OperationAccess::Write),
67    ("comm.cursor_commit", OperationAccess::Write),
68    ("comm.cursor_get", OperationAccess::Read),
69    ("comm.delivered", OperationAccess::Read),
70    ("comm.health", OperationAccess::Read),
71    ("comm.heartbeat", OperationAccess::Write),
72    ("comm.inbox", OperationAccess::Read),
73    ("comm.ingest", OperationAccess::Write),
74    ("comm.mark_read", OperationAccess::Write),
75    ("comm.probe", OperationAccess::Read),
76    ("comm.read", OperationAccess::Write),
77    ("comm.reply", OperationAccess::Write),
78    ("comm.send", OperationAccess::Write),
79    ("comm.suppression_add", OperationAccess::Write),
80    ("comm.suppression_list", OperationAccess::Read),
81    ("comm.suppression_remove", OperationAccess::Write),
82    ("comm.thread", OperationAccess::Read),
83    ("comm.transport_status", OperationAccess::Read),
84    ("comm.unread", OperationAccess::Read),
85    ("comm.withheld_body", OperationAccess::Write),
86    ("context", OperationAccess::Read),
87    ("count", OperationAccess::Read),
88    ("create", OperationAccess::Write),
89    ("db_diagnostics", OperationAccess::Read),
90    ("delete", OperationAccess::Write),
91    ("exec.events", OperationAccess::Read),
92    ("exec.identity", OperationAccess::Read),
93    ("exec.receipt", OperationAccess::Read),
94    ("exec.run", OperationAccess::Write),
95    ("exec.runs", OperationAccess::Read),
96    ("exec.tree", OperationAccess::Write),
97    ("exec.tree_diff", OperationAccess::Read),
98    ("exec.tree_get", OperationAccess::Read),
99    ("exec.tree_put", OperationAccess::Write),
100    ("get", OperationAccess::Read),
101    ("git.branch", OperationAccess::Write),
102    ("git.checkout", OperationAccess::Write),
103    ("git.commit", OperationAccess::Write),
104    ("git.diff", OperationAccess::Write),
105    ("git.digest", OperationAccess::Write),
106    ("git.gates", OperationAccess::Read),
107    ("git.ingest_cursor", OperationAccess::Read),
108    ("git.init", OperationAccess::Write),
109    ("git.log", OperationAccess::Read),
110    ("git.pr_merge", OperationAccess::Write),
111    ("git.pr_open", OperationAccess::Write),
112    ("git.pr_review", OperationAccess::Write),
113    ("git.push", OperationAccess::Write),
114    ("git.receipts", OperationAccess::Read),
115    ("git.reconcile", OperationAccess::Write),
116    ("git.status", OperationAccess::Read),
117    ("git.update_ref", OperationAccess::Write),
118    ("gtd.assign", OperationAccess::Write),
119    ("gtd.census", OperationAccess::Read),
120    ("gtd.complete", OperationAccess::Write),
121    ("gtd.next", OperationAccess::Read),
122    ("gtd.repair", OperationAccess::Write),
123    ("gtd.tasks", OperationAccess::Read),
124    ("gtd.transition", OperationAccess::Write),
125    ("knowledge.adjudicate", OperationAccess::Write),
126    ("knowledge.challenge", OperationAccess::Write),
127    ("knowledge.cite", OperationAccess::Write),
128    ("knowledge.compose", OperationAccess::Read),
129    ("knowledge.delete_atoms", OperationAccess::Write),
130    ("knowledge.edit", OperationAccess::Write),
131    ("knowledge.eval_retrieval", OperationAccess::Write),
132    ("knowledge.export", OperationAccess::Read),
133    ("knowledge.feedback", OperationAccess::Write),
134    ("knowledge.fold", OperationAccess::Read),
135    ("knowledge.get", OperationAccess::Read),
136    ("knowledge.import", OperationAccess::Write),
137    ("knowledge.index", OperationAccess::Write),
138    ("knowledge.learn", OperationAccess::Write),
139    ("knowledge.lint", OperationAccess::Write),
140    ("knowledge.list", OperationAccess::Read),
141    ("knowledge.search", OperationAccess::Read),
142    ("knowledge.stats", OperationAccess::Read),
143    ("knowledge.suggest", OperationAccess::Read),
144    ("knowledge.topic", OperationAccess::Read),
145    ("knowledge.upsert_atoms", OperationAccess::Write),
146    ("knowledge.upsert_domains", OperationAccess::Write),
147    ("link", OperationAccess::Write),
148    ("list", OperationAccess::Read),
149    ("memory.feedback", OperationAccess::Write),
150    ("memory.prune", OperationAccess::Write),
151    ("memory.recall", OperationAccess::Read),
152    ("memory.recall_candidates", OperationAccess::Read),
153    ("memory.recall_embed", OperationAccess::Read),
154    ("memory.recall_fuse", OperationAccess::Read),
155    ("memory.recall_rerank", OperationAccess::Read),
156    ("memory.recall_score", OperationAccess::Read),
157    ("memory.remember", OperationAccess::Write),
158    ("memory.vacuum", OperationAccess::Write),
159    ("merge", OperationAccess::Write),
160    ("moodboard.ingest", OperationAccess::Write),
161    ("moodboard.judge", OperationAccess::Write),
162    ("moodboard.model", OperationAccess::Read),
163    ("moodboard.preference", OperationAccess::Read),
164    ("moodboard.search", OperationAccess::Read),
165    ("moodboard.serve", OperationAccess::Write),
166    ("moodboard.train_preference", OperationAccess::Write),
167    ("neighbors", OperationAccess::Read),
168    ("propose", OperationAccess::Write),
169    ("query", OperationAccess::Read),
170    ("resolve", OperationAccess::Read),
171    ("restore", OperationAccess::Write),
172    ("review", OperationAccess::Write),
173    ("scan", OperationAccess::Read),
174    ("schedule.agenda", OperationAccess::Read),
175    ("schedule.cancel", OperationAccess::Write),
176    ("schedule.remind", OperationAccess::Write),
177    ("schedule.schedule", OperationAccess::Write),
178    ("schema", OperationAccess::Read),
179    ("search", OperationAccess::Read),
180    ("session.export", OperationAccess::Read),
181    ("session.list", OperationAccess::Read),
182    ("session.resume", OperationAccess::Read),
183    ("session.search", OperationAccess::Read),
184    ("session.stats", OperationAccess::Read),
185    ("session.store", OperationAccess::Write),
186    ("session.vacuum", OperationAccess::Write),
187    ("stats", OperationAccess::Read),
188    ("stream.append", OperationAccess::Write),
189    ("stream.batch", OperationAccess::Write),
190    ("stream.read", OperationAccess::Read),
191    ("stream.stat", OperationAccess::Read),
192    ("telemetry.channels", OperationAccess::Read),
193    ("telemetry.counts", OperationAccess::Read),
194    ("telemetry.emit", OperationAccess::Write),
195    ("telemetry.read", OperationAccess::Read),
196    ("tool.check", OperationAccess::Read),
197    ("tool.deny", OperationAccess::Write),
198    ("tool.describe", OperationAccess::Read),
199    ("tool.grant", OperationAccess::Write),
200    ("tool.ingest", OperationAccess::Write),
201    ("tool.list", OperationAccess::Read),
202    ("tool.policies", OperationAccess::Read),
203    ("tool.policy", OperationAccess::Write),
204    ("tool.policy_delete", OperationAccess::Write),
205    ("tool.register", OperationAccess::Write),
206    ("tool.request", OperationAccess::Write),
207    ("tool.requests", OperationAccess::Read),
208    ("tool.revoke", OperationAccess::Write),
209    ("tool.suggest", OperationAccess::Read),
210    ("traverse", OperationAccess::Read),
211    ("update", OperationAccess::Write),
212    ("verbs", OperationAccess::Read),
213    ("web.extract", OperationAccess::Write),
214    ("web.fetch", OperationAccess::Write),
215    ("web.ingest", OperationAccess::Write),
216    ("web.refresh", OperationAccess::Write),
217    ("web.search", OperationAccess::Write),
218    ("whoami", OperationAccess::Read),
219    ("withdraw", OperationAccess::Write),
220];
221
222/// Classify an exact registered or pseudo-verb name. No prefix/category inference.
223/// A restricting gate must deny `None`, just as it denies explicit Write.
224pub fn classify_operation(verb: &str) -> Option<OperationAccess> {
225    CLASSIFIED_OPERATIONS
226        .binary_search_by_key(&verb, |(name, _)| *name)
227        .ok()
228        .map(|index| CLASSIFIED_OPERATIONS[index].1)
229}
230
231#[cfg(test)]
232#[path = "operation_lint_tests.rs"]
233mod lint_tests;