# 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)