Status: Proposed (2026-07-28); design in
docs/design/operator-service.md. Relates to
ADR-0012 and
ADR-0014 (the authorization seam and the
self-hosted policy database it reuses), and to
ADR-0017 / ADR-0018,
whose long-running key operations are what made this urgent.
Several operator duties are not implemented by a service — they are
implemented by the CLI. corium backup obtains a basis and storage connection
from the transactor and then reads the blob store and native log itself.
corium gc --data-dir runs mark-and-sweep in-process and requires the
transactor to be stopped. restore, fork, and the authz policy commands are
the same shape. Each holds credentials, and each runs for as long as it runs
inside whatever shell invoked it.
Three consequences have been tolerable and are about to stop being so.
Long-running work has no home: a backup, a fork, an epoch drain, and — newly — a protection sweep are hour-scale operations whose completion currently depends on an interactive process staying alive. Credentials spread outward: backup and GC need storage credentials, and the protection sweep needs the class keys that ADR-0018 exists to withhold, so making these CLI duties distributes exactly the material the encryption design is careful about. And nothing is recorded: who ran a GC, what a restore installed, how far a sweep progressed, and against which basis are all questions whose answer today is terminal scrollback.
The transactor is the wrong place to fix this. It is the process whose latency
belongs to the commit pipeline, and hanging hour-long orchestration off
Catalog couples operations to the write path.
Add a dedicated operator process — a peer whose workload is operations —
exposing an Operator gRPC service, a JSON/HTTP gateway, and eventually a web
UI, with the CLI becoming a client of it rather than an implementation of its
duties.
Db values, so the time model, query engine, and schema view come
for free and an operational job is ordinary peer code with a job wrapper.Authorizer with new
actions and ordinary object names. It concentrates duties, not authority.shred, delete database, and restore-over-an-existing-name need a
fresh plan and an approval from a principal other than the requester.corium_operator, exactly as ReBAC
policy lives in corium_authz — so operational history is backed up,
time-travelable, and queryable with the machinery that already exists. The
registry is a convenience, never a dependency: a job whose progress cannot be
written keeps running.CORIUM_OPERATOR names one, running them in-process when it does not.as-of the job's basis, the same sentence ADR-0014 makes
about policy decisions.curl are equally capable and equally audited.scope
recorded on every job, approval authority checked on the job's target rather
than the service, key and credential configuration keyed by database, a
configurable registry name, and a fleet view that reports scope and
observation time instead of promising deployment-wide truth. Grouping
databases under a tenant needs no new policy language — ADR-0014's rewrites
already express it — but database creation should be able to record its owning
object so the grouping exists from the start.Can you improve this documentation?Edit on GitHub
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |