ordinary_owned_event_family_reader.bend
bendvy-ecs-core@0.1.0.1 · 105 lines · 0 definitions
1import Base
2import bendvy-ecs-core@0.1.0.1/ordinary_app_event_family_runtime.bend as App
3import bendvy-ecs-core@0.1.0.1/ordinary_app_observation_data.bend as DTO
4import bendvy-ecs-core@0.1.0.1/ordinary_app_registration_fields.bend as Records
5import bendvy-ecs-core@0.1.0.1/ordinary_app_event_family_reader.bend as AppReader
6import bendvy-ecs-core@0.1.0.1/ordinary_event_declaration.bend as Event
7import bendvy-ecs-core@0.1.0.1/execution_context.bend as Ctx
8import bendvy-ecs-core@0.1.0.1/trace_facts.bend as Facts
9import bendvy-ecs-core@0.1.0.1/owned_event_family_maintenance.bend as Maintenance
10import bendvy-ecs-core@0.1.0.1/owned_event_family_catalog.bend as Catalog
11import bendvy-ecs-core@0.1.0.1/owned_event_family_lifecycle.bend as Life
12import bendvy-ecs-core@0.1.0.1/world.bend as W
13import bendvy-ecs-core@0.1.0.1/system.bend as Sys
14import bendvy-ecs-core@0.1.0.1/transaction.bend as T
15import bendvy-ecs-core@0.1.0.1/capabilities.bend as Cap
16import bendvy-ecs-core@0.1.0.1/owner_product.bend as Product
17import bendvy-ecs-core@0.1.0.1/owned_event_log.bend as Log
18import bendvy-ecs-core@0.1.0.1/ordinary_owned_event.bend as Pub
19import bendvy-ecs-core@0.1.0.1/ordinary_owned_event_family_reader_binding.bend as Setup
20import bendvy-ecs-core@0.1.0.1/owned_event_family_reader_runtime.bend as Core
21import bendvy-ecs-core@0.1.0.1/event_runtime.bend as Ev
22import bendvy-ecs-core@0.1.0.1/event_stream.bend as Stream
23import bendvy-ecs-core@0.1.0.1/event_family_runtime.bend as FR
24import bendvy-ecs-core@0.1.0.1/event_family_routing.bend as Route
25# Public setup carries the coupled log route and operational stream selection.
26# All callbacks below are erased indices derived by its canonical constructors.
27# Initialize the selected family runtime from its coupled owned-log/stream setup,
28# retaining actual World and supplied family owners. Stream entries are Nat keys;
29# affine payload P remains in the resource log. Raw routes/lenses are trusted setup.
30def setup(~S:Data,~C:Type,~R:Type,~P:Type,~Rest:Type,~E:Data,~Domains:Data,~F:Type,~path:Product.Lens<R,Log.Log<P>,Rest>,~inject:Nat -> E,~select:List<&2,E> -> List<&2,Nat>,~identity:Pub.Domain<S,P>,~make:Domains -> Nat -> F,~sync:F -> Nat -> List<&2,E> -> F,~frame:F -> Nat -> F,~retain:F -> Nat -> List<&2,E> -> F & List<&2,E>,~inventory:F -> F & List<&2,String>,~take:F -> F & Stream.Stream<S,Nat>,~put:F -> Stream.Stream<S,Nat> -> F,~Owners:Type,descriptor:Setup.Setup<S,R,P,Rest,E,Domains,F,path,inject,select,identity,make,sync,frame,retain,inventory,take,put>,world:W.World<S,C,R,E>,owners:Owners,capacity:Nat) -> Route.Runtime<S,C,R,E,FR.State<E,F,Owners>>:
31 match descriptor:
32 case Setup.Setup{_,provision,_}:FR.setup(~S,~C,~R,~E,~Domains,~F,~Owners,~make,~sync,~frame,~retain,~inventory,world,provision,owners,capacity)
33# Register a confined payload reader without executing the body. at consumes and
34# returns actual P with detached Projection; the body receives only that scoped
35# request and threads actual Args. Failure returns the runtime rather than losing
36# its owned family state; registry/reader admission remain the routing layer's job.
37def register(~S:Data,~C:Type,~R:Type,~P:Type,~Rest:Type,~E:Data,~Domains:Data,~F:Type,~path:Product.Lens<R,Log.Log<P>,Rest>,~inject:Nat -> E,~select:List<&2,E> -> List<&2,Nat>,~identity:Pub.Domain<S,P>,~make:Domains -> Nat -> F,~sync:F -> Nat -> List<&2,E> -> F,~frame:F -> Nat -> F,~retain:F -> Nat -> List<&2,E> -> F & List<&2,E>,~inventory:F -> F & List<&2,String>,~take:F -> F & Stream.Stream<S,Nat>,~put:F -> Stream.Stream<S,Nat> -> F,~descriptor:Setup.Setup<S,R,P,Rest,E,Domains,F,path,inject,select,identity,make,sync,frame,retain,inventory,take,put>,~Owners:Type,~Request:Type,~Projection:Data,~Args:Type,~Error:Data,~at:P -> Request -> P & Projection,~body:@-H:Type -> @-read:Cap.Request<H,Request,Projection> -> H -> Args -> H & (T.Outcome<Error> & Args),runtime:Route.Runtime<S,C,R,E,FR.State<E,F,Owners>>,name:String) -> Route.Registration<S,C,R,E,Nat,FR.State<E,F,Owners>,Args,Unit,Core.Reply<Error,Args>,FR.take(~S,~Nat,~E,~F,~Owners,~take),FR.put(~S,~Nat,~E,~F,~Owners,~put),Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Error,~at,~body)>:
38 Core.register(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Error,~at,~body,~FR.State<E,F,Owners>,~FR.take(~S,~Nat,~E,~F,~Owners,~take),~FR.put(~S,~Nat,~E,~F,~Owners,~put),runtime,name)
39# Read unread selected keys in stream order, resolving each against the owned log.
40# Return runtime, reader and registry through the routing result. Inspect Reply
41# outcome as well as transport status: semantic body/missing-payload failure retains
42# Args, stops the fold and preserves unread position under failed-reader activation
43# rules. lagged reports bounded retention loss. Projection/request providers remain
44# trusted; they do not grant moving P out of the log or universal mutation rollback.
45def run(~S:Data,~C:Type,~R:Type,~P:Type,~Rest:Type,~E:Data,~Domains:Data,~F:Type,~path:Product.Lens<R,Log.Log<P>,Rest>,~inject:Nat -> E,~select:List<&2,E> -> List<&2,Nat>,~identity:Pub.Domain<S,P>,~make:Domains -> Nat -> F,~sync:F -> Nat -> List<&2,E> -> F,~frame:F -> Nat -> F,~retain:F -> Nat -> List<&2,E> -> F & List<&2,E>,~inventory:F -> F & List<&2,String>,~take:F -> F & Stream.Stream<S,Nat>,~put:F -> Stream.Stream<S,Nat> -> F,~descriptor:Setup.Setup<S,R,P,Rest,E,Domains,F,path,inject,select,identity,make,sync,frame,retain,inventory,take,put>,~Owners:Type,~Request:Type,~Projection:Data,~Args:Type,~Error:Data,~at:P -> Request -> P & Projection,~body:@-H:Type -> @-read:Cap.Request<H,Request,Projection> -> H -> Args -> H & (T.Outcome<Error> & Args),runtime:Route.Runtime<S,C,R,E,FR.State<E,F,Owners>>,reader:Route.Reader<S,Nat,FR.State<E,F,Owners>,FR.take(~S,~Nat,~E,~F,~Owners,~take),FR.put(~S,~Nat,~E,~F,~Owners,~put)>,registry:Sys.Registry<S,C,R,E,Ev.Input<Nat,Args>,Unit,Core.Reply<Error,Args>,Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Error,~at,~body)>,args:Args) -> Route.RunResult<S,C,R,E,Nat,FR.State<E,F,Owners>,Args,Unit,Core.Reply<Error,Args>,FR.take(~S,~Nat,~E,~F,~Owners,~take),FR.put(~S,~Nat,~E,~F,~Owners,~put),Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Error,~at,~body)>:
46 Core.run(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Error,~at,~body,~FR.State<E,F,Owners>,~FR.take(~S,~Nat,~E,~F,~Owners,~take),~FR.put(~S,~Nat,~E,~F,~Owners,~put),~FR.synchronize(~S,~C,~R,~E,~F,~Owners,~sync),runtime,reader,registry,args)
47# Trace-aware run returning fact state separately. Semantic acceptance, rather
48# than transport success alone, decides reader advancement; inspect Reply.outcome.
49# Tracing does not expand the scoped payload request or own a copied payload log.
50def run_traced(~S:Data,~C:Type,~R:Type,~P:Type,~Rest:Type,~E:Data,~Domains:Data,~F:Type,~path:Product.Lens<R,Log.Log<P>,Rest>,~inject:Nat -> E,~select:List<&2,E> -> List<&2,Nat>,~identity:Pub.Domain<S,P>,~make:Domains -> Nat -> F,~sync:F -> Nat -> List<&2,E> -> F,~frame:F -> Nat -> F,~retain:F -> Nat -> List<&2,E> -> F & List<&2,E>,~inventory:F -> F & List<&2,String>,~take:F -> F & Stream.Stream<S,Nat>,~put:F -> Stream.Stream<S,Nat> -> F,~descriptor:Setup.Setup<S,R,P,Rest,E,Domains,F,path,inject,select,identity,make,sync,frame,retain,inventory,take,put>,~Owners:Type,~Request:Type,~Projection:Data,~Args:Type,~Error:Data,~at:P -> Request -> P & Projection,~body:@-H:Type -> @-read:Cap.Request<H,Request,Projection> -> H -> Args -> H & (T.Outcome<Error> & Args),runtime:Route.Runtime<S,C,R,E,FR.State<E,F,Owners>>,reader:Route.Reader<S,Nat,FR.State<E,F,Owners>,FR.take(~S,~Nat,~E,~F,~Owners,~take),FR.put(~S,~Nat,~E,~F,~Owners,~put)>,registry:Sys.Registry<S,C,R,E,Ev.Input<Nat,Args>,Unit,Core.Reply<Error,Args>,Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Error,~at,~body)>,args:Args,trace:Facts.State) -> Route.RunResult<S,C,R,E,Nat,FR.State<E,F,Owners>,Args,Unit,Core.Reply<Error,Args>,FR.take(~S,~Nat,~E,~F,~Owners,~take),FR.put(~S,~Nat,~E,~F,~Owners,~put),Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Error,~at,~body)> & Facts.State:
51 Core.run_traced(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Error,~at,~body,~FR.State<E,F,Owners>,~FR.take(~S,~Nat,~E,~F,~Owners,~take),~FR.put(~S,~Nat,~E,~F,~Owners,~put),~FR.synchronize(~S,~C,~R,~E,~F,~Owners,~sync),runtime,reader,registry,args,trace)
52# Return runtime and reader, moving an existing selected-stream position to the
53# current tick when namespace matches. Does not invoke body, activate a missing
54# position or retire actual payloads by itself.
55def skip(~S:Data,~C:Type,~R:Type,~P:Type,~Rest:Type,~E:Data,~Domains:Data,~F:Type,~path:Product.Lens<R,Log.Log<P>,Rest>,~inject:Nat -> E,~select:List<&2,E> -> List<&2,Nat>,~identity:Pub.Domain<S,P>,~make:Domains -> Nat -> F,~sync:F -> Nat -> List<&2,E> -> F,~frame:F -> Nat -> F,~retain:F -> Nat -> List<&2,E> -> F & List<&2,E>,~inventory:F -> F & List<&2,String>,~take:F -> F & Stream.Stream<S,Nat>,~put:F -> Stream.Stream<S,Nat> -> F,~descriptor:Setup.Setup<S,R,P,Rest,E,Domains,F,path,inject,select,identity,make,sync,frame,retain,inventory,take,put>,~Owners:Type,runtime:Route.Runtime<S,C,R,E,FR.State<E,F,Owners>>,reader:Route.Reader<S,Nat,FR.State<E,F,Owners>,FR.take(~S,~Nat,~E,~F,~Owners,~take),FR.put(~S,~Nat,~E,~F,~Owners,~put)>) -> Route.Runtime<S,C,R,E,FR.State<E,F,Owners>> & Route.Reader<S,Nat,FR.State<E,F,Owners>,FR.take(~S,~Nat,~E,~F,~Owners,~take),FR.put(~S,~Nat,~E,~F,~Owners,~put)>:
56 Life.skip(~S,~C,~R,~E,~FR.State<E,F,Owners>,~FR.take(~S,~Nat,~E,~F,~Owners,~take),~FR.put(~S,~Nat,~E,~F,~Owners,~put),runtime,reader)
57# Return runtime and a detached copy of the selected Nat-key Stream. Does not
58# advance a reader or expose/copy affine payload P; log ownership stays in World.
59def inspect(~S:Data,~C:Type,~R:Type,~P:Type,~Rest:Type,~E:Data,~Domains:Data,~F:Type,~path:Product.Lens<R,Log.Log<P>,Rest>,~inject:Nat -> E,~select:List<&2,E> -> List<&2,Nat>,~identity:Pub.Domain<S,P>,~make:Domains -> Nat -> F,~sync:F -> Nat -> List<&2,E> -> F,~frame:F -> Nat -> F,~retain:F -> Nat -> List<&2,E> -> F & List<&2,E>,~inventory:F -> F & List<&2,String>,~take:F -> F & Stream.Stream<S,Nat>,~put:F -> Stream.Stream<S,Nat> -> F,~descriptor:Setup.Setup<S,R,P,Rest,E,Domains,F,path,inject,select,identity,make,sync,frame,retain,inventory,take,put>,~Owners:Type,runtime:Route.Runtime<S,C,R,E,FR.State<E,F,Owners>>) -> Route.Runtime<S,C,R,E,FR.State<E,F,Owners>> & Stream.Stream<S,Nat>:
60 Life.inspect(~S,~C,~R,~E,~FR.State<E,F,Owners>,~FR.take(~S,~Nat,~E,~F,~Owners,~take),~FR.put(~S,~Nat,~E,~F,~Owners,~put),runtime)
61# Explicitly remove the validated registry and its reader position. Success returns
62# runtime; refusal retains runtime, reader and registry. Does not drain the payload
63# log or invoke an implicit payload destructor; retirement is separate maintenance.
64def dispose(~S:Data,~C:Type,~R:Type,~P:Type,~Rest:Type,~E:Data,~Domains:Data,~F:Type,~path:Product.Lens<R,Log.Log<P>,Rest>,~inject:Nat -> E,~select:List<&2,E> -> List<&2,Nat>,~identity:Pub.Domain<S,P>,~make:Domains -> Nat -> F,~sync:F -> Nat -> List<&2,E> -> F,~frame:F -> Nat -> F,~retain:F -> Nat -> List<&2,E> -> F & List<&2,E>,~inventory:F -> F & List<&2,String>,~take:F -> F & Stream.Stream<S,Nat>,~put:F -> Stream.Stream<S,Nat> -> F,~descriptor:Setup.Setup<S,R,P,Rest,E,Domains,F,path,inject,select,identity,make,sync,frame,retain,inventory,take,put>,~Owners:Type,~Request:Type,~Projection:Data,~Args:Type,~Error:Data,~at:P -> Request -> P & Projection,~body:@-H:Type -> @-read:Cap.Request<H,Request,Projection> -> H -> Args -> H & (T.Outcome<Error> & Args),runtime:Route.Runtime<S,C,R,E,FR.State<E,F,Owners>>,reader:Route.Reader<S,Nat,FR.State<E,F,Owners>,FR.take(~S,~Nat,~E,~F,~Owners,~take),FR.put(~S,~Nat,~E,~F,~Owners,~put)>,registry:Sys.Registry<S,C,R,E,Ev.Input<Nat,Args>,Unit,Core.Reply<Error,Args>,Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Error,~at,~body)>) -> Life.Disposal<S,C,R,E,FR.State<E,F,Owners>,Args,Unit,Core.Reply<Error,Args>,FR.take(~S,~Nat,~E,~F,~Owners,~take),FR.put(~S,~Nat,~E,~F,~Owners,~put),Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Error,~at,~body)>:
65 Life.dispose(~S,~C,~R,~E,~FR.State<E,F,Owners>,~FR.take(~S,~Nat,~E,~F,~Owners,~take),~FR.put(~S,~Nat,~E,~F,~Owners,~put),~Args,~Unit,~Core.Reply<Error,Args>,~Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Error,~at,~body),runtime,reader,registry)
66def synchronized(~S:Data,~C:Type,~R:Type,~E:Data,~F:Type,~Out:Type,tick:Nat,output:Out,returned:W.World<S,C,R,E> & F) -> Route.Runtime<S,C,R,E,F> & Out:
67 match returned:
68 case (world,family):(Route.Runtime{world,family,tick},output)
69def world_returned(~S:Data,~C:Type,~R:Type,~E:Data,~F:Type,~Owners:Type,~sync:F -> Nat -> List<&2,E> -> F,~Out:Type,state:FR.State<E,F,Owners>,+tick:Nat,returned:W.World<S,C,R,E> & Out) -> Route.Runtime<S,C,R,E,FR.State<E,F,Owners>> & Out:
70 match returned:
71 case (world,output):synchronized(~S,~C,~R,~E,~FR.State<E,F,Owners>,~Out,tick,output,FR.synchronize(~S,~C,~R,~E,~F,~Owners,~sync,world,state,tick))
72# Advanced World action adapter: return its actual World and Out, increment the
73# family tick and synchronize publications. Arbitrary action effects are trusted;
74# this is not a gameplay capability or implicit structural barrier.
75def with_world(~S:Data,~C:Type,~R:Type,~P:Type,~Rest:Type,~E:Data,~Domains:Data,~F:Type,~path:Product.Lens<R,Log.Log<P>,Rest>,~inject:Nat -> E,~select:List<&2,E> -> List<&2,Nat>,~identity:Pub.Domain<S,P>,~make:Domains -> Nat -> F,~sync:F -> Nat -> List<&2,E> -> F,~frame:F -> Nat -> F,~retain:F -> Nat -> List<&2,E> -> F & List<&2,E>,~inventory:F -> F & List<&2,String>,~take:F -> F & Stream.Stream<S,Nat>,~put:F -> Stream.Stream<S,Nat> -> F,~descriptor:Setup.Setup<S,R,P,Rest,E,Domains,F,path,inject,select,identity,make,sync,frame,retain,inventory,take,put>,~Owners:Type,~Out:Type,action:W.World<S,C,R,E> -> W.World<S,C,R,E> & Out,runtime:Route.Runtime<S,C,R,E,FR.State<E,F,Owners>>) -> Route.Runtime<S,C,R,E,FR.State<E,F,Owners>> & Out:
76 match runtime:
77 case Route.Runtime{world,state,tick}:world_returned(~S,~C,~R,~E,~F,~Owners,~sync,~Out,state,1n+tick,action(world))
78# Advance family frame/retention, then retire payloads no longer represented by
79# the retained publications through the complete typed catalog. Return actual
80# retirement Receipt with runtime; no affine payload is copied into stream metadata.
81def frame(~S:Data,~C:Type,~User:Type,~Logs:Type,~P:Type,~Rest:Type,~E:Data,~Domains:Data,~F:Type,~path:Product.Lens<Product.Owner<User,Logs>,Log.Log<P>,Rest>,~inject:Nat -> E,~select:List<&2,E> -> List<&2,Nat>,~identity:Pub.Domain<S,P>,~make:Domains -> Nat -> F,~sync:F -> Nat -> List<&2,E> -> F,~frame:F -> Nat -> F,~retain:F -> Nat -> List<&2,E> -> F & List<&2,E>,~inventory:F -> F & List<&2,String>,~take:F -> F & Stream.Stream<S,Nat>,~put:F -> Stream.Stream<S,Nat> -> F,~descriptor:Setup.Setup<S,Product.Owner<User,Logs>,P,Rest,E,Domains,F,path,inject,select,identity,make,sync,frame,retain,inventory,take,put>,~Owners:Type,~Receipt:Type,~retire:Logs -> List<&2,E> -> Logs & Receipt,~drain:Logs -> Logs & Receipt,~clear:F -> F,~catalog:Catalog.Catalog<E,Logs,F,Receipt,retire,drain,clear>,runtime:Route.Runtime<S,C,Product.Owner<User,Logs>,E,FR.State<E,F,Owners>>) -> Route.Runtime<S,C,Product.Owner<User,Logs>,E,FR.State<E,F,Owners>> & Receipt:
82 Maintenance.frame(~S,~C,~User,~Logs,~E,~F,~Owners,~Receipt,~retire,~drain,~clear,~catalog,~frame,~retain,runtime)
83# Drain all catalogued owned logs into an actual Receipt and clear family stream/
84# publication state. Retain runtime owners; this is not disposal of every registry
85# or an automatic host cleanup callback. See docs/parity/affine-events.md.
86def shutdown(~S:Data,~C:Type,~User:Type,~Logs:Type,~P:Type,~Rest:Type,~E:Data,~Domains:Data,~F:Type,~path:Product.Lens<Product.Owner<User,Logs>,Log.Log<P>,Rest>,~inject:Nat -> E,~select:List<&2,E> -> List<&2,Nat>,~identity:Pub.Domain<S,P>,~make:Domains -> Nat -> F,~sync:F -> Nat -> List<&2,E> -> F,~frame:F -> Nat -> F,~retain:F -> Nat -> List<&2,E> -> F & List<&2,E>,~inventory:F -> F & List<&2,String>,~take:F -> F & Stream.Stream<S,Nat>,~put:F -> Stream.Stream<S,Nat> -> F,~descriptor:Setup.Setup<S,Product.Owner<User,Logs>,P,Rest,E,Domains,F,path,inject,select,identity,make,sync,frame,retain,inventory,take,put>,~Owners:Type,~Receipt:Type,~retire:Logs -> List<&2,E> -> Logs & Receipt,~drain:Logs -> Logs & Receipt,~clear:F -> F,~catalog:Catalog.Catalog<E,Logs,F,Receipt,retire,drain,clear>,runtime:Route.Runtime<S,C,Product.Owner<User,Logs>,E,FR.State<E,F,Owners>>) -> Route.Runtime<S,C,Product.Owner<User,Logs>,E,FR.State<E,F,Owners>> & Receipt:
87 Maintenance.shutdown(~S,~C,~User,~Logs,~E,~F,~Owners,~Receipt,~retire,~drain,~clear,~catalog,runtime)
88
89# Advanced context-preserving trace bridge to run, returning context, actual family
90# state/reader/registry and reply through ContextRunResult. No new payload authority.
91def run_context(~S:Data,~C:Type,~R:Type,~P:Type,~Rest:Type,~E:Data,~Domains:Data,~F:Type,~path:Product.Lens<R,Log.Log<P>,Rest>,~inject:Nat -> E,~select:List<&2,E> -> List<&2,Nat>,~identity:Pub.Domain<S,P>,~make:Domains -> Nat -> F,~sync:F -> Nat -> List<&2,E> -> F,~frame:F -> Nat -> F,~retain:F -> Nat -> List<&2,E> -> F & List<&2,E>,~inventory:F -> F & List<&2,String>,~take:F -> F & Stream.Stream<S,Nat>,~put:F -> Stream.Stream<S,Nat> -> F,~descriptor:Setup.Setup<S,R,P,Rest,E,Domains,F,path,inject,select,identity,make,sync,frame,retain,inventory,take,put>,~Owners:Type,~Request:Type,~Projection:Data,~Args:Type,~Error:Data,~at:P -> Request -> P & Projection,~body:@-H:Type -> @-read:Cap.Request<H,Request,Projection> -> H -> Args -> H & (T.Outcome<Error> & Args),context:Ctx.Context<W.World<S,C,R,E>>,family:FR.State<E,F,Owners>,tick:Nat,reader:Route.Reader<S,Nat,FR.State<E,F,Owners>,FR.take(~S,~Nat,~E,~F,~Owners,~take),FR.put(~S,~Nat,~E,~F,~Owners,~put)>,registry:Sys.Registry<S,C,R,E,Ev.Input<Nat,Args>,Unit,Core.Reply<Error,Args>,Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Error,~at,~body)>,args:Args) -> Route.ContextRunResult<S,C,R,E,Nat,FR.State<E,F,Owners>,Args,Unit,Core.Reply<Error,Args>,FR.take(~S,~Nat,~E,~F,~Owners,~take),FR.put(~S,~Nat,~E,~F,~Owners,~put),Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Error,~at,~body)>:
92 match context:
93 case Ctx.Context{world,trace}:Route.context_returned(~S,~C,~R,~E,~Nat,~FR.State<E,F,Owners>,~Args,~Unit,~Core.Reply<Error,Args>,~FR.take(~S,~Nat,~E,~F,~Owners,~take),~FR.put(~S,~Nat,~E,~F,~Owners,~put),~Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Error,~at,~body),Core.run_traced(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Error,~at,~body,~FR.State<E,F,Owners>,~FR.take(~S,~Nat,~E,~F,~Owners,~take),~FR.put(~S,~Nat,~E,~F,~Owners,~put),~FR.synchronize(~S,~C,~R,~E,~F,~Owners,~sync),Route.Runtime{world,family,tick},reader,registry,args,trace))
94
95# Register a confined reader and wrap its actual reader/registry with the matching
96# ordinary event-domain declaration for App metadata. No body invocation occurs.
97def register_app(~S:Data,~C:Type,~R:Type,~P:Type,~Rest:Type,~E:Data,~Domains:Data,~F:Type,~path:Product.Lens<R,Log.Log<P>,Rest>,~inject:Nat -> E,~select:List<&2,E> -> List<&2,Nat>,~identity:Pub.Domain<S,P>,~make:Domains -> Nat -> F,~sync:F -> Nat -> List<&2,E> -> F,~frame:F -> Nat -> F,~retain:F -> Nat -> List<&2,E> -> F & List<&2,E>,~inventory:F -> F & List<&2,String>,~take:F -> F & Stream.Stream<S,Nat>,~put:F -> Stream.Stream<S,Nat> -> F,~descriptor:Setup.Setup<S,R,P,Rest,E,Domains,F,path,inject,select,identity,make,sync,frame,retain,inventory,take,put>,~Owners:Type,~Request:Type,~Projection:Data,~Args:Type,~Error:Data,~at:P -> Request -> P & Projection,~body:@-H:Type -> @-read:Cap.Request<H,Request,Projection> -> H -> Args -> H & (T.Outcome<Error> & Args),runtime:Route.Runtime<S,C,R,E,FR.State<E,F,Owners>>,name:String) -> AppReader.Registration<S,C,R,E,Nat,FR.State<E,F,Owners>,Args,Unit,Core.Reply<Error,Args>,FR.take(~S,~Nat,~E,~F,~Owners,~take),FR.put(~S,~Nat,~E,~F,~Owners,~put),Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Error,~at,~body)>:
98 AppReader.registered(~S,~C,~R,~E,~Nat,~FR.State<E,F,Owners>,~Args,~Unit,~Core.Reply<Error,Args>,~FR.take(~S,~Nat,~E,~F,~Owners,~take),~FR.put(~S,~Nat,~E,~F,~Owners,~put),~Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Error,~at,~body),Event.read(~S,~Nat,Setup.domain(~S,~P,identity)),Core.register(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Error,~at,~body,~FR.State<E,F,Owners>,~FR.take(~S,~Nat,~E,~F,~Owners,~take),~FR.put(~S,~Nat,~E,~F,~Owners,~put),runtime,name))
99
100# Install onto an ordinary family App. done receives the extended actual owners;
101# failed receives the prior App shape with returned runtime on admission refusal.
102# Preserves prior observers/debug and adds metadata, not a new gameplay payload grant.
103def install(~S:Data,~C:Type,~R:Type,~P:Type,~Rest:Type,~E:Data,~Domains:Data,~F:Type,~path:Product.Lens<R,Log.Log<P>,Rest>,~inject:Nat -> E,~select:List<&2,E> -> List<&2,Nat>,~identity:Pub.Domain<S,P>,~make:Domains -> Nat -> F,~sync:F -> Nat -> List<&2,E> -> F,~frame:F -> Nat -> F,~retain:F -> Nat -> List<&2,E> -> F & List<&2,E>,~inventory:F -> F & List<&2,String>,~take:F -> F & Stream.Stream<S,Nat>,~put:F -> Stream.Stream<S,Nat> -> F,~descriptor:Setup.Setup<S,R,P,Rest,E,Domains,F,path,inject,select,identity,make,sync,frame,retain,inventory,take,put>,~Owners:Type,~Request:Type,~Projection:Data,~Args:Type,~Error:Data,~at:P -> Request -> P & Projection,~body:@-H:Type -> @-read:Cap.Request<H,Request,Projection> -> H -> Args -> H & (T.Outcome<Error> & Args),~Previous:Type,~Rows:Data,~prior:W.World<S,C,R,E> -> W.World<S,C,R,E> & DTO.Observation<Rows>,~fold:Previous -> Previous & List<&2,Records.Fields<S>>,~Output:Type,done:AppReader.Application(~S,~C,~R,~E,~Nat,~FR.State<E,F,Owners>,~Args,~Unit,~Core.Reply<Error,Args>,~FR.take(~S,~Nat,~E,~F,~Owners,~take),~FR.put(~S,~Nat,~E,~F,~Owners,~put),~Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Error,~at,~body),~Previous,~Rows,~prior,~fold) -> Output,failed:App.Application<S,C,R,E,FR.State<E,F,Owners>,Previous,Rows,prior,fold> -> Output,value:App.Application<S,C,R,E,FR.State<E,F,Owners>,Previous,Rows,prior,fold>,name:String) -> Output:
104 match value:
105 case App.Application{schema,runtime,previous,recipe,debug}:AppReader.installed(~S,~C,~R,~E,~Nat,~FR.State<E,F,Owners>,~Args,~Unit,~Core.Reply<Error,Args>,~FR.take(~S,~Nat,~E,~F,~Owners,~take),~FR.put(~S,~Nat,~E,~F,~Owners,~put),~Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Error,~at,~body),~Previous,~Rows,~prior,~fold,~Output,done,failed,schema,previous,recipe,debug,register_app(~S,~C,~R,~P,~Rest,~E,~Domains,~F,~path,~inject,~select,~identity,~make,~sync,~frame,~retain,~inventory,~take,~put,~descriptor,~Owners,~Request,~Projection,~Args,~Error,~at,~body,runtime,name))