# Runtime Manifest Call Flow
**on the host**
porter client -> porter install
**inside the container**
invocation image -> porter run
**inside porter runtime binary**
parses the porter.yaml and makes Steps
**FOR EACH STEP**
convert the step for the current mixin into a snippet of yaml
resolve the step template using the most recent template values (including outputs from the other steps)
porter runtime -> mixin install (STDIN = the yaml snippet)
**inside the mixin binary**
parses the snippet of porter.yaml for its step, unmarshal onto their Action which is an ExecutableStep interface
mixin calls the pkg/exec/builder library, builder.ExecuteSingleStepAction
**inside the builder library**
casts the ExecutableStep to a bunch of tiny interfaces to know what is supported (collecting ouputs, how to pass arguments)
cast it to HasOrderedArguments, etc
<run the command in the porter.yaml for that step>
cast it to HasStepOutputs
try to cast to OutputJsonPath, and scrape the json output (repeat for each type of output)
writes the outputs to /cnab/app/porter/outputs (step outputs)
**back inside the porter runtime binary**
we look for step outputs in /cnab/app/porter/outputs
remember the output values in memory in the RuntimeManifest
we cleanup the step outputs folder before the next step
we promote any step outputs to bundle outputs as defined (copy to /cnab/app/outputs) NOTE: last step wins and its value is the bundle output value
repeat for next step (goes back to FOR EACH STEP)