khive-gate 0.9.0

Pluggable authorization gate trait + default AllowAllGate impl for khive verb dispatch.
Documentation
//! Reviewed caller-requested effects for the built-in write restriction.
//!
//! Read permits existing incidental audit/cache/maintenance effects; it is not
//! a storage-level read-only right. See `docs/api/operation-access.md`.

/// Revision of the reviewed classification contract, included in policy identity.
/// Bump whenever a classification or the allowed-read contract changes.
pub const OPERATION_CLASSIFIER_VERSION: &str = "domain-effects-v6";

/// Strongest caller-requested effect of a reviewed operation.
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum OperationAccess {
    /// Retrieval or calculation with existing incidental effects.
    Read,
    /// Domain mutation, control change, explicit maintenance, or external effect.
    Write,
}

/// Exact reviewed names, including internal handlers and runtime pseudo-verbs.
/// Sorted for lookup; unknown names must remain distinguishable from Write so
/// the production registry census fails when a new handler needs review.
pub const CLASSIFIED_OPERATIONS: &[(&str, OperationAccess)] = &[
    ("agent.kill", OperationAccess::Write),
    ("agent.observe", OperationAccess::Read),
    ("agent.resume", OperationAccess::Write),
    ("agent.spawn", OperationAccess::Write),
    ("agent.suspend", OperationAccess::Write),
    ("authorize", OperationAccess::Write),
    ("authorize.visible", OperationAccess::Read),
    ("blob.abort", OperationAccess::Write),
    ("blob.begin", OperationAccess::Write),
    ("blob.commit", OperationAccess::Write),
    ("blob.get", OperationAccess::Read),
    ("blob.put", OperationAccess::Write),
    ("blob.put_part", OperationAccess::Write),
    ("blob.stat", OperationAccess::Read),
    ("brain.activate", OperationAccess::Write),
    ("brain.archive", OperationAccess::Write),
    ("brain.auto_feedback", OperationAccess::Write),
    ("brain.bind", OperationAccess::Write),
    ("brain.bindings", OperationAccess::Read),
    ("brain.config", OperationAccess::Read),
    ("brain.create_profile", OperationAccess::Write),
    ("brain.deactivate", OperationAccess::Write),
    ("brain.emit", OperationAccess::Write),
    ("brain.event_counts", OperationAccess::Read),
    ("brain.events", OperationAccess::Read),
    ("brain.feedback", OperationAccess::Write),
    ("brain.mark_turn", OperationAccess::Write),
    ("brain.profile", OperationAccess::Read),
    ("brain.profiles", OperationAccess::Read),
    ("brain.record_serve", OperationAccess::Write),
    ("brain.register_adapter", OperationAccess::Write),
    ("brain.reset", OperationAccess::Write),
    ("brain.resolve", OperationAccess::Read),
    ("brain.state", OperationAccess::Read),
    ("brain.unbind", OperationAccess::Write),
    ("code.ingest", OperationAccess::Write),
    ("comm.cursor_commit", OperationAccess::Write),
    ("comm.cursor_get", OperationAccess::Read),
    ("comm.delivered", OperationAccess::Read),
    ("comm.health", OperationAccess::Read),
    ("comm.heartbeat", OperationAccess::Write),
    ("comm.inbox", OperationAccess::Read),
    ("comm.ingest", OperationAccess::Write),
    ("comm.mark_read", OperationAccess::Write),
    ("comm.probe", OperationAccess::Read),
    ("comm.read", OperationAccess::Write),
    ("comm.reply", OperationAccess::Write),
    ("comm.send", OperationAccess::Write),
    ("comm.thread", OperationAccess::Read),
    ("comm.unread", OperationAccess::Read),
    ("context", OperationAccess::Read),
    ("create", OperationAccess::Write),
    ("db_diagnostics", OperationAccess::Read),
    ("delete", OperationAccess::Write),
    ("exec.events", OperationAccess::Read),
    ("exec.identity", OperationAccess::Read),
    ("exec.receipt", OperationAccess::Read),
    ("exec.run", OperationAccess::Write),
    ("exec.runs", OperationAccess::Read),
    ("exec.tree", OperationAccess::Write),
    ("exec.tree_diff", OperationAccess::Read),
    ("exec.tree_get", OperationAccess::Read),
    ("exec.tree_put", OperationAccess::Write),
    ("get", OperationAccess::Read),
    ("git.branch", OperationAccess::Write),
    ("git.checkout", OperationAccess::Write),
    ("git.commit", OperationAccess::Write),
    ("git.diff", OperationAccess::Write),
    ("git.digest", OperationAccess::Write),
    ("git.gates", OperationAccess::Read),
    ("git.ingest_cursor", OperationAccess::Read),
    ("git.init", OperationAccess::Write),
    ("git.log", OperationAccess::Read),
    ("git.pr_merge", OperationAccess::Write),
    ("git.pr_open", OperationAccess::Write),
    ("git.pr_review", OperationAccess::Write),
    ("git.push", OperationAccess::Write),
    ("git.receipts", OperationAccess::Read),
    ("git.reconcile", OperationAccess::Write),
    ("git.status", OperationAccess::Read),
    ("git.update_ref", OperationAccess::Write),
    ("gtd.assign", OperationAccess::Write),
    ("gtd.census", OperationAccess::Read),
    ("gtd.complete", OperationAccess::Write),
    ("gtd.next", OperationAccess::Read),
    ("gtd.repair", OperationAccess::Write),
    ("gtd.tasks", OperationAccess::Read),
    ("gtd.transition", OperationAccess::Write),
    ("knowledge.adjudicate", OperationAccess::Write),
    ("knowledge.challenge", OperationAccess::Write),
    ("knowledge.cite", OperationAccess::Write),
    ("knowledge.compose", OperationAccess::Read),
    ("knowledge.delete_atoms", OperationAccess::Write),
    ("knowledge.edit", OperationAccess::Write),
    ("knowledge.eval_retrieval", OperationAccess::Write),
    ("knowledge.feedback", OperationAccess::Write),
    ("knowledge.fold", OperationAccess::Read),
    ("knowledge.get", OperationAccess::Read),
    ("knowledge.import", OperationAccess::Write),
    ("knowledge.index", OperationAccess::Write),
    ("knowledge.learn", OperationAccess::Write),
    ("knowledge.list", OperationAccess::Read),
    ("knowledge.search", OperationAccess::Read),
    ("knowledge.stats", OperationAccess::Read),
    ("knowledge.suggest", OperationAccess::Read),
    ("knowledge.topic", OperationAccess::Read),
    ("knowledge.upsert_atoms", OperationAccess::Write),
    ("knowledge.upsert_domains", OperationAccess::Write),
    ("link", OperationAccess::Write),
    ("list", OperationAccess::Read),
    ("memory.feedback", OperationAccess::Write),
    ("memory.prune", OperationAccess::Write),
    ("memory.recall", OperationAccess::Read),
    ("memory.recall_candidates", OperationAccess::Read),
    ("memory.recall_embed", OperationAccess::Read),
    ("memory.recall_fuse", OperationAccess::Read),
    ("memory.recall_rerank", OperationAccess::Read),
    ("memory.recall_score", OperationAccess::Read),
    ("memory.remember", OperationAccess::Write),
    ("memory.vacuum", OperationAccess::Write),
    ("merge", OperationAccess::Write),
    ("moodboard.ingest", OperationAccess::Write),
    ("moodboard.judge", OperationAccess::Write),
    ("moodboard.model", OperationAccess::Read),
    ("moodboard.preference", OperationAccess::Read),
    ("moodboard.search", OperationAccess::Read),
    ("moodboard.serve", OperationAccess::Write),
    ("moodboard.train_preference", OperationAccess::Write),
    ("neighbors", OperationAccess::Read),
    ("propose", OperationAccess::Write),
    ("query", OperationAccess::Read),
    ("resolve", OperationAccess::Read),
    ("restore", OperationAccess::Write),
    ("review", OperationAccess::Write),
    ("scan", OperationAccess::Read),
    ("schedule.agenda", OperationAccess::Read),
    ("schedule.cancel", OperationAccess::Write),
    ("schedule.remind", OperationAccess::Write),
    ("schedule.schedule", OperationAccess::Write),
    ("search", OperationAccess::Read),
    ("session.export", OperationAccess::Read),
    ("session.list", OperationAccess::Read),
    ("session.resume", OperationAccess::Read),
    ("session.search", OperationAccess::Read),
    ("session.store", OperationAccess::Write),
    ("stats", OperationAccess::Read),
    ("stream.append", OperationAccess::Write),
    ("stream.batch", OperationAccess::Write),
    ("stream.read", OperationAccess::Read),
    ("stream.stat", OperationAccess::Read),
    ("telemetry.channels", OperationAccess::Read),
    ("telemetry.counts", OperationAccess::Read),
    ("telemetry.emit", OperationAccess::Write),
    ("telemetry.read", OperationAccess::Read),
    ("tool.check", OperationAccess::Read),
    ("tool.deny", OperationAccess::Write),
    ("tool.describe", OperationAccess::Read),
    ("tool.grant", OperationAccess::Write),
    ("tool.ingest", OperationAccess::Write),
    ("tool.list", OperationAccess::Read),
    ("tool.policies", OperationAccess::Read),
    ("tool.policy", OperationAccess::Write),
    ("tool.policy_delete", OperationAccess::Write),
    ("tool.register", OperationAccess::Write),
    ("tool.request", OperationAccess::Write),
    ("tool.requests", OperationAccess::Read),
    ("tool.revoke", OperationAccess::Write),
    ("tool.suggest", OperationAccess::Read),
    ("traverse", OperationAccess::Read),
    ("update", OperationAccess::Write),
    ("verbs", OperationAccess::Read),
    ("web.extract", OperationAccess::Write),
    ("web.fetch", OperationAccess::Write),
    ("web.ingest", OperationAccess::Write),
    ("web.refresh", OperationAccess::Write),
    ("web.search", OperationAccess::Write),
    ("whoami", OperationAccess::Read),
    ("withdraw", OperationAccess::Write),
];

/// Classify an exact registered or pseudo-verb name. No prefix/category inference.
/// A restricting gate must deny `None`, just as it denies explicit Write.
pub fn classify_operation(verb: &str) -> Option<OperationAccess> {
    CLASSIFIED_OPERATIONS
        .binary_search_by_key(&verb, |(name, _)| *name)
        .ok()
        .map(|index| CLASSIFIED_OPERATIONS[index].1)
}