Skip to main content
Causal graphs in Nora are per-folder: attach a graph to a document folder, extract causal triples from those documents into a staged area, then approve them to live. The causal CLI is the surface for the staged/live workflow. Graphs bootstrap from documents; you approve the good triples; only the approved (live) ones are used for verification and reasoning.

Commands

Folder identifiers are the document folder tag (e.g. billing, product-docs).

causal get

Prints the whole graph:
  • live_nodes and live_edges — used in verification and reasoning.
  • staged_nodes and staged_edges — waiting for review.
Add --json for structured output. Common quick check:

causal settings show / set

Shows settings + stage counts.
Only flags passed change.
  • --connection <kind:id> — link the graph to a specific data source (e.g. documents_folder:billing).
  • --retrieval-preset <preset-id> — the preset extraction uses to pull context.
  • --dedup-policy <policy> — how duplicates are handled (merge, keep_newer, keep_older, keep_all).
  • --auto-restage true|false — automatically re-bootstrap when the linked source changes.

causal bootstrap

Extracts causal triples from every document in the folder into STAGED. Nothing goes to LIVE until you approve.
  • --model <m> — model used for extraction. Defaults to workspace default.
Bootstrap is idempotent — re-running on an already-populated folder doesn’t lose LIVE data. Re-extraction produces new STAGED rows; existing LIVE stays as-is. For a fresh folder: bootstrap → review the STAGED area in the app → approve the good ones. For an existing folder: refresh is usually what you want.

causal refresh

Recomputes only the deltas — new documents added, existing documents changed since the last bootstrap. Cheaper than a full bootstrap. Refresh output lands in STAGED. Existing LIVE stays intact. Run on a schedule (or triggered by document changes) if --auto-restage isn’t your fit.

causal approve / reject

  • --ids <id,…> — the specific staged row IDs. Omit to act on all STAGED.
After approve:
  • The rows move to LIVE.
  • Verification starts using them immediately.
  • STAGED still contains anything not touched by this command.
reject drops the rows without promoting. They can be re-created by the next bootstrap or refresh.

Recipes

Bootstrap a folder end-to-end from CLI

CI: fail if STAGED is too large

Prevents unbounded backlog:

Selective approve after human review

Suppose your review workflow marks approvals in an external system with the row IDs. Bulk-approve them:

Snapshot the LIVE graph for audit

The STAGED / LIVE model

The two-stage model exists because causal extraction is best-effort — the model proposes, you dispose. Direct edits to LIVE aren’t allowed from the CLI (use the app’s graph canvas for those). But bulk approval/rejection is what the CLI is for. If you want to hand-edit a live graph — add a specific edge, remove a wrong node — do it in the app. The CLI’s role is bulk bootstrap/refresh/approve.