Namespaces are soft tenancy inside one Continuum instance and one repo. They are row metadata on continuum_runs, not a separate process tree.

{:ok, run_id} =
  Continuum.start(MyApp.OrderFlow, input,
    namespace: "tenant-a",
    attributes: %{region: "eu"}
  )

Continuum.query/1 and Continuum.Observer.list_runs/1 default to the "default" namespace. Pass namespace: "tenant-a" to list or search another namespace.

Run-id keyed operations remain global because run ids are UUIDs:

Continuum.await(run_id)
Continuum.signal(run_id, :approved, %{})
Continuum.cancel(run_id)
Continuum.get_run(run_id)

The host application owns authorization. If a user should only see one namespace, enforce that in your router pipeline or service layer before calling Continuum query helpers. For hard isolation, use separate Continuum instances and repos; namespaces are a softer filter inside one instance.