Skip to main content
Ingest sits between unstructured input (bytes, CSV uploads) and typed subledger rows. Runbooks use ntro.ingest for shared outcome contracts and tenant Postgres writes into the ingest schema — see also Subledgers for ledgers.* and Workflows overview for orchestration.

Package layout

IngestOutcome is re-exported from ntro.workflow next to NtroWorkflow so workflow code can depend on a single import surface.

User feedback from workflows

NtroWorkflow.set_user_feedback(kind=..., payload=...) attaches a workflow-agnostic envelope to the current pending action:
  • Top-level feedback on the pending action
  • display_hint.config.feedback for Tenant UI components (e.g. FILE_UPLOAD reads kind: "ingest" and shows counts / message)
While a signal gate is open (e.g. waiting for more accepted rows), await_signal_with_action merges the latest stored feedback into the merged action so operators keep seeing progress.

Example: attach ingest feedback

Data lifecycle (reference)

  1. Unstructured — raw files / bytes (ingest.submitted_documents).
  2. Loosely structured — ntro.ingest outcomes + ingest.submitted_records / events.
  3. Structured + typed — ntro.subledger / ledgers.*.
  4. External GL shape — ntro.capabilities.gl posting contracts when applicable.

Workflows overview

NtroWorkflow, @runbook.step, and pending-action wiring.

Subledgers

Domain rows after ingest.