promptdojo_promptdojo_promptdojo_promptdojo_promptdojo_promptdojo_promptdojo_promptdojo_promptdojo_promptdojo_promptdojo_

The SOP is data — get the process out of Vera's head without letting the model invent it — step 7 of 8

Finish lint_sop(sop) — the check you already read and filled. An SOP is the written steps for a recurring job. This function is the gate every SOP passes before it ships. The shape is on the page; fill the two checks. It returns a list of reason strings, in this order:

  1. If sop["owner"] is falsy → "no owner"
  2. Then for each step, in order, check both rules on that step:
    • source == "model-filled" and not verifiedf"step {n} unverified model fill"
    • safety is truthy and safety_reviewed is not (use .get("safety_reviewed") — most steps don't have the key) → f"step {n} safety step unreviewed"

The call site prints READY for an empty list, else BLOCKED — with reasons joined by "; ".

Expected output:

sop-receiving: READY
sop-stuck-orders: BLOCKED — step 3 unverified model fill
sop-hazmat-intake: BLOCKED — no owner; step 2 safety step unreviewed

full-screen editor opens — close anytime to keep reading.