for each nested or piped function pair { check that the output type matches the required input types of the next }
if options.log then { log results to chat }
return true if they all validate or false if they don't
Log
If options.log, print the pipeline in source order: initial value, then each /skill exactly as many times as it appears in the expression. Never add or omit a /skill that is not in the source.
Between steps: After a literal or /skill, before the next /skill, print one indented line:
- OK — the type leaving the producer toward the next step.
- Fail — only
<output> != <input>(what the producer emitted vs what the next step requires). No separate line for the output type alone; the mismatch line is the whole message between that pair.
Put that line after the producer (literal or /skill) and before the consumer’s /skill. Never put the failure summary under the consumer.
After the first rejection, list remaining /skill lines from the source; each gets — as its only indented line (unreachable).
Examples
2 | /x-double |> /x-double |> /x-log
2 number /x-double number /x-double number /x-log
"foo" | /x-double |> /x-double |> /x-log
"foo" string != number /x-double — /x-double — /x-log —
12 | /x-double |> /x-alpha |> /x-double |> /x-log
12 number /x-double number /x-alpha string != number /x-double — /x-log —