Skip to content

Substrate Package Requirements

This document defines the expected package shape for substrate implementations.

Every concrete substrate package must provide:

  1. A launch function with signature:
def launch(domain: SubstrateDomain) -> Substrate
  1. One concrete runtime type compatible with Substrate contracts.
  2. One or more synthesizers capable of producing the modulators required by that runtime.
  3. A Neuromodulators boundary that fans out modulation requests to synthesizers and stores produced artifacts.
  4. A package-level orchestration path that lets RAS request modulators through Neuromodulators and inject the resulting cocktail into the runtime.
  1. Build identity once and propagate it through the runtime and cocktail unchanged.
  2. Keep launcher and adapter free of substrate-specific modulation logic.
  3. Keep launch wrapper thin and deterministic.
  4. Let Neuromodulators fan out requests and let synthesizers self-select what they can satisfy.
Section titled “Recommended layer order for a CliSensoryCortex-style runtime”
  1. BaseLamina
  2. AgenticLamina
  3. CortexLamina
  4. SensoryMotorCortexLamina
  5. SensoryCortexLamina

These laminae define inheritance structure. They do not imply a generic synthesizer chain.

Runtime object returned by launch must:

  1. expose definition_id and instance_id
  2. provide handle() returning SubstrateHandle
  3. support health(), readiness(), and shutdown()

When a layer injects cross-cutting behavior (for example agent/context/gain signals), use the term Modulator for that dependency.

Normative guidance:

  1. Prefer Modulator over Artifact for injected behavioral dependencies.
  2. Treat Modulators as additive behavior, not substrate identity.
  3. Keep Modulator production and injection explicit in synthesizer and layer contracts.
  4. Cover Modulator effects with tests at layer boundaries.
flowchart TD
    L[launch(domain)] --> R[RAS]
    R --> M[Neuromodulators]
    M --> Q[Fanout ModulatorRequest]
    Q --> N1[Cortex synthesizer]
    Q --> N2[Comms synthesizer]
    Q --> N3[Other synthesizer]
    N1 --> M
    N2 --> M
    N3 --> M
    M --> C[ModulatorCocktail]
    C --> S[Substrate Runtime]

Adapters may:

  1. import modules
  2. resolve symbols
  3. invoke callables

Adapters must not:

  1. mutate or reinterpret lamina or modulation semantics
  2. compose runtime layers directly