%%%------------------------------------------------------------------- %% @doc Sovereign Event Bus (SEB) Supervision Tree Root %% %% Per SEB_SOVEREIGN_EVENT_BUS_MASTER_SPECIFICATION.xml L2 layer: %% - Root supervisor for entire SEB runtime %% - Spawns kernel_nif worker (Ada kernel interface) %% - Spawns policy_engine (seb_datalog) worker %% - Spawns partition_manager worker %% - Spawns agent_sup supervisor (agent lifecycle) %% %% L0 Invariants Enforced: %% 1. Plasma Gate: Ed25519 signature valid (kernel_nif) %% 2. Hash Chain: Prev_Hash == current tip hash (kernel_nif) %% 3. Offset Monotonic: Event offset > prior offset (kernel_nif) %% 4. Payload Hash: blake3(header || payload) matches footer (kernel_nif) %% 5. Segment Chain: Prev_Seg_Hash links to prior segment (kernel_nif) %% %% @end %%%------------------------------------------------------------------- -module(seb_sup). -behaviour(supervisor). -export([start_link/0]). -export([init/1]). %% Internal exports for testing -export([get_child_pid/1]). -define(SERVER, ?MODULE). -define(CHILD_TIMEOUT, 30000). -define(STARTUP_TIMEOUT, 60000). %%%=================================================================== %%% API %%%=================================================================== %% @doc Start the supervision tree -spec start_link() -> supervisor:startlink_ret(). start_link() -> supervisor:start_link({local, ?SERVER}, ?MODULE, []). %% @doc Get child process PID by name -spec get_child_pid(atom()) -> pid() | {error, not_found}. get_child_pid(ChildName) -> case supervisor:get_children(?SERVER) of Children -> case lists:keyfind(ChildName, 1, Children) of {ChildName, Pid, _Type, _Modules} -> Pid; false -> {error, not_found} end; Error -> {error, Error} end. %%%=================================================================== %%% Supervisor Callbacks %%%=================================================================== %% @doc Initialize the supervision tree %% %% Starts the following workers/supervisors: %% 1. seb_kernel_nif - Ada kernel interface (worker) %% 2. seb_datalog_bridge - Policy engine (worker) %% 3. seb_partition_mgr - Partition assignment (worker) %% 4. seb_agent_sup - Agent lifecycle supervisor (supervisor) %% %% All children are permanent with escalation strategy one_for_all. %% This ensures if any critical component fails, entire SEB restarts. %% -spec init([]) -> {ok, {supervisor:sup_flags(), [supervisor:child_spec()]}}. init([]) -> SupFlags = #{ strategy => one_for_all, intensity => 3, period => 30 }, ChildSpecs = [ %% L0 Kernel NIF - Ada binding (worker) #{ id => seb_kernel_nif, start => {seb_kernel_nif, start_link, []}, restart => permanent, shutdown => ?CHILD_TIMEOUT, type => worker, modules => [seb_kernel_nif] }, %% Policy Engine - Datalog + Souffle (worker) #{ id => seb_datalog_bridge, start => {seb_datalog_bridge, start_link, []}, restart => permanent, shutdown => ?CHILD_TIMEOUT, type => worker, modules => [seb_datalog_bridge] }, %% Partition Manager - Deterministic routing (worker) #{ id => seb_partition_mgr, start => {seb_partition_mgr, start_link, [1024]}, restart => permanent, shutdown => ?CHILD_TIMEOUT, type => worker, modules => [seb_partition_mgr] }, %% Agent Lifecycle Supervisor (supervisor) #{ id => seb_agent_sup, start => {seb_agent_sup, start_link, []}, restart => permanent, shutdown => ?STARTUP_TIMEOUT, type => supervisor, modules => [seb_agent_sup] } ], {ok, {SupFlags, ChildSpecs}}. %%%=================================================================== %%% Internal Functions %%%=================================================================== %% Trace startup for debugging trace_startup(Stage) -> io:format("SEB[~s] ~s~n", [Stage, calendar:local_time()]).