Usage¶
The CLI surface is four verbs — stage, compose, run, trace —
plus a handful of helpers. Every command emits ACLI-
shaped JSON ({ ok: bool, command, result | error, meta }) so downstream
agents can parse results without brittle stdout scraping.
Browse the stdlib¶
noether stage list # all 85 stages
noether stage list --tag text # filter by tag
noether stage get <id-or-prefix> # 8-char prefix is enough for stdlib
noether stage search "parse CSV" # semantic search (three-index fusion)
stage search runs a hash-based mock embedding locally. Point at a
real embedding provider (Mistral, OpenAI, Vertex) via env vars to get
better-quality results — see Install → LLM providers.
Compose a graph from a problem description¶
# Uses the first LLM provider configured in your env.
noether compose "parse CSV data and count the rows"
# Don't execute — just show the graph the agent produced.
noether compose --dry-run "extract email domains from a list of addresses"
# Bypass the composition cache to force a fresh LLM call.
noether compose --force "…"
# See the full reasoning — search candidates, LLM prompt, each attempt.
noether compose --verbose "…"
Without an LLM key, compose runs against the mock provider and
produces placeholder graphs — fine for smoke tests, not for real use.
Run a graph¶
noether run graph.json # execute end-to-end
noether run --dry-run graph.json # type-check + plan only
noether run --input '{"x": 1}' graph.json # pass runtime input
Policy flags:
# Block stages that declare effect kinds you didn't allow.
noether run --allow-effects pure,fallible graph.json
# Block stages that need capabilities you didn't grant.
noether run --allow-capabilities network,fs-read graph.json
# Reject graphs whose estimated cost exceeds N cents.
noether run --budget-cents 50 graph.json
# Isolation knobs (non-Rust stages only).
noether run --isolate=auto graph.json # bwrap if present, warn-fallback otherwise
noether run --isolate=bwrap graph.json # require bwrap; hard error if missing
noether run --isolate=none graph.json # disable sandbox (warns)
noether run --require-isolation graph.json # make `auto`'s fallback a hard error (CI)
Refinement-predicate enforcement runs automatically when the graph
uses refined types (merged on main; ships in the next tag). Disable
with NOETHER_NO_REFINEMENT_CHECK=1 only for debugging.
Replay a past run¶
Every run writes a CompositionTrace to the local trace store:
noether run graph.json
# → { "ok": true, "result": { "composition_id": "abc123…", "output": … } }
noether trace abc123
# → full trace: per-stage inputs, outputs, timing, any errors
The composition_id is the SHA-256 of the pre-resolution canonical
graph — so the same source graph produces the same id on every run,
regardless of which concrete implementation each signature-pinned node
resolved to. That's what makes replay useful across implementation
rotations.
Remote registry¶
Point at a noether-cloud registry to pull stages over HTTP:
export NOETHER_REGISTRY=https://registry.alpibru.com
noether stage list # now queries the remote
noether stage search "…" # semantic search over the remote index
Every stage / store command honours NOETHER_REGISTRY. noether run
and noether compose snapshot what the remote reports and execute
locally — there's no "remote execution" mode in the CLI.
Build a graph into a binary¶
noether build graph.json # native binary at ./noether-app
noether build graph.json --target browser # HTML + WASM bundle
noether build graph.json --serve :8080 # native build + serve as HTTP API
The built binary accepts runtime input on stdin and prints ACLI JSON on
stdout — same contract as noether run. The browser target produces a
self-contained HTML page that runs the pure subset of the graph in the
user's tab.
Introspect¶
For agents wiring this up programmatically:
noether introspect # full command tree as JSON (ACLI standard)
noether agent-docs # list of intent-keyed agent playbooks
noether agent-docs compose-a-graph # a specific playbook
noether agent-docs --search sandbox # search playbooks by keyword
The scheduler¶
The noether-scheduler binary runs a cron of Lagrange graphs and fires
webhooks with the result. Configure via scheduler.json:
{
"store_path": ".noether/registry.json",
"jobs": [
{
"name": "hourly-health-check",
"cron": "0 * * * *",
"graph": "graphs/health-check.json",
"webhook": "https://hooks.example.com/noether-health"
}
]
}
Stateless per run — the graph's composition id + trace go to the webhook; restart-safety is your responsibility.