# Experience review 48 ## What made you smile? We created a rule for missed outputs for Arazzo files, which we wouldn't have done this issue. ```js export default () => ({ id: "x-security", rules: { arazzo1: { "step-outputs": () => { let steps = {}; return { Workflow: { enter: () => { steps = {}; }, Step: { enter: (step, ctx) => { steps[step.stepId] = step; }, leave: (step, ctx) => { step["x-security"].forEach((security, index) => { const { values, scheme } = security; for (const key in values) { const value = values[key]; if (value.startsWith("$steps.")) { const [, stepName, maybeOutputs, outputName] = value.split("."); if ( maybeOutputs === "outputs" && steps[stepName].outputs?.[outputName] === undefined ) { ctx.report({ message: `"${outputName}" output is not defined at step "${stepName}".`, location: ctx.location .child("x-security") .child(index) .child("values") .child(key), }); } } } for (const key in scheme) { const value = scheme[key]; if (value.startsWith("$steps.")) { const [, stepName, maybeOutputs, outputName] = value.split("."); if ( maybeOutputs === "outputs" && steps[stepName].outputs?.[outputName] === undefined ) { ctx.report({ message: `"${outputName}" output is not defined at step "${stepName}".`, location: ctx.location .child("x-security") .child(index) .child("scheme") .child(key), }); } } } }); }, }, }, }; }, }, }, }); ``` ```yaml extends: - recommended plugins: - x-security.mjs rules: x-security/step-outputs: error ``` But overall, the features work wonderfully. Good job! ## What did you find confusing? 1. Missed validation for outputs in Arazzo. We forgot to add outputs to the previous step, and we didn't receive an error about that. Instead, we received a missed required value error. image copy 13.png image copy 14.png