1 import Base 2 import ./system.bend as Sys 3 import ./schedule.bend as Sch 4 import ./schedule_provision.bend as SP 5 import ./world.bend as W 6 import ./relation_commands.bend as A 7 import ./ordinary_schema.bend as Schema 8 import ./ordinary_app_relation.bend as Relation 9 import ./ordinary_app_recipe.bend as Tree 10 import ./ordinary_app_composer.bend as Build 11 import ./ordinary_app_schema.bend as App 12 import ./ordinary_app_schedule.bend as Scheduled 13 import ./ordinary_app_observation_data.bend as DTO 14 import ./ordinary_app_registration_fields.bend as Fields 15 import ./relation_failure_reader.bend as Ord 16 import ./ordinary_app_relation_system.bend as Registered 17 18 # Advanced schema wrapper adapting storage/event types to the relation graph 19 # World without changing entries. Raw schema/projection coherence is trusted setup. 20 def graph_schema(~S:Data,~C:Type,~R:Type,schema:Schema.Schema) -> Schema.Schema,R>: 21 match schema: 22 case Schema.Schema{entries}:Schema.Schema{entries} 23 # Single-schedule relation App retaining actual graph World and relation registry. 24 # Observation derives from the same operational relation declaration. 25 def Application(~S:Data,~C:Type,~R:Type,~E:Data,~declaration:Ord.Declaration,~target:W.Handle) -> Type: 26 Scheduled.Application,R,A.Notice,Registered.Owner(~S,~C,~R,~E,~declaration,~target),Relation.View,Relation.observe(~S,~C,~R,~E,~declaration,~Relation.builtin_row(~S)),Registered.empty_fold(~S,~C,~R,~E,~declaration,~target)> 27 # Advanced relation-view observation recipe; it owns no second graph or registry. 28 def Recipe(~S:Data,~C:Type,~R:Type,~E:Data,~declaration:Ord.Declaration,~target:W.Handle) -> Type: 29 Tree.Recipe,Relation.observe(~S,~C,~R,~E,~declaration,~Relation.builtin_row(~S))> 30 def selected_phase(allowed:Bool,current:String,later:Unit -> String) -> String: 31 match allowed: 32 case True{}:current 33 case False{}:later(Unit{}) 34 def phase_for(steps:List<&2,Sch.Step>,+id:U32,+current:String) -> String: 35 match steps: 36 case []:"" 37 case Sch.Phase{name} <> rest:phase_for(rest,id,name) 38 case Sch.Barrier{} <> rest:phase_for(rest,id,current) 39 case Sch.System{candidate,_} <> rest: 40 selected_phase(U32.is_eq(candidate,id),current,unused=>phase_for(rest,id,current)) 41 def described(~S:Data,~C:Type,~R:Type,~E:Data,~declaration:Ord.Declaration,~target:W.Handle,plan:SP.Plan,namespace:U32,name:String,steps:List<&2,Sch.Step>,needs:List<&2,SP.Requirement>,schema:Schema.Schema,R>,world:Relation.World(~S,~C,~R,~E),recipe:Recipe(~S,~C,~R,~E,~declaration,~target),debug:Bool,description:Scheduled.Description>,result:Registered.Owner(~S,~C,~R,~E,~declaration,~target) & DTO.Binding) -> Application(~S,~C,~R,~E,~declaration,~target) & Maybe<&2,Scheduled.Description>>: 42 match description: 43 case Scheduled.Description{App.Description{schemaEntries,DTO.Product{_,observation}},ns,label,planned}: 44 match result: 45 case (owners,binding):(Scheduled.Application{App.Application{schema,Build.Registered{world,owners,recipe,debug}},plan,namespace,name,steps,needs},Some{Scheduled.Description{App.Description{schemaEntries,DTO.Product{[binding],observation}},ns,label,planned}}) 46 def snapshot_result(~S:Data,~C:Type,~R:Type,~E:Data,~declaration:Ord.Declaration,~target:W.Handle,result:Application(~S,~C,~R,~E,~declaration,~target) & Maybe<&2,Scheduled.Description>>) -> Application(~S,~C,~R,~E,~declaration,~target) & Maybe<&2,Scheduled.Description>>: 47 match result: 48 case (app,None{}):(app,None{}) 49 case (Scheduled.Application{App.Application{schema,Build.Registered{world,Sys.Registry{+ns,+id,+label,+access,+cursor},recipe,debug}},plan,namespace,name,+steps,needs},Some{description}):described(~S,~C,~R,~E,~declaration,~target,plan,namespace,name,steps,needs,schema,world,recipe,debug,description,Registered.binding(~S,~C,~R,~E,~declaration,~target,Sys.Registry{ns,id,label,access,cursor},phase_for(steps,id,""))) 50 # Set debug flag then derive the existing scheduled snapshot and declaration-bound 51 # relation binding/phase label. Disabled bypasses observation; missing phase lookup 52 # yields an empty label, not invented execution evidence. No graph commands apply. 53 def snapshot(~S:Data,~C:Type,~R:Type,~E:Data,~declaration:Ord.Declaration,~target:W.Handle,app:Application(~S,~C,~R,~E,~declaration,~target),flag:Bool) -> Application(~S,~C,~R,~E,~declaration,~target) & Maybe<&2,Scheduled.Description>>: 54 snapshot_result(~S,~C,~R,~E,~declaration,~target,Scheduled.snapshot(~S,~A.Store,~R,~A.Notice,~Registered.Owner(~S,~C,~R,~E,~declaration,~target),~Relation.View,~Relation.observe(~S,~C,~R,~E,~declaration,~Relation.builtin_row(~S)),~Registered.empty_fold(~S,~C,~R,~E,~declaration,~target),Scheduled.enabled(~S,~A.Store,~R,~A.Notice,~Registered.Owner(~S,~C,~R,~E,~declaration,~target),~Relation.View,~Relation.observe(~S,~C,~R,~E,~declaration,~Relation.builtin_row(~S)),~Registered.empty_fold(~S,~C,~R,~E,~declaration,~target),app,flag))) 55 # Register the declaration-bound relation system on the supplied graph World. 56 # Return its actual registry/World registration result; does not attach/run a plan. 57 def install(~S:Data,~C:Type,~R:Type,~E:Data,~declaration:Ord.Declaration,~target:W.Handle,schema:Schema.Schema,world:Relation.World(~S,~C,~R,~E),name:String) -> Sys.RegistrationResult,R,A.Notice,Unit,Unit,Unit,Registered.reader(~S,~C,~R,~E,~declaration,~target)>: 58 Registered.register(~S,~C,~R,~E,~declaration,~target,world,name) 59 def attach_allowed(~S:Data,~C:Type,~R:Type,~E:Data,~declaration:Ord.Declaration,~target:W.Handle,schema:Schema.Schema,owner:Registered.Owner(~S,~C,~R,~E,~declaration,~target),name:String,plan:SP.Plan,result:Relation.World(~S,~C,~R,~E) & Bool) -> Scheduled.Attachment,R,A.Notice,Registered.Owner(~S,~C,~R,~E,~declaration,~target),Relation.View,Relation.observe(~S,~C,~R,~E,~declaration,~Relation.builtin_row(~S)),Registered.empty_fold(~S,~C,~R,~E,~declaration,~target)>,Application(~S,~C,~R,~E,~declaration,~target)>: 60 match result: 61 case (world,allowed): 62 match allowed: 63 case False{}:Scheduled.Invalid{App.Application{graph_schema(~S,~C,~R,schema),Build.Registered{world,owner,Tree.Recipe{},False{}}}} 64 case True{}:Scheduled.attach(~S,~A.Store,~R,~A.Notice,~Registered.Owner(~S,~C,~R,~E,~declaration,~target),~Relation.View,~Relation.observe(~S,~C,~R,~E,~declaration,~Relation.builtin_row(~S)),~Registered.empty_fold(~S,~C,~R,~E,~declaration,~target),App.Application{graph_schema(~S,~C,~R,schema),Build.Registered{world,owner,Tree.Recipe{},False{}}},name,plan) 65 def attach_namespace_checked(~S:Data,~C:Type,~R:Type,~E:Data,~declaration:Ord.Declaration,~target:W.Handle,schema:Schema.Schema,name:String,plan:SP.Plan,allowed:Bool,owner:Registered.Owner(~S,~C,~R,~E,~declaration,~target),world:Relation.World(~S,~C,~R,~E)) -> Scheduled.Attachment,R,A.Notice,Registered.Owner(~S,~C,~R,~E,~declaration,~target),Relation.View,Relation.observe(~S,~C,~R,~E,~declaration,~Relation.builtin_row(~S)),Registered.empty_fold(~S,~C,~R,~E,~declaration,~target)>,Application(~S,~C,~R,~E,~declaration,~target)>: 66 match allowed owner: 67 case False{} owner:Scheduled.Invalid{App.Application{graph_schema(~S,~C,~R,schema),Build.Registered{world,owner,Tree.Recipe{},False{}}}} 68 case True{} Sys.Registry{+namespace,+id,+label,+access,+cursor}:attach_allowed(~S,~C,~R,~E,~declaration,~target,schema,Sys.Registry{namespace,id,label,access,cursor},name,plan,W.registration_matches(~S,~A.Store,~R,~A.Notice,world,id,label,access)) 69 def attach_namespace(~S:Data,~C:Type,~R:Type,~E:Data,~declaration:Ord.Declaration,~target:W.Handle,schema:Schema.Schema,name:String,plan:SP.Plan,owner:Registered.Owner(~S,~C,~R,~E,~declaration,~target),result:Relation.World(~S,~C,~R,~E) & U32) -> Scheduled.Attachment,R,A.Notice,Registered.Owner(~S,~C,~R,~E,~declaration,~target),Relation.View,Relation.observe(~S,~C,~R,~E,~declaration,~Relation.builtin_row(~S)),Registered.empty_fold(~S,~C,~R,~E,~declaration,~target)>,Application(~S,~C,~R,~E,~declaration,~target)>: 70 match owner: 71 case Sys.Registry{+namespace,id,label,access,cursor}: 72 match result: 73 case (world,actual):attach_namespace_checked(~S,~C,~R,~E,~declaration,~target,schema,name,plan,U32.is_eq(namespace,actual),Sys.Registry{namespace,id,label,access,cursor},world) 74 # Validate registry namespace and exact retained registration metadata before 75 # attaching the supplied plan. Refusal returns the schema App with actual World 76 # and owner; no system is executed. Plan/condition/provision coherence remains 77 # ordinary trusted setup rather than authority inferred from a phase name. 78 def attach(~S:Data,~C:Type,~R:Type,~E:Data,~declaration:Ord.Declaration,~target:W.Handle,schema:Schema.Schema,owner:Registered.Owner(~S,~C,~R,~E,~declaration,~target),world:Relation.World(~S,~C,~R,~E),name:String,plan:SP.Plan) -> Scheduled.Attachment,R,A.Notice,Registered.Owner(~S,~C,~R,~E,~declaration,~target),Relation.View,Relation.observe(~S,~C,~R,~E,~declaration,~Relation.builtin_row(~S)),Registered.empty_fold(~S,~C,~R,~E,~declaration,~target)>,Application(~S,~C,~R,~E,~declaration,~target)>: 79 attach_namespace(~S,~C,~R,~E,~declaration,~target,schema,name,plan,owner,W.namespace(~S,~A.Store,~R,~A.Notice,world)) 80 # Run the attached relation schedule through its registered dispatcher and supplied 81 # condition/provision adapters, retaining App in every result. Pending graph work 82 # applies at explicit barriers; queue admission and structural application differ. 83 def run(~S:Data,~C:Type,~R:Type,~E:Data,~declaration:Ord.Declaration,~target:W.Handle,~condition:Relation.World(~S,~C,~R,~E) -> U32 -> Relation.World(~S,~C,~R,~E) & Bool,~provision:Relation.World(~S,~C,~R,~E) -> Relation.World(~S,~C,~R,~E) & List<&2,SP.Requirement>,app:Application(~S,~C,~R,~E,~declaration,~target)) -> Scheduled.RunResult>: 84 Scheduled.run(~S,~A.Store,~R,~A.Notice,~Registered.Owner(~S,~C,~R,~E,~declaration,~target),~Relation.View,~Relation.observe(~S,~C,~R,~E,~declaration,~Relation.builtin_row(~S)),~Registered.empty_fold(~S,~C,~R,~E,~declaration,~target),~Maybe<&2,Unit>,~Registered.dispatch(~S,~C,~R,~E,~declaration,~target),~condition,~provision,app)