Nexus, Sigils, and Weaves

Integrator overview of how Nexus hosts runtime surfaces, Sigils expose variables, and Weaves execute control or simulation loops.

This page is the integrator map for Aether. It explains startup order and how runtime surfaces line up, then points to dedicated references for each concept.

Warning

Registration depends on import-time setup. Follow these rules or routes, MCP tools, and OPC UA nodes can be missing or duplicated.

  1. Nexus first - Construct Nexus before any Sigil or Weave.
  2. Sigils before Weaves - Declare every Sigil at module scope, before nexus.start().
  3. Weaves at module scope - Declare every Weave at module scope so startup sees and schedules them.

Concept pages

Mental model

PieceRole
NexusOne process-wide singleton runtime (embedded OPC UA, HTTP, MCP, lifecycle, tracing, cert handling).
SigilOne OPC UA variable abstraction with generated REST and MCP read/write surfaces.
WeaveA periodic callback loop used for physics, synchronization, or control logic.

Startup sequence

  1. Construct Nexus with opc_ua_url and your license token (token= or VEILNET_AETHER_TOKEN).
  2. Instantiate all Sigils (embedded and/or external OPC UA-backed).
  3. Instantiate all Weaves with their cycle times and callbacks.
  4. Call nexus.start() to launch HTTP (/health, /docs, /nexus/mcp) and OPC UA.

Minimal shape

from aether.nexus import Nexus
from aether.sigil import Sigil
from aether.weave import Weave

nexus = Nexus(opc_ua_url="opc.tcp://localhost:4840")

setpoint = Sigil(
    node_id="ns=2;s=Twin.Setpoint",
    initial_value=50.0,
)

temperature = Sigil(
    node_id="ns=2;s=Twin.Temperature",
    initial_value=20.0,
    writable=False,
)


async def step():
    sp = float(await setpoint.read())
    t = float(await temperature.read())
    t += (sp - t) * 0.02
    await temperature.write(t)


Weave(
    label="physics",
    cycle_time=0.1,
    callback=step,
)

if __name__ == "__main__":
    nexus.start()

Next steps