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-v6";
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    ("authorize", OperationAccess::Write),
29    ("authorize.visible", OperationAccess::Read),
30    ("blob.abort", OperationAccess::Write),
31    ("blob.begin", OperationAccess::Write),
32    ("blob.commit", OperationAccess::Write),
33    ("blob.get", OperationAccess::Read),
34    ("blob.put", OperationAccess::Write),
35    ("blob.put_part", OperationAccess::Write),
36    ("blob.stat", OperationAccess::Read),
37    ("brain.activate", OperationAccess::Write),
38    ("brain.archive", OperationAccess::Write),
39    ("brain.auto_feedback", OperationAccess::Write),
40    ("brain.bind", OperationAccess::Write),
41    ("brain.bindings", OperationAccess::Read),
42    ("brain.config", OperationAccess::Read),
43    ("brain.create_profile", OperationAccess::Write),
44    ("brain.deactivate", OperationAccess::Write),
45    ("brain.emit", OperationAccess::Write),
46    ("brain.event_counts", OperationAccess::Read),
47    ("brain.events", OperationAccess::Read),
48    ("brain.feedback", OperationAccess::Write),
49    ("brain.mark_turn", OperationAccess::Write),
50    ("brain.profile", OperationAccess::Read),
51    ("brain.profiles", OperationAccess::Read),
52    ("brain.record_serve", OperationAccess::Write),
53    ("brain.register_adapter", OperationAccess::Write),
54    ("brain.reset", OperationAccess::Write),
55    ("brain.resolve", OperationAccess::Read),
56    ("brain.state", OperationAccess::Read),
57    ("brain.unbind", OperationAccess::Write),
58    ("code.ingest", OperationAccess::Write),
59    ("comm.cursor_commit", OperationAccess::Write),
60    ("comm.cursor_get", OperationAccess::Read),
61    ("comm.delivered", OperationAccess::Read),
62    ("comm.health", OperationAccess::Read),
63    ("comm.heartbeat", OperationAccess::Write),
64    ("comm.inbox", OperationAccess::Read),
65    ("comm.ingest", OperationAccess::Write),
66    ("comm.mark_read", OperationAccess::Write),
67    ("comm.probe", OperationAccess::Read),
68    ("comm.read", OperationAccess::Write),
69    ("comm.reply", OperationAccess::Write),
70    ("comm.send", OperationAccess::Write),
71    ("comm.thread", OperationAccess::Read),
72    ("comm.unread", OperationAccess::Read),
73    ("context", OperationAccess::Read),
74    ("create", OperationAccess::Write),
75    ("db_diagnostics", OperationAccess::Read),
76    ("delete", OperationAccess::Write),
77    ("exec.events", OperationAccess::Read),
78    ("exec.identity", OperationAccess::Read),
79    ("exec.receipt", OperationAccess::Read),
80    ("exec.run", OperationAccess::Write),
81    ("exec.runs", OperationAccess::Read),
82    ("exec.tree", OperationAccess::Write),
83    ("exec.tree_diff", OperationAccess::Read),
84    ("exec.tree_get", OperationAccess::Read),
85    ("exec.tree_put", OperationAccess::Write),
86    ("get", OperationAccess::Read),
87    ("git.branch", OperationAccess::Write),
88    ("git.checkout", OperationAccess::Write),
89    ("git.commit", OperationAccess::Write),
90    ("git.diff", OperationAccess::Write),
91    ("git.digest", OperationAccess::Write),
92    ("git.gates", OperationAccess::Read),
93    ("git.ingest_cursor", OperationAccess::Read),
94    ("git.init", OperationAccess::Write),
95    ("git.log", OperationAccess::Read),
96    ("git.pr_merge", OperationAccess::Write),
97    ("git.pr_open", OperationAccess::Write),
98    ("git.pr_review", OperationAccess::Write),
99    ("git.push", OperationAccess::Write),
100    ("git.receipts", OperationAccess::Read),
101    ("git.reconcile", OperationAccess::Write),
102    ("git.status", OperationAccess::Read),
103    ("git.update_ref", OperationAccess::Write),
104    ("gtd.assign", OperationAccess::Write),
105    ("gtd.census", OperationAccess::Read),
106    ("gtd.complete", OperationAccess::Write),
107    ("gtd.next", OperationAccess::Read),
108    ("gtd.repair", OperationAccess::Write),
109    ("gtd.tasks", OperationAccess::Read),
110    ("gtd.transition", OperationAccess::Write),
111    ("knowledge.adjudicate", OperationAccess::Write),
112    ("knowledge.challenge", OperationAccess::Write),
113    ("knowledge.cite", OperationAccess::Write),
114    ("knowledge.compose", OperationAccess::Read),
115    ("knowledge.delete_atoms", OperationAccess::Write),
116    ("knowledge.edit", OperationAccess::Write),
117    ("knowledge.eval_retrieval", OperationAccess::Write),
118    ("knowledge.feedback", OperationAccess::Write),
119    ("knowledge.fold", OperationAccess::Read),
120    ("knowledge.get", OperationAccess::Read),
121    ("knowledge.import", OperationAccess::Write),
122    ("knowledge.index", OperationAccess::Write),
123    ("knowledge.learn", OperationAccess::Write),
124    ("knowledge.list", OperationAccess::Read),
125    ("knowledge.search", OperationAccess::Read),
126    ("knowledge.stats", OperationAccess::Read),
127    ("knowledge.suggest", OperationAccess::Read),
128    ("knowledge.topic", OperationAccess::Read),
129    ("knowledge.upsert_atoms", OperationAccess::Write),
130    ("knowledge.upsert_domains", OperationAccess::Write),
131    ("link", OperationAccess::Write),
132    ("list", OperationAccess::Read),
133    ("memory.feedback", OperationAccess::Write),
134    ("memory.prune", OperationAccess::Write),
135    ("memory.recall", OperationAccess::Read),
136    ("memory.recall_candidates", OperationAccess::Read),
137    ("memory.recall_embed", OperationAccess::Read),
138    ("memory.recall_fuse", OperationAccess::Read),
139    ("memory.recall_rerank", OperationAccess::Read),
140    ("memory.recall_score", OperationAccess::Read),
141    ("memory.remember", OperationAccess::Write),
142    ("memory.vacuum", OperationAccess::Write),
143    ("merge", OperationAccess::Write),
144    ("moodboard.ingest", OperationAccess::Write),
145    ("moodboard.judge", OperationAccess::Write),
146    ("moodboard.model", OperationAccess::Read),
147    ("moodboard.preference", OperationAccess::Read),
148    ("moodboard.search", OperationAccess::Read),
149    ("moodboard.serve", OperationAccess::Write),
150    ("moodboard.train_preference", OperationAccess::Write),
151    ("neighbors", OperationAccess::Read),
152    ("propose", OperationAccess::Write),
153    ("query", OperationAccess::Read),
154    ("resolve", OperationAccess::Read),
155    ("restore", OperationAccess::Write),
156    ("review", OperationAccess::Write),
157    ("scan", OperationAccess::Read),
158    ("schedule.agenda", OperationAccess::Read),
159    ("schedule.cancel", OperationAccess::Write),
160    ("schedule.remind", OperationAccess::Write),
161    ("schedule.schedule", OperationAccess::Write),
162    ("search", OperationAccess::Read),
163    ("session.export", OperationAccess::Read),
164    ("session.list", OperationAccess::Read),
165    ("session.resume", OperationAccess::Read),
166    ("session.search", OperationAccess::Read),
167    ("session.store", OperationAccess::Write),
168    ("stats", OperationAccess::Read),
169    ("stream.append", OperationAccess::Write),
170    ("stream.batch", OperationAccess::Write),
171    ("stream.read", OperationAccess::Read),
172    ("stream.stat", OperationAccess::Read),
173    ("telemetry.channels", OperationAccess::Read),
174    ("telemetry.counts", OperationAccess::Read),
175    ("telemetry.emit", OperationAccess::Write),
176    ("telemetry.read", OperationAccess::Read),
177    ("tool.check", OperationAccess::Read),
178    ("tool.deny", OperationAccess::Write),
179    ("tool.describe", OperationAccess::Read),
180    ("tool.grant", OperationAccess::Write),
181    ("tool.ingest", OperationAccess::Write),
182    ("tool.list", OperationAccess::Read),
183    ("tool.policies", OperationAccess::Read),
184    ("tool.policy", OperationAccess::Write),
185    ("tool.policy_delete", OperationAccess::Write),
186    ("tool.register", OperationAccess::Write),
187    ("tool.request", OperationAccess::Write),
188    ("tool.requests", OperationAccess::Read),
189    ("tool.revoke", OperationAccess::Write),
190    ("tool.suggest", OperationAccess::Read),
191    ("traverse", OperationAccess::Read),
192    ("update", OperationAccess::Write),
193    ("verbs", OperationAccess::Read),
194    ("web.extract", OperationAccess::Write),
195    ("web.fetch", OperationAccess::Write),
196    ("web.ingest", OperationAccess::Write),
197    ("web.refresh", OperationAccess::Write),
198    ("web.search", OperationAccess::Write),
199    ("whoami", OperationAccess::Read),
200    ("withdraw", OperationAccess::Write),
201];
202
203/// Classify an exact registered or pseudo-verb name. No prefix/category inference.
204/// A restricting gate must deny `None`, just as it denies explicit Write.
205pub fn classify_operation(verb: &str) -> Option<OperationAccess> {
206    CLASSIFIED_OPERATIONS
207        .binary_search_by_key(&verb, |(name, _)| *name)
208        .ok()
209        .map(|index| CLASSIFIED_OPERATIONS[index].1)
210}