Pixel-art translation of Philip James de Loutherbourg, Coalbrookdale by Night (1801): the furnaces of Coalbrookdale glow red against the night sky above a dark valley.Pixel-art translation of Philip James de Loutherbourg, Coalbrookdale by Night (1801): the furnaces of Coalbrookdale glow red against the night sky above a dark valley.

Operators

Operators are how Ogun does work. Fourteen are native Rust; most of the rest wrap tools you already trust; the LLM ones are optional. The list below is the catalogue that ogun validate checks against, read from the ogun 0.0.1-alpha binary.

Core operators

Written in Rust and built into ogund, because they are small, called often and relevant to safety.

OperatorOutputsWhat it does
acquireartifactsResumable, segmented download on the embedded Zeus engine; plan vocabulary shared with Zeus
zeus.session_acquireartifactsA source behind your browser login, acquired by zeusd through the session bridge (tested against a fake zeusd)
crawlurls, documentsPagination, link extraction and selectors from a closed, validated set; honours robots.txt and stays on one origin
file.copyartifactsSafe materialization into workspace paths
file.moveartifactsSafe materialization into workspace paths
archive.extractartifactsZip, tar, tar.gz and gzip, with path containment and size limits
hashartifactsBLAKE3 and SHA-256 digests of artifacts
dedupeartifacts, duplicatesExact or keyed deduplication
manifestmanifestA provenance manifest of its inputs
partitionartifactsFan-out over partitions
filterartifacts, rejectedPredicate filter with a rejected output
mapartifactsPer-artifact mapping
join_metadataartifactsMetadata joins
window.rollupartifactsRolls sealed stream windows up, for example minutes into hours

Adapters for external tools

Child processes with declared inputs and outputs; versions are pinned and recorded in the lineage. The tools themselves (DuckDB, pdftotext, Tesseract and so on) must be installed where ogund runs: the release does not bundle them.

OperatorOutputsWhat it does
duckdbtables, artifactsSQL over Parquet, CSV and JSON; writes tables or Parquet
pdf.extracttext, tablesText and tables from PDFs, through pdftotext
ffmpegartifactsMedia conversion
pandocartifactsDocument conversion
tesseracttextOCR for scanned documents
paddleocrtextOCR for scanned documents
yt_dlpartifactsAcquisition from media sites, through yt-dlp
rcloneartifactsAcquisition from cloud storage, through rclone
gitartifactsAcquisition from repositories
hfartifactsAcquisition from Hugging Face

Code operators

Your code or script, referenced by BLAKE3 hash. A new or changed hash is a plan diff that needs a person. They run in a bubblewrap sandbox on Linux; Windows has none yet, so they are refused there unless allow_unsandboxed is set.

OperatorOutputsWhat it does
pythonartifacts, rowsYour code, pinned by BLAKE3 hash, run in a sandboxed process; needs a person’s approval when it is new or changed
polarstablesDataframe code, pinned and approved like python
sqltablesA SQL script, pinned and approved like python
dbtartifacts, resultsA dbt Core project as a node, with run results as artifacts
shellartifactsLast resort; always needs approval

Stream sources

Sensor readings sealed into event-time windows, which are partitions (ADR 0007). Fed by the ingest bridge, unit-tested and not yet run against real brokers or devices.

OperatorOutputsWhat it does
stream.mqttwindowSensor readings from an MQTT broker, sealed into event-time windows
stream.httpwindowSensor readings pushed over HTTP
stream.lorawanwindowUplinks from ChirpStack or The Things Stack
stream.modbuswindowRegisters from Modbus TCP or RTU-over-TCP devices
stream.file_tailwindowLines appended to a file

LLM operators

Bound to schemas and label sets, metered by a spend ledger, gated by budgets and approvals. A workflow without them never touches a model.

OperatorOutputsWhat it does
llm.extractrowsStructured extraction into a JSON Schema
llm.classifylabelsLabels from a closed label set
llm.mapartifactsPer-item transforms with natural-language rules
llm.filterartifacts, rejectedPer-item filters with natural-language rules
llm.renameartifactsNames from content
llm.schemaschemaInfer a schema from samples, for a human to approve
llm.enrichrowsMetadata from content
embedding.generatevectorsVectors for search and deduplication

The operator ABI

Specified in O-03. Every operator ships a manifest; Ogun refuses anything the manifest does not declare.

{
  "name": "tesseract",
  "version": "1.0.0",
  "kind": "adapter",
  "inputs": [
    {
      "name": "inputs"
    }
  ],
  "outputs": [
    {
      "name": "text",
      "media_type": "text/plain"
    }
  ],
  "determinism": "pure",
  "sandbox": {
    "network": "none",
    "fs": [
      "inputs:ro",
      "scratch:rw"
    ],
    "memory_bytes": 4294967296,
    "cpu_ms": 14400000
  },
  "invocation": {
    "protocol": "jsonl-stdio/0",
    "command": [
      "ogun-op-shim",
      "tesseract"
    ]
  },
  "config_schema": {
    "type": "object",
    "properties": {
      "lang": {
        "type": "string",
        "pattern": "^[A-Za-z_]+(\\+[A-Za-z_]+)*$",
        "maxLength": 128
      },
      "psm": {
        "type": "integer",
        "minimum": 0,
        "maximum": 13
      },
      "dpi": {
        "type": "integer",
        "minimum": 72,
        "maximum": 1200
      }
    },
    "additionalProperties": false
  },
  "tools": [
    {
      "any_of": [
        "tesseract"
      ],
      "optional": false
    },
    {
      "any_of": [
        "pdftoppm"
      ],
      "optional": true
    }
  ]
}

The tesseract manifest as compiled into ogund 0.0.1-alpha (crates/ogun-ops/src/builtin.rs). A manifest installed as tesseract.manifest.json replaces it, but may not change its kind or drop an output.

  • Invocation: JSON lines over stdio (jsonl-stdio/0); WASI components are being evaluated
  • Determinism class: pure, seeded or non-deterministic, recorded with the operator
  • Sandbox profile: network, filesystem, CPU and memory, enforced where a sandbox exists. A manifest that asks for a network allowlist is refused, not run with more network than it declares
  • Errors map onto typed codes (op.integrity, op.sandbox_violation and so on), so retries and approvals behave predictably
  • The manifest’s BLAKE3 is recorded in the lineage of every artifact the operator produces
  • Shell exists as a last resort and always needs approval

Read the design

The decisions and first-draft specifications are public, and the runtime is being tested. Feedback is most useful now, before the contracts are frozen.